1. 环境准备:Python与PyCharm安装全流程
1.1 先把Python解释器装明白
很多新手上来就纠结“装Python还是装Anaconda”,我直接说结论:纯入门阶段,装官方Python就够了,Anaconda那一套等你要做数据处理、科学计算时再补不迟。官方安装包干净、可控,也没那么多虚拟环境的概念要理解,等你有需求了自然知道什么时候该用conda。
去Python官网下载安装包时,有几个细节必须注意。Windows用户一定要勾选Add Python to PATH这个选项,这是无数新手后面踩坑的根源。很多人装完发现命令行里输入python没反应,基本就是这一步没勾上。勾选之后,系统会把Python的可执行文件路径写进环境变量,这样你在任何目录下打开终端都能直接用python命令。
安装路径我建议用默认的,或者自己记清楚装到哪里了,因为后面配置PyCharm解释器时要用到。还有个细节是Windows上有个Install for all users的选项,建议勾上,权限问题少一些。Mac用户相对省心,官网下载pkg包一路下一步就行,或者你如果装了Homebrew,直接brew install python也干净利落。
装完之后验证一下。Windows打开PowerShell或CMD,Mac打开终端,输入:
python --version能输出版本号比如Python 3.12.x,就说明环境OK了。这里多说一句,如果提示python不是内部或外部命令,但/usr/bin/python3能出版本号,通常是环境变量没配好。Windows用户可以去“环境变量”设置里手动把Python的安装目录和Scripts目录加进去,不会的话直接重装一遍、这次记得勾PATH选项,反而最省事。
1.2 PyCharm安装与首次启动配置
编辑器这块,本质上你用记事本也能写Python,但开发效率差太多了。PyCharm是我最早用、也一直没换过的IDE,社区版完全免费,功能对入门和中小型项目来说绰绰有余。官网下载时看清楚选Community版本,别下成Professional——专业版是收费的,而且很多功能入门阶段根本用不上。
下载完之后有个小细节:Windows安装时会有个选项叫Add launchers dir to the PATH和Create associations,建议都勾上,这样以后双击.py文件可以直接用PyCharm打开,命令行里也能用charm命令唤起。安装完成后首次启动会问你导入设置,选Don't Import Settings就行,除非你之前用过想保留配置。
进到欢迎界面,第一件事是配置解释器。这一步很多人的操作顺序错了。正确路径是:新建项目时,在项目设置里选Previously configured interpreter,然后手动添加。点右上角的齿轮或设置图标,找到 Add Interpreter,选择你刚装好的Python路径。Windows默认一般在C:\Users\你的用户名\AppData\Local\Programs\Python\Python312\python.exe,Mac一般在/usr/local/bin/python3或你安装时的路径。
如果新建项目时不小心选了默认的虚拟环境,也不用慌。进到项目里,File → Settings → Project → Python Interpreter,点齿轮选Add,重新指定解释器就行。新手最容易搞混的就是这里——项目里显示有红色波浪线报错、或者按运行按钮没反应,八成就是解释器没配对。
首次启动PyCharm还会建议你装一些插件。入门阶段我建议只装一个Chinese Language Pack,把界面变成中文减少挫败感。其他什么数据库工具、前端框架的插件,等你真正用到再装,别一把梭哈全装上,浪费时间还拖慢启动速度。
1.3 虚拟环境:现在就该养成的好习惯
虽然我前面说入门别碰Anaconda,但PyCharm自带的虚拟环境功能你应该早点用起来。虚拟环境其实就是把某个项目依赖的包隔离在独立目录里,不同的项目可以用不同版本的库,互不干扰。
PyCharm新建项目时默认就会帮你创建一个venv(虚拟环境),很多人不知道这是啥,以为是自己装坏了。实际上这是好事。你看项目文件夹里多了个.venv或venv目录,这个目录就是当前项目的专属解释器环境。以后你用pip安装的第三方库,默认都装到这个虚拟环境里,不会污染全局Python。
现在你不需要深入理解虚拟环境的原理,但要习惯这个存在。后面我们定时安装requests、flask这些包时,直接写在PyCharm底部的Terminal里敲命令,它会自动用虚拟环境的pip来装。如果你用系统终端pip安装后,PyCharm里还是找不到模块,先检查一下终端激活的到底是哪个环境。
2. 第一个Python程序:从Hello World到运行原理
2.1 用PyCharm创建并运行你的第一段代码
环境弄好之后,我们来写第一行代码。打开PyCharm,新建项目,项目名字我建议直接叫python_basics,尽量用英文,后面你写代码文件路径里出现中文虽然技术上能跑,但时不时蹦出编码问题,没必要冒这个险。
项目建好之后,在左侧的项目目录树上右键 → New → Python File,文件名就叫hello。PyCharm会自动帮你加上.py后缀,然后编辑器打开一个空文件。在文件里敲入三行:
print("Hello, World!") print("你好,Python!") print(1 + 2)写完之后,点编辑器右上角的绿色三角运行按钮,或者直接右键选Run 'hello',底部会弹出Run面板。你会看到三行输出:Hello, World!、你好,Python!和3。
这时候有个小细节我要特别讲一下。第二行输出了中文,如果控制台显示乱码或者直接报SyntaxError: Non-UTF-8 code,不是你的代码有问题,是文件编码设置不对。PyCharm默认用UTF-8编码保存文件,一般不会出问题,但万一碰上了,去 File → Settings → Editor → File Encodings,把 Global Encoding 和 Project Encoding 都改成 UTF-8,就彻底解决了。
2.2 print本质是函数调用,不是语法关键字
新手对print最常见的误解是把它当成“输出语句”,就像C语言的printf一样。但实际上在Python 3里,print是一个内建函数,函数就可以接收参数、有返回值、可以被赋值给别的变量。理解这一点对你看别人代码很有帮助,因为你会看到各种print的奇怪用法,都是因为它本质是函数。
我们刚才写的print("Hello, World!")就是调用print函数,传入一个字符串参数,函数的作用是把内容输出到标准输出设备(通常是屏幕)。这个过程其实做了两件事:把内容转成可读的文本形式,然后在末尾加上换行符\n。
这个“末尾自动加换行”的行为是print的一个默认参数控制的,叫end。你可以用print("Hello", end=" ")把结尾换成空格,这样连续两个print就会输出在同一行。类似的还有sep参数,控制多个参数之间的分隔符。这两个参数到第3节再详细展开,现在你只需要记住:print是个函数,它的行为有很多参数可以调节,默认只帮你做了换行这件事。
2.3 代码是从上往下执行的
你可能注意到我们写了三行print,运行结果就是按顺序输出的。这是因为Python是一种解释型脚本语言,代码按照从上到下的顺序逐行执行。这里你可以做个实验:写一行print("第一行"),再写一行print("第二行"),运行一下就明白了,输出的顺序永远和代码的书写顺序一致。
这个“从上到下执行”看起来很傻,但实际上是我们理解程序逻辑的基础。后面学到变量、条件判断、循环时,你就要在脑子里模拟这个执行顺序:程序走到哪一行了?当前变量的值是多少?很多bug其实就是在脑子里跟着代码走一遍就能发现的。
再扩展一个概念:注释。注释是写给程序员看的,Python解释器会直接忽略它。用井号开头写注释是Python的标准做法:
# 这是注释,不会被执行 print("这是真实要运行的代码")我建议你从第一天开始就养成写注释的习惯,不用写多,一两句说明这一块代码在干嘛就行。一个月的代码你可能还记得,三个月的代码你真的会怀疑是不是自己写的。
3. 输入输出全解析:打通程序与用户的桥梁
3.1 print函数的完整用法:sep和end参数
我见过太多教程一句话带过print的两个关键参数,导致新手看到一个print(1, 2, 3, sep="-")直接懵了。这里我把print函数完整拆开讲。
print函数最常见的用法就是接收多个参数,然后依次输出并用空格隔开。比如:
print("今天", "天气", "很好")输出的结果是今天 天气 很好,中间的空格就是默认的sep参数值。如果你想让中间换成别的分隔符,就手动指定:
print("2025", "01", "15", sep="-")输出2025-01-15,这比用字符串拼接再输出要优雅得多。尤其是后面你写爬虫时处理URL参数、写脚本时拼接路径,用sep能省不少代码量。
end参数控制的是输出行末尾以什么结束。默认是换行符,所以每次print之后光标就跑到下一行了。你可以在一个循环里用end=""实现不换行输出所有内容:
for i in range(5): print(i, end=" ")输出就是0 1 2 3 4,所有数字在同一行。还有更进阶的玩法,结合\r回车符能实现一行内刷新进度条效果,这个我们以后讲到文件下载或爬虫任务进度时再细说。
3.2 input函数:程序主动等待用户输入
如果说print是程序的嘴巴,那input就是程序的耳朵。input函数会让程序暂停执行,等待用户在控制台输入内容并按下回车键,然后把你输入的内容作为字符串返回。
基本用法:
name = input("请输入你的名字:") print("你好," + name)这里有个非常关键的细节:input返回的一定是字符串。不管你在控制台输入的是数字、汉字、还是字母,input统统按照字符串处理。如果你输入了18,得到的是字符串"18",不是整数18。这两个东西看起来一样,但一个是文本,一个是数字,不能直接参与加减乘除运算。
我见过太多新手在第一周就遇到这个问题:写了age = input("请输入年龄:"),然后print(age + 1),程序直接报TypeError: can only concatenate str (not "int") to str。有些人就开始怀疑是不是自己写错了语法,其实问题是类型不匹配——想让字符串变成数字,得用类型转换。
3.3 类型转换:int、float、str的三兄弟使用手册
类型转换是Python入门绕不开的操作,也是输入输出环节最容易出错的地方。因为input拿到的是字符串,而运算需要的是数字,中间必须有个转换环节。
最常用的三个转换函数:
int("18") # 字符串转整数,结果是18 float("3.14") # 字符串转小数,结果是3.14 str(18) # 数字转字符串,结果是"18"记住这三个方向就够了。实际写业务代码时,最常见的组合是:
age_str = input("请输入你的年龄:") # 拿到的是字符串"18" age_int = int(age_str) # 转换成整数18 next_year_age = age_int + 1 # 这样就能做加法了 print("明年你" + str(next_year_age) + "岁")如果你想把上面的print写得更好看一点,可以用f-string(格式化字符串),这是Python 3.6之后引入的语法,本质是用{}在字符串中嵌入变量:
print(f"明年你{next_year_age}岁")f-string我用得非常多,说实话纯字符串拼接 + 加号,写起来麻烦,看起来也乱。f-string不仅简洁,还支持在花括号里写表达式,比如{age_int + 1}直接写在字符串里,完全合法。
再说一个类型转换的坑:int("18.5")会报错。int函数只能把纯数字字符串转成整数,带小数点的字符串必须先转float再转int,或者直接用float。同理,int("abc")也会报ValueError。所以真实业务中,用户输入的内容你根本不知道是什么,转换前一定要判断字符串是否真的是数字。最简单的方式是用字符串的isdigit()方法,只有全由数字组成的字符串才返回True。
3.4 多数据输入:一行读取多个值的常用套路
很多人学到输入输出就想做点有交互性的小程序,比如计算两个数的和。这时就遇到问题了:input一次只能读一行,怎么让用户一次输入两个数字?
我推荐三个常用方案,从简单到优雅排列。
方案一是直接在一行输入,用split分割后逐个转换:
a, b = input("请输入两个数字,用空格分隔:").split() a = int(a) b = int(b) print(f"两数之和是:{a + b}").split()默认按空白字符(空格、Tab)分割,正好适配“空格分隔”的输入习惯。这方法简单直观,但如果用户多输入了一个空格,或者忘了加空格直接写了1217,程序就会报错或者计算出错。
方案二是用map函数批量转换,代码更简洁:
a, b = map(int, input("请输入两个数字:").split()) print(f"两数之和是:{a + b}")map的意思是对可迭代对象中的每个元素执行同一个函数,这里就是对split出来的每个字符串执行int转换。这行代码干了方案一四行的工作,但是可读性差一点,新手一眼看过去不一定能理解。建议先会方案一,再过渡到方案二。
方案三是防御式写法,适合做练习题时保证能正确读取:
nums = input("请输入两个数字:").split() if len(nums) == 2 and nums[0].isdigit() and nums[1].isdigit(): a, b = int(nums[0]), int(nums[1]) print(f"两数之和是:{a + b}") else: print("输入格式不正确,请用空格分隔两个数字。")方案三用上了isdigit()判断和len()验证,是为了让你明白一件事:处理用户输入时,永远要假设用户会输入你意想不到的东西。程序员的自我修养之一,就是写出不会因为用户乱输入就崩溃的代码。
3.5 实战案例:做一个简易BMI计算器
学了输入、类型转换、f-string,我们来做一个真正有点用的小程序:BMI计算器。
BMI的计算公式是体重(公斤)除以身高(米)的平方。我们先写一版最简单的:
weight = float(input("请输入你的体重(公斤):")) height = float(input("请输入你的身高(米):")) bmi = weight / (height ** 2) print(f"你的BMI是:{bmi:.2f}")这里有两个小考点。身高和体重可能是小数,所以用float而不是int转换。f-string里{bmi:.2f}的意思是把这个数字保留两位小数输出,比先round再拼字符串省事。
运行一下,输入体重70、身高1.75,会得到你的BMI是:22.86。程序比之前的“两数求和”有了实用性,但你有没有发现一个问题?如果用户输入身高时用了厘米160,而不是1.6,结果就完全错了。这时候程序需要做的就是给用户更明确的指引,或者代码内部做一个单位转换。比如:
height_cm = float(input("请输入你的身高(厘米):")) height = height_cm / 100这就是真实项目里的边界情况处理思路:你不能假设用户会按你的预期输入,所以要么把预期写得很清楚,要么在代码里兼容各种输入方式。
进阶一点,可以加入简单的胖瘦判断:
if bmi < 18.5: print("偏瘦") elif bmi < 24: print("正常") elif bmi < 28: print("偏胖") else: print("肥胖")这行if判断会用到后面章节的逻辑控制,你现在读一读大概能猜到意思:从上到下依次对比,遇到第一个为真的条件就执行对应代码。到这里,你已经用Python实现了一个完整的、有交互的、有实际用途的小工具。从这个点继续往下学,你会越走越顺。
4. 常见问题与排查技巧实录
4.1 安装与运行高频报错速查表
我自己带过不少新人,把他们在环境安装和运行第一个程序时最常见的问题整理成了一张表,你遇到了直接对照排查。
| 问题现象 | 核心原因 | 解决方案 |
|---|---|---|
python不是内部或外部命令 | 安装时没勾Add to PATH | 重新安装并勾选,或手动配置环境变量 |
| PyCharm运行按钮是灰色 | 没有配置解释器 | Settings → Project → Python Interpreter → Add Interpreter |
| print中文显示乱码 | 控制台编码不是UTF-8 | 设置File Encodings为UTF-8,或换现代终端 |
ModuleNotFoundError | pip安装的包进错了环境 | 确认终端激活的是当前项目的venv虚拟环境 |
| 程序运行一闪而过 | 双击.py文件时Python运行完就退出 | 用PyCharm运行,或终端手动执行python 文件.py |
SyntaxError: invalid character | 输入了中文标点或全角空格 | 检查代码中的括号、引号是否为英文半角符号 |
4.2 关于播放器一样的终端窗口:我看到结果就消失了
这个现象特别典型,Windows用户双击 .py 文件时,Python运行完程序后终端窗口会立刻关闭,你根本来不及看输出结果。有些人以为是自己代码写错了,其实只是没有控制台窗口停留的机制。
解决方法有三个。第一,用PyCharm运行,结果输出在IDE底部的Run面板,这个面板不会自动关闭。第二,用命令行窗口手动运行:在项目目录按住Shift+右键,选择“在终端中打开”,输入python hello.py,窗口会保留到你看完为止。第三,如果你就是想双击运行,可以在代码末尾加一行:
input("按回车键退出...")程序运行到这一行会停下来等用户输入,窗口就不会闪退了。这个方法我在做小工具给非技术人员用时经常用——他们不会命令行,双击就得能跑,这个input兜底法屡试不爽。
4.3 关于“打印的内容是乱码”的香港旧事
有个情况我现在偶尔还会碰到,就是Windows的CMD或者老版本的PowerShell默认编码是GBK,而你的代码是UTF-8保存的,两者对不上就会出现乱码。Python 3.7以后Windows上print中文到控制台已经很少出问题了,但如果还碰上,老规矩:在代码文件最顶部加上:
# -*- coding: utf-8 -*-这一行是声明源文件的编码格式。虽然Python 3默认就用UTF-8解读源码,写上它主要是告诉老版本环境和阅读你代码的人“这个文件的编码是UTF-8”,属于防御性写法。真正要解决控制台乱码,还是要改终端的代码页:
chcp 65001这是Windows下把代码页切换到UTF-8的命令。我在写自动化脚本时经常在脚本开头处理这个问题,经验是:能不用中文输出就不用,非用不可的时候就统一用UTF-8编码标准,并且控制台也改成65001。
4.4 关于PyCharm慢了卡了:关掉没用的检查
用PyCharm写几周代码,你会发现软件越来越卡。这不是Python的问题,也不是你电脑不行,而是PyCharm开启了太多代码检查插件。我整理了几个最管用的优化设置。
一是File → Settings → Editor → Inspections,默认勾了一堆你可能用不到的检查项,比如误以为你是Django项目、JS项目做的检查。入门阶段把能关的都关掉,只保留Python相关的核心检查。二是Settings → Appearance & Behavior → System Settings → Updates,把自动更新关掉,PyCharm版本更新经常导致索引重建,卡到怀疑人生。三是定期 File → Invalidate Caches,清理索引缓存,如果哪天PyCharm的右键菜单异常、跳转失灵,这个操作能解决大部分问题。
还有一个使用习惯的问题:别一次用PyCharm打开太多项目。很多人图方便,把之前写过的东西都塞进同一个窗口,最后Project面板几千个文件,每次输入都卡。建议一个窗口只开一个项目,其他项目用File → Open打开新窗口。这个习惯看着小,你写三个月之后就知道对大项目的启动速度影响多大了。
5. 全栈视角下的输入输出:它比你想象得更重要
5.1 为什么Web和后端开发也离不开输入输出
看到这里你可能觉得:print和input这么基础,跟全栈开发有什么关系?其实全栈里后端接口处理数据的前两步,本质就是你今天学的输入输出。后端接口接收前端的请求参数,这一步就是“输入”,后端处理完数据返回给前端,这一步就是“输出”。只不过在网络场景下,输入输出的媒介不是终端窗口,而是HTTP请求和JSON响应。
你以后写Flask或Django时,第一节课的代码八成是:
from flask import Flask, request app = Flask(__name__) @app.route("/user", methods=["POST"]) def create_user(): name = request.form["name"] # 输入 age = request.form["age"] # 输入 return {"name": name, "age": age} # 输出你看,本质上还是拿到用户的输入(request里的参数),做些处理,再返回结果。今天学的input拿到的是用户在控制台敲的字符串,上面拿到的是前端传来的表单数据,底层思路完全一致。
所以不管你以后想做数据、做后端、做爬虫还是做自动化办公,“输入→处理→输出”这个核心模型都是相通的。今天打好这个底子,后面学Web框架时你会轻松很多。
5.2 跟着这个系列,你的全栈学习地图应该长什么样
这个系列叫“Python全栈入门到实战”,现在做到基础篇03,我顺便把整个地图给你画出来,让你心里有个底。
第一阶段是语言基础,就是现在在做的内容:变量、类型、控制流、函数、文件操作、异常处理。这些内容大概需要20-30个学时,学完的检验标准是:你不用看教程就能独立写一个命令行版的待办事项管理工具。
第二阶段是核心库与工具链:pip包管理、模块化开发、常用的标准库比如os、json、datetime、正则表达式。同时这里应该开始接触面向对象编程,理解类和对象是怎么把一堆相关数据和操作打包在一起的。
第三阶段是Web开发与数据交互:Flask或FastAPI入手,写RESTful API,连接MySQL或SQLite数据库,做一个有用户注册登录的完整后台。到这里恭喜你,你已经能用Python独立完成一个简单的全栈应用了。我自己的经验是,第二阶段到第三阶段之间有个最大的坎——从“会写脚本”到“会写项目”,这个跨越需要通过一个完整的项目实战来练手,光看不写是永远过不去的。
后面我们这个系列也会带你完整走一遍:从一个空白文件夹开始,到最后部署上线,做一个前后端都包含的真实项目。别急,先把今天这关过了。
5.3 给新手的每日练习清单
我以前教过一个完全零基础的朋友,他最大的问题不是学不会,而是不知道今天学了之后该练什么。所以我给你一份可以直接照着做的练习清单,每次上完一节课就花20分钟练一练。
第一题,写一个程序,让用户输入姓名、年龄、所在城市,然后输出一句话,比如“张三今年18岁,住在武汉。”这个练习综合考察input、类型转换、f-string三个知识点。
第二题,写一个简单的加法计算器,支持用户输入两个小数,输出它们的和、差、积、商。第二题比第一题难在哪?商可能是个无限循环小数,怎么输出才好看?这个小问题能逼你想一下格式化。
第三题,写一个程序,把用户输入的全名拆成名和姓,比如输入“张 三”,输出“你的姓是张,你的名是三”。这个练习练到split分割的使用,也为后面处理字符串打基础。
这三道题写完之后,我建议你再去LeetCode或牛客网找一找“A+B Problem”这类的入门题。在线判题系统(也就是OJ)对输入输出的格式要求非常严格,这能帮你养成精确处理输入输出的好习惯。很多人觉得OJ是搞竞赛的人才玩的东西,但我觉得那些最简单的输入输出题对新手极其友好,练的就是基本语法。
根据我个人带新人的经验,输入输出这一节是最容易出现知识断层的地方。表面上看print和input都很简单,但真正把sep、end、map、格式化字符串这些点串起来融会贯通的人,后面的学习速度会快很多。不要觉得基础简单就跳着看,拿个编辑器亲手敲一遍,再把上面的练习做一遍,稳扎稳打进入下一节。