写 Python 教程,最怕的就是把读者堵在第一步。我见过太多人,下了决心要学 Python,装环境装到崩溃,或者照着教程敲了一堆代码,一运行全是红字报错,直接劝退。这章不打算一上来就堆概念,咱们先干一件实事:把第一个程序稳稳当当地跑起来,再把那些天天出现在 Python 论坛热搜里的坑(比如“不是内部或外部命令”、“无法将 python 识别为 cmdlet”这类问题)一次性说透。同时,我会把 Python 的基础语法规范揉在这一章里,让你从第一行代码开始就写出“像样”的 Python。这一章适合完全零基础的小白,也适合那些已经安装过 Python、但被环境问题和语法细节折磨过的初学者。先把地基打牢,后面的路才走得快。
1. 环境准备:别让“装环境”成为劝退第一关
很多新手还没开始写代码,就倒在了环境配置上。我常说,装 Python 本身不难,难的是装完之后电脑“不认识”它。这一节把版本选择、安装细节和编辑器选型一次说清楚。
1.1 Python 版本选择与安装
第二个坑是安装路径。Windows 安装时有一个“Add Python to PATH”的勾选框,默认是没勾上的。这个选项极其关键,勾上之后系统才能在任何目录下直接识别python命令。如果不勾,你装完 Python 打开命令行输入python,大概就会碰到热搜里常年霸榜的报错:'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。我第一次装的时候也栽在这里,当时不知道 PATH 是什么,折腾了一晚上,最后重装的时候才注意到这个勾选框。我的建议是:安装时直接勾选,装完再回来看后面第 4 章的排查方法,理解原理。
安装包去哪里下载,同样有讲究。去 Python 官网(python.org)的 Downloads 页面,选对操作系统的版本就行。不要下载那种所谓的“一键安装包”或“某某教程专属版”,那些东西捆绑了广告、插件,甚至改动了 Python 的核心环境,出问题了连报错都看不懂。官方安装包就是最干净、最靠谱的选择。macOS 和 Linux 用户相对省心,macOS 用brew install python3,Ubuntu/Debian 系用sudo apt install python3,但这两种方式装完后一般要输入python3而不是python,这是系统的默认命名习惯,不是装错了。
验证安装是否成功的方法很简单:打开终端(Windows 是 CMD 或 PowerShell,macOS 是 Terminal),输入python --version(Windows 看情况)或python3 --version,能输出版本号就说明核心环境没问题。
1.2 编辑器的选择:从 IDLE 到 VSCode
环境装好了,接下来是写代码的工具。这一步不用纠结太久,初期选择的标准只有一个:够用、不折腾。
Python 安装包自带了一个极简的编辑器叫 IDLE,界面很朴素,没有代码高亮提示,也没有自动补全,但它的好处是零配置,打开就能写,写完按 F5 直接运行。对于第一次接触编程的人,我其实建议先拿 IDLE 练两三天手,把注意力放在语言本身上,而不是分散到工具配置里。IDLE 的缺点也明显——写长代码、做项目时效率太低,所以真正入门后就要换到更专业的编辑器。
目前新手的较优选择是 VSCode(Visual Studio Code),免费、跨平台,生态非常成熟。很多热词里出现的“vscode python环境配置”,本质就三件事:装 Python 扩展、选择正确的解释器、把“运行调试”配置好。装了扩展后,打开一个.py文件,右下角状态栏会显示已选中的 Python 解释器路径,点击它就能切换到你刚装好的 Python 版本。如果右下角显示的是错误的解释器,运行代码时就会出现“用了一个环境、装的包却在另一个环境里”的混乱局面。这些细节我现在特意提出来,是为了让你少走一段弯路。
1.3 确认环境变量的细节
环境变量和 PATH 是很多新手看不懂但实际上只需要理解 80% 就够用的东西。你可以把 PATH 想象成一本“常用程序通讯录”,系统每次收到一条命令时,都会翻这本通讯录,看有没有对应的程序入口。如果你装 Python 时勾选了 Add to PATH,就相当于把 Python 的“通讯录入口”加了进去,系统在任何目录下都能找到它。反之,系统翻遍整本通讯录也找不到python,就会甩出那句著名的“不是内部或外部命令”。
如果你已经装完 Python 才发现忘了勾选,不用急着卸载重装。手动把 Python 的安装目录(比如C:\Python312\和C:\Python312\Scripts\)添加到系统环境变量里就行。具体步骤是:右键“此电脑”->“属性”->“高级系统设置”->“环境变量”,在“系统变量”中找到Path变量,点击编辑,把这两个路径加进去,之后重新打开一个终端窗口才生效。这个操作值得亲手做一次,它背后的逻辑能帮你应对其他任何开发工具的安装。
2. 第一个程序:从“交互式”到“脚本文件”
环境没问题了,咱们就来写真正意义上的第一个程序。很多人以为写程序必须打开编辑器敲半天代码,其实 Python 有两种最基本的代码运行方式,各有各的适用场景。
2.1 交互式解释器的正确打开方式
打开终端,输入python(或python3)并回车,你会进入一个带有>>>提示符的界面,这就是 Python 的交互式解释器。在这里,你每输入一行代码,按下回车,Python 会立刻执行并给出结果。比如输入:
>>> print("Hello, world!") Hello, world!看到那行输出了吗?你的第一个 Python 程序已经跑起来了。交互式解释器适合做实验:验证一个函数怎么用、试一个逻辑能不能跑通、算一个简单的表达式,都特别方便,不需要写文件,所见即所得。
需要注意的是,>>>是解释器的提示符,不是代码的一部分。很多新手在复制代码时会连>>>一起复制到编辑器里,结果爆出一堆SyntaxError: invalid syntax,这是非常典型的低级错误。交互式解释器里如果要退出,Windows 上按Ctrl+Z再回车,macOS/Linux 上按Ctrl+D,或者直接输入exit()也一样。
2.2 创建一个 .py 脚本文件并运行
交互式适合小打小闹,但正式的代码还是得写到文件里。用 IDE 或任意文本编辑器新建一个文件,命名为hello.py或first_program.py,输入这一行:
print("Hello, world!")保存后,在终端中进入该文件所在目录,执行:
python hello.py屏幕上同样会输出Hello, world!。这就是“脚本文件”的运行方式。初学者需要尽早养成“代码存在文件里”的习惯,因为只有文件才能复用、修改、提交到 GitHub。
初学时有个容易混淆的细节:在 IDE 里点“运行”按钮本质上也是把你的文件交给解释器执行,和你手动在终端敲python 文件名.py是一样的,不要觉得两者有什么神秘差异。
2.3 认识文件入口:name的初步接触
写到第二个、第三个文件时,你可能会在网上看到这样的代码:
if __name__ == "__main__": print("hello")新手一般不太理解这个东西。打个比方:一个 Python 文件既可以当“主角”直接运行,也可以当“配角”被别的文件导入。__name__这个内建变量相当于在告诉你“我现在的身份是什么”——当它等于"__main__"时,说明你是主角,可以执行主逻辑;当它被导入为模块时,__name__会是模块名,if块里的内容就不会执行。
第二章不需要深入掌握这个机制,但看到它要知道“这是一种标准写法”,不要删掉它。等你学到模块和包的时候,再回头看这句话会非常清晰。
3. 基础语法规范:缩进、注释、命名与语句结构
跑通了第一个程序,接下来要建立“规范”意识。Python 被很多老手评价为“写起来舒服”,很大一部分原因就是它的语法强制你写出整洁的代码。这节内容是全章的关键,学完你写出来的代码至少从格式上会“像个内行”。
3.1 缩进是 Python 的灵魂
和 C、Java 用花括号{}表示代码块不同,Python 用缩进来表示代码块的层级关系。也就是说,哪些代码是if条件内的、哪些代码是循环体内的,完全靠缩进来区分。比如:
age = 18 if age >= 18: print("已经成年") print("可以去考驾照了") print("这句话无论如何都会输出")最有代表性的报错就是IndentationError: unexpected indent或IndentationError: expected an indented block。前者一般出现在多缩进了几格的地方,后者则经常出现在if、for、def等语句冒号后面忘了缩进的时候。
这里有一条铁律:同一个代码块内只能用同一种缩进方式,不要混用 Tab 和空格。我见过太多新手在 VSCode 里,第一行用空格缩进,第二行按了一下 Tab,运行直接报错。你肉眼看着对齐了,Python 却不这么认为。推荐统一使用 4 个空格,这是 PEP 8(Python 官方代码风格指南)的标准建议。VSCode 可以在设置里配置editor.detectIndentation和tabSize: 4,写代码时把“将 Tab 转换为空格”打开,能省掉大量冤枉时间。
3.2 注释:写给自己和未来的你
注释是代码里不参与执行的部分,作用是解释“这段代码是干什么的”“为什么这样写”。Python 的单行注释用#开头:
# 这是在打印一条问候语 print("Hello, world!")多行注释通常用三引号(单引号或双引号都可以)括起来,不过严格来说,三引号字符串在没有被赋值时也会被当作注释使用,是 Python 社区常见的做法:
""" 这是多行注释区域 可以写很多说明性文字 """良好的注释习惯是:代码本身应该尽量自解释(变量命名清晰、结构简单),注释用来补充代码表达不了的背景信息,比如“这里为什么要处理边界情况”“这个参数的单位是什么”。不要写废话注释,比如:
x = 1 # 把1赋值给x这种注释没有提供任何额外信息,属于噪音。我评判一段代码是否专业,很多时候看注释就知道。新手阶段养成写注释的习惯,以后做项目、开源、找工作都是加分项。
3.3 命名规范:变量、函数与常量
Python 代码的命名有一套社区约定,遵循这套约定,别人读你代码(包括未来的你)会觉得流畅自然。
- 变量名:使用小写字母加下划线,单词之间用下划线分隔,这种风格叫
snake_case。例如user_name、cart_total_price。 - 函数名:同样使用
snake_case,例如get_user_info()。 - 常量名:全大写字母,单词之间用下划线连接,例如
MAX_RETRY_TIMES、DEFAULT_PORT。 - 类名:每个单词首字母大写,不加下划线,例如
UserProfile。
除了风格,还有一个更要命的原则:变量名不能是 Python 的关键字。关键字是 Python 官方预留的、有特殊含义的词,比如if、for、while、import、def、class等。你要是写if = 3,直接会得到SyntaxError: invalid syntax。同理,print虽然是内置函数名,不算关键字,但拿它当变量名会覆盖内置功能,新手也尽量避免。
给变量起名时尽量做到“望文知义”。a = 10和age = 10在执行效果上没有区别,但在半年后你回看代码时,前者会让你满头问号。少用太抽象的名字,这也是新手最容易忽略的“隐性规范”。
3.4 语句、表达式与缩进编码规范
Python 语句以换行结尾,一次一行。一行写多条语句可以用分号分隔,但尽量不要这么做——分号在 Python 中是多余的,而且会降低代码可读性。
如果一条语句太长了,怎么写才规范?Python 中常见的做法是用括号把长表达式包起来,让它在内部隐式换行:
total_price = ( item_price * quantity + shipping_fee - discount )括号内换行是允许的,而且不需要反斜杠。有些场景也用到反斜杠\作为显式续行符,但能避免就尽量避免,代码会很丑。
还有一个细节新手很容易忽略:运算符两边要加空格。比如x = y + 1是规范的,而x=y+1虽然在语法上没错,但不符合 PEP 8 的建议。逗号后面也要加一个空格,比如foo(x, y)。这些细节看起来琐碎,但它们直接决定了代码的“气质”。
3.5 数据类型初窥与类型转换
Python 内置了若干基础数据类型,第二章不要求全部掌握,但这几个常见的你必须知道:
| 类型 | 名称 | 示例 |
|---|---|---|
int | 整型 | 42、-7 |
float | 浮点型 | 3.14、-0.5 |
str | 字符串 | "hello"、'Python' |
bool | 布尔值 | True、False |
热词里经常出现的“python类型转换”,指的是在类型之间做转换,常见的有int("123")把字符串转成整数、str(123)把整数转成字符串、float("3.14")把字符串转成浮点数。例如:
price_str = input("请输入价格:") price = float(price_str) print(price * 2)不使用float(),直接计算则可能得到字符串拼接结果,这经常导致预期外的错误。用type()函数可以查看变量的类型,例如type(123)输出<class 'int'>。初学阶段多打印类型,可以避免很多“看起来是数字其实是字符串”的坑。
4. 新手最常见的报错与排查思路
很多人学编程不是学不会,而是被报错吓住了。其实报错是程序在“说话”,它在告诉你哪里出了问题。学会读懂报错,比背十段语法更有用。我见过很多新人遇到红色报错就直接崩溃,其实大部分问题就那么几类。
4.1 命令找不到类报错:PATH 与终端识别问题
在热搜词里高频出现的几类报错,比如:
'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。 无法将"python"项识别为 cmdlet、函数、脚本文件或可运行程序的名称。这两条在 Windows 的 CMD 和 PowerShell 上出现,几乎都和 Python 没被正确加入 PATH 有关,也可能是安装后没重新打开终端,导致系统没有刷新环境变量。解决办法就是我 1.3 节里说的:手动配置 PATH,然后重新打开命令行窗口。
这里要注意一个细节:只改完环境变量不重开终端,命令依旧失效,因为每个终端窗口在启动时会读取一次环境变量,不会实时更新。这个问题是高频踩坑点,遇到时先别急。
4.2 缩进错误与语法错误
这两类报错是新手写代码时的“老朋友”:
IndentationError: unexpected indent SyntaxError: invalid syntax排查思路很简单:先看报错信息里的文件和行号。大多数编辑器的右下角都显示行号,直接跳到那一行检查。IndentationError看 Tab/空格是否混用、缩进层数是否一致;SyntaxError则大概率是漏了括号、引号没闭合、中英文标点混用。举例来说,全角括号(和半角括号(看起来几乎一样,但 Python 只认半角符号。写到中文输入法的环境下,这种错误常会出现。
4.3 变量未定义的坑:NameError
NameError: name 'xxx' is not defined出现这个,通常是两种情况:一是变量名拼写有误(比如先定义了user_name,后用username取值);二是变量还没被赋值就拿来用,例如:
print(age) age = 18Python 是解释执行的语言,执行到第一行时age还没出现,自然报错。把赋值放到使用之前就行。这种报错还有个出现在命令行混淆的变种——如果你在交互式解释器里定义了变量,后续换到脚本文件里运行,是拿不到那个变量值的。很多新手在两个窗口间来回切换,就会产生“刚才明明还在,现在怎么 not defined”的困惑。
4.4 import 与模块安装类报错
ModuleNotFoundError: No module named 'xxx'这个报错的意思是 Python 在当前环境里找不到你要导入的模块。常见原因有两个:一是模块确实没安装,需要执行pip install 模块名;二是这个模块装在了另一个 Python 环境里,你在当前环境下运行自然找不到。后面这种情况在装了多个 Python 版本、或用 VSCode 却选了错误解释器的时候尤其常见。之前提到的“VSCode 右下角切换解释器”就是为这个目的设计的。
这里给出一个通用的排查链路,可以作为固定思路:
- 看最后一行:报错信息最后一行是错误类型和错误名,先判断它是
SyntaxError、NameError、IndentationError还是别的。 - 看文件和行号:报错中间常有
File "xxx.py", line 12这样的信息,直接定位到具体位置。 - 读代码,不硬想:把那一行代码读出来,检查括号是否闭合、引号是否配套、变量名是否拼写正确。
- 一行行注释排除:如果整个文件跑不通,先把可疑代码注释掉,逐步缩小范围。
这套流程非常朴实,但能解决 90% 以上的入门期问题。程序员并不可怕,可怕的是不看报错内容就到处乱试。
5. 我踩过的坑与入门期的练习建议
教了这么多年,也带过不少新人,编程入门这件事最大的障碍往往不是技术本身,而是挫败感和方法。这里说几个我自己踩过、也看身边人反复踩的坑,再加上一套亲测有效的练习思路。
5.1 三个真实的入门坑
坑一:装完 Python,却在一个“假命令”里运行代码。早些年我用过一款文本编辑器,它自带一个终端插件,我一度以为在那里敲python就是系统真正的终端。某个依赖在系统终端里装好了,插件终端里却怎么都找不到,浪费了很多时间排查。现在的建议是:初学统一用系统自带的终端(Windows 用 PowerShell,macOS/Linux 用 Terminal),别迷信编辑器内置终端。等熟练了再切到 IDE 内部也不迟。
坑二:为“缩进”熬了个大夜。大概十年前我第一次在别人给的示例代码上加了一段if,里面复制了另外一段代码,结果摘出来后空格和 Tab 混得乱七八糟。运行后永远报IndentationError,当时我不懂看行号,只能从头到尾肉眼对齐。后来学会了“全选 -> 格式化”或“缩进转换”,一分钟解决。现在编辑器一般都有“缩进命令面板”,搜索“convert indentation”就能直接转换空格和 Tab。
坑三:自己写了一个文件,import 时报错。初学者很容易在一个目录下写了两个.py文件,其中一个文件里写import my_utils,结果运行时报ModuleNotFoundError。原因是 Python 的模块搜索路径默认包含当前运行目录,如果你的文件和被导入文件不在同一个目录,就需要调整路径或采用包结构。这个知识在第三章会深入讲,但提前知道“文件位置和模块导入有关系”这个认知,能减少很多困惑。
5.2 入门期最有效的练习方式
这一章的内容学完,你不应该只停留在“看懂了”的层面,我建议你完成这组练习,每天挑 2 个做,坚持一个星期:
- 写一个程序,用
print输出你的姓名、年龄、城市,并各用注释解释一下。 - 定义两个变量,一个是数字、一个是字符串,用
type()打印它们的类型。 - 把字符串
"123"转换为整数,再和另一个整数相加,输出结果。 - 写一个包含
if/else的程序,故意制造一次缩进错误,观察报错信息,再修复它。 - 在交互式解释器和脚本文件两种方式下,分别执行同一段代码,体验两者的差异。
我在带人的时候反复强调一个观点:报错是最好的老师。假如一次就能写出完全正确的代码,反而不利于学习。故意制造错误、阅读报错、定位问题并修复,这个循环走通一次,你的动手能力就上一个台阶。练习的目的不是记住语法,而是建立“遇到问题-分析问题-解决问题”的肌肉记忆。
这章的最后一件事:把那些踩过的坑记下来。无论是 PATH 的配置、缩进的教训,还是某个报错的解决办法,都值得写在笔记里。编程学习不是线性的,遗忘非常常见,但你的笔记可以让你迅速重新回到状态。准备好这些,我们就可以进入下一章,开始接触变量、数据结构和流程控制了。