1. 内容整体设计与思路拆解
1.1 为什么现在学Python是个好选择
如果你点进这篇文章,大概率是听过“Python简单”“Python好找工作”“Python什么都能干”这类说法。说真的,这些说法不算夸张,但也需要拆开看。我做了十来年开发,前前后后也带过不少零基础转行的朋友,Python确实是目前最适合作为第一门编程语言的选择,没有之一。
原因是多方面的。第一,Python的语法极其接近自然语言,你不需要理解内存地址、指针、堆栈这些劝退概念就能写出能跑的程序。第二,Python的第三方库生态实在太庞大了,从网页爬虫到人工智能,从自动化办公到数据分析,几乎每个方向都有现成的轮子可以借。第三,Python的解释执行特性让你可以一边写一边看结果,那种“立刻获得反馈”的感觉,对新手建立信心非常管用。
但我也要先泼一盆冷水。Python的“简单”主要体现在上手阶段,真正深入下去,多进程、协程、装饰器、元类这些高级特性照样能把人绕晕。所以零基础学习的正确思路,不是一头扎进各种高深术语里,而是按“基础语法 → 数据类型 → 流程控制 → 函数 → 文件操作 → 常用标准库”这条主线,先把地基打牢,再决定往哪个方向爬楼。
我见过太多新手上来就学爬虫,结果连列表和字典的区别都没搞清楚,最后翻车翻得很惨。这篇文章就是专门给零基础小白准备的基础版详解,所有概念都会用最简单的大白话讲清楚,配合能直接复制的代码示例,你看完跟着敲一遍,绝对能建立最基本的Python直觉。
1.2 学习路线和核心知识模块划分
Python零基础学习的知识体系,其实可以拆成几个清晰的大模块,每个模块之间是有依赖关系的。如果按顺序走,效率最高:
- 环境搭建:安装Python解释器、配置代码编辑器,让你能写代码并运行。
- 变量与数据类型:数字、字符串、列表、字典、元组、集合,这是你操作数据的基本单位。
- 运算符与表达式:加减乘除、比较判断、逻辑组合,让程序会计算、会判断。
- 流程控制:if判断、for循环、while循环,让程序能根据条件走不同分支,能重复执行任务。
- 函数与模块:把重复代码封装成函数,把功能拆分成模块,这是代码复用的基础。
- 文件操作:读写txt、csv、json这些文件,让程序能和外部数据交互。
- 异常处理:程序出错时不让它直接崩溃,而是给出友好提示。
- 面向对象基础:理解类与对象,为后续进阶做准备。
这八个模块覆盖了Python入门阶段百分之九十以上的核心知识点。这篇文章会重点拆解前四个模块,因为它们是重中之重,后面的模块会在后续文章中展开。
1.3 每个知识点的难度定位和投入时间建议
零基础学Python最大的痛点,不是学不会,而是不知道怎么分配精力。我建议你按“二八法则”来:百分之二十的核心语法占了日常使用的百分之八十。具体来说,变量、条件判断、循环、函数这四件事,你哪怕只掌握到及格水平,就已经能看懂大部分Python代码了。
至于难度,我觉得可以给每个模块标注一下,方便你心里有数:
| 模块 | 难度系数 | 建议投入时间 | 关键产出 |
|---|---|---|---|
| 环境搭建 | 一星 | 1-2小时 | 能运行第一行print代码 |
| 变量与数据类型 | 三星 | 6-8小时 | 能定义并操作各种数据 |
| 运算符与表达式 | 二星 | 3-4小时 | 能写带计算的程序 |
| 流程控制 | 四星 | 8-10小时 | 能处理复杂的逻辑分支 |
| 函数 | 四星 | 8-10小时 | 能封装可复用的代码块 |
| 文件操作 | 三星 | 4-6小时 | 能读写外部文件 |
| 异常处理 | 二星 | 2-3小时 | 程序不再裸奔崩溃 |
| 面向对象 | 五星 | 10小时以上 | 能理解类和对象的关系 |
这个时间表是我根据带新人的经验估算的,每天保证两小时有效学习时间,大概三周左右就能过完一遍。别贪快,每学一个知识点,一定要亲手敲代码,哪怕是最简单的,也能加深记忆。
2. 零基础环境搭建:别让安装步骤卡住你
2.1 Python安装包的选择与下载细节
很多新手学Python,第一关就死在环境安装上。其实Python的安装没有想象中复杂,只不过有几个容易踩坑的细节,我在这儿一次说清楚。
首先是版本选择。现在官方主推的是Python 3.x系列,以3.10到3.12为主流。老掉牙的Python 2.x千万不要碰,它已经在2020年停止维护了。很多老教程还在教你装Python 2,那是考古,不是学习。你只需要记住:去Python官网(python.org),点Downloads,选最新的稳定版就行。
下载的时候要注意操作系统。Windows用户选Windows installer(64-bit),macOS用户选macOS installer,Linux用户一般用系统自带的包管理器安装,比如Ubuntu下执行sudo apt update && sudo apt install python3 python3-pip,或者从源码编译安装,这个稍复杂,零基础建议直接用系统包。
这里有一个非常关键的坑:Windows安装时,安装向导的第一个页面最下面有一个**“Add Python to PATH”**复选框,默认是没勾上的。如果忘记勾,后面在命令行里敲python会提示“不是内部或外部命令”,那就麻烦大了。我见过太多人卡在这一步还到处发帖求助,其实解决很简单:重新运行安装程序,选Modify,把Add Python to PATH勾上,或者干脆卸载重装一遍。所以第一次安装时候务必把这个勾打上。
2.2 验证安装是否成功
安装完成后,打开命令行工具验证一下。Windows用户按Win+R,输入cmd并回车;macOS用户打开终端;Linux用户打开任意终端模拟器。然后输入:
python --version如果显示类似Python 3.12.x的版本信息,就说明安装成功了。有些系统里Python命令是python3,比如Ubuntu或者macOS的默认环境,那就用python3 --version测试。
如果提示找不到命令,先检查是不是PATH的问题。Windows上可以用where python查看,macOS/Linux可以用which python3查看。实在搞不定,最稳妥的办法是把Python卸载干净,再重新装一遍,这次注意勾选Add to PATH。
还有个值得试的工具叫pyenv,它可以管理多个Python版本,不过零基础阶段没必要折腾,等以后有明确需求再说。
2.3 编辑器到底选VSCode还是PyCharm
环境装好以后,写代码的工具也很重要。这个问题没有标准答案,我分别说一下适用场景。
PyCharm是专门为Python打造的IDE,功能非常全面,智能提示、自动补全、代码调试都做得特别顺手,甚至还有数据库连接、版本控制这种高级功能。它的社区版是免费的,对新手来说已经完全够用。缺点是比较吃内存,老电脑打开项目后会有点卡。
VSCode是微软出品的通用代码编辑器,通过安装Python扩展后,也能获得接近PyCharm的开发体验。它更轻量、启动更快,而且插件的生态非常丰富,不只是写Python,以后写前端、写脚本都能继续用。缺点是初始配置稍微麻烦一点,新手要自己装Python扩展、选解释器,可能一脸懵。
我个人建议:如果你的电脑内存低于8GB,选VSCode;如果内存充裕,且你希望开箱即用少折腾,就装PyCharm Community版。这两者没有谁绝对更好,关键是别在工具上浪费太多时间。
2.4 VSCode配置Python环境的完整流程
这里我把VSCode配置Python环境的步骤写一遍,虽然是给零基础看的,但每一步都很关键,照着做就不会出幺蛾子。
第一步,在VSCode左侧拓展商店搜索“Python”,选微软官方发布那个,点击Install安装。注意别装成其他同名扩展,认准发布者是Microsoft。
第二步,打开你的代码文件夹,新建一个后缀为.py的文件。第一次保存时,VSCode右下角可能会提示“Select Python Interpreter”,点击它,选择你刚才安装的Python版本。如果没有这个提示,可以按Ctrl+Shift+P,输入”Python: Select Interpreter“,手动选择。
第三步,写一段最简单的测试代码:
print("你好,Python!")然后点击右上角的运行三角形按钮,如果下方终端输出“你好,Python!”,就说明环境配置完全OK了。
这里有个小细节:VSCode的终端如果用的是PowerShell,可能会因为执行策略问题报错。解决办法是在终端里执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser,或者改用cmd作为默认终端,具体设置是在终端下拉框里选择“Select Default Profile”。遇到这类问题先别慌,八成不是代码问题,是环境变量或权限设置。
2.5 PyCharm配置Python环境的要点
PyCharm的配置相对简单。首次启动时会让你选择创建新项目,项目类型选“Pure Python”,然后设置项目路径和解释器。解释器这里选Existing,浏览到你安装的Python路径。Windows默认路径一般是C:\Users\用户名\AppData\Local\Programs\Python\PythonXXX\python.exe,如果找不到,直接打开命令行用where python查一下,复制路径过来就行。
项目创建好后,在项目里右键新建Python文件,输入print("hello"),右键选择Run,就能看到输出。PyCharm还支持在“Settings → Project → Python Interpreter”里查看和管理所有第三方库,非常直观。
我不建议零基础一上来就装很多插件,保持默认状态即可。等你代码量上去了,再按需添加。
3. 变量和数据类型:和数据打交道的基础
3.1 变量就是给数据贴个标签
编程里最核心的概念之一就是变量。用生活里的例子,变量就像是一个贴了标签的盒子。盒子里可以存数字、存文字、存一堆列表,而标签就是变量名。当你需要用到里面的东西时,只要喊标签名就可以了。
Python里定义变量不需要声明类型,直接赋值就行:
name = "小明" age = 18 height = 1.78这三行代码分别把一个字符串、一个整数、一个浮点数赋给了变量name、age和height。Python解释器会自己判断类型,不用你操心。这就是Python简洁易用的体现之一。
关于变量名,有几个硬性规则,新手最容易踩坑:变量名只能由字母、数字和下划线组成,且不能以数字开头;不能使用Python内置关键词(比如if、for、while)作为变量名;变量名是区分大小写的,Name和name是两个不同变量。除此之外,建议用有意义的名字,比如user_count而不是a,不然写多了自己都得猜。
还有一个容易搞混的点:Python中=是赋值号,不是数学里的等号。x = x + 1的意思是,取出x当前的值,加1后,结果再回写进x。这种操作在循环里特别常见,理解这个写法对后续学习非常重要。
3.2 数字类型:int和float的基本操作
数字分为整数(int)和浮点数(float)。浮点数其实就是小数,比如1.78、3.14。它们之间的运算规则和数学里一样:
a = 10 b = 3 print(a + b) # 13 print(a - b) # 7 print(a * b) # 30 print(a / b) # 3.3333333333333335 print(a // b) # 3 整除,向下取整 print(a % b) # 1 取余数 print(a ** b) # 1000 幂运算注意/和//的区别。/是标准除法,结果永远是浮点数;//是整除,直接去掉小数部分,相当于取整。取余运算%在判断奇偶性、格式化输出、循环周期控制上非常常用,比如判断一个数能不能被另一个整除,就是num % n == 0。
浮点数有一个深坑,那就是精度问题。比如0.1 + 0.2得到的结果并不是精确的0.3,而是0.30000000000000004。这是因为计算机底层用二进制表示十进制小数时会有误差。日常开发中如果涉及到钱的比较,不要直接用等于判断,应该用round(0.1 + 0.2, 2) == 0.3或者用Decimal模块。这个知识点有点超纲,但很重要,先有个印象。
3.3 字符串:拼接、切片和格式化
字符串是Python中最常用的数据类型,没有之一。凡是用单引号、双引号或三引号括起来的内容,都是字符串。三个引号最大的好处是可以直接写多行文本,适合存说明文档或者长段落。
字符串拼接最简单的方式是直接用加号:
first = "Python" second = "入门" print(first + second) # Python入门但要注意,字符串不能直接和数字相加,否则会报错。比如"age is " + 18就不行。你需要先把数字转成字符串,用str(18),或者直接使用格式化功能。
Python提供了几种格式化方式,我推荐使用f-string,它从Python 3.6开始支持,简洁又强大:
name = "小红" score = 98.5 print(f"我的名字是{name},这次考了{score}分")f-string就是在字符串前面加一个f,然后用{}把变量名引进去,运行时会自动替换成实际值。这种方式可读性极高,强烈建议零基础从一开始就只学f-string,别去折腾老式的%格式化或者format()方法。
字符串切片也是一个高频操作。你可以通过索引访问字符串中的某个字符,索引从0开始,比如word = "hello",word[0]是h,word[1]是e。还可以用word[1:3]取子串,左闭右开,意思是包含索引1但不包含索引3,所以结果是"el"。负索引从-1开始从右往左数,比如word[-1]是o。切片这个操作在数据处理时会频繁遇到,比如截取日期、截取文件名等,一定要亲手试几次。
3.4 列表和字典:最常用的两种容器
如果变量只是单个数据的盒子,那列表(list)和字典(dict)就是能装一堆数据的收纳箱。它们分别对应不同的场景。
列表是有序的序列,用方括号括起来,元素之间用逗号分隔:
names = ["张三", "李四", "王五"] print(names[0]) # 张三 print(names[-1]) # 王五 names.append("赵六") # 在末尾添加 names.remove("李四") # 删除指定元素 print(len(names)) # 长度列表里的元素类型不必相同,可以混合存放数字、字符串,甚至嵌套列表。列表的slicing和字符串是类似的,所以学了字符串切片,列表切片基本等于免费送。
字典则像是查字典一样,通过“键”来找到“值”。它用来描述“一个实体的多个属性”特别合适:
person = {"name": "小明", "age": 18, "city": "杭州"} print(person["name"]) # 小明 person["age"] = 19 # 修改值 person["job"] = "学生" # 新增键值对 print(person.get("score", 0)) # 如果键不存在,返回默认值0字典的键必须是不可变类型,比如字符串、数字、元组,列表不能作为键,因为列表可变,会导致哈希失效。这个知识点初学不用深究,但遇到TypeError: unhashable type: 'list'时,就要知道是键类型的问题。
列表和字典是Python数据处理的基石,爬虫解析JSON、数据分析处理表格数据,背后都离不开这两种数据结构。建议多练习几次增删改查,把方法都敲顺。
3.5 类型转换:int()、float()、str()的用法
类型转换是新手很容易忽略的知识点。程序从外部读取的数据往往是字符串,但你要拿它做数学运算,就必须转换类型。打个比方,你把“18”这个数字写在了纸上,想算年龄加1,需要先把它看成一个数字,而不是文字。计算机也一样。
常见的类型转换函数有三个:
int("123") # 字符串转整数,得到123 float("3.14") # 字符串转浮点数,得到3.14 str(123) # 整数转字符串,得到"123"特别注意,int()转换时,字符串必须是纯数字格式,不能有小数点和其它字符。int("3.14")会直接报错,正确做法是先转float再转int:int(float("3.14")),得到3。同理,float()可以接受字符串“3.14”,但如果字符串是“abc”就会抛异常。
日常最常见的错误是在字符串拼接时忘记转换数字:
age = 18 print("我今年" + str(age) + "岁")记住这个规则:数字转字符串用str,字符串转数字用int或float。f-string虽然可以自动转换,但理解底层的类型转换仍然是必须的。
4. 运算符和表达式:让程序会算、能判断
4.1 算术运算符和赋值运算符
前面已经介绍过加减乘除、整除、取余、幂运算,这里再补一个组合赋值的概念。Python允许把运算和赋值合并写,比如:
x = 5 x += 3 # 等价于 x = x + 3 x -= 2 # 等价于 x = x - 2 x *= 4 # 等价于 x = x * 4 x /= 2 # 等价于 x = x / 2这种写法简洁直观,读代码的时候要能一眼看懂。实际开发中,计数器的累加,比如count += 1,是出现频率最高的写法。
4.2 比较运算符和逻辑运算符的判断规则
比较运算符用于判断两个值的大小关系或相等性,结果永远是布尔值True或False:
print(5 > 3) # True print(5 == 3) # False(注意是两个等号) print(5 != 3) # True print(5 >= 5) # True这里最经典的坑是等号:单个=是赋值,两个==才是判断相等。新手经常在if条件里误写单等号,结果要么报语法错误,要么逻辑完全不对,而且这种bug特别难查。
逻辑运算符有三个:and、or、not,分别表示与、或、非。用法非常符合自然语义:
age = 20 is_student = True if age > 18 and is_student: print("成年学生") if age < 12 or age > 60: print("不需要买票") if not is_student: print("不是学生")and要求两边都为True结果才为True,or要求至少一个为True即可,not是取反。优先级方面,not高于and,and高于or。如果表达式很长,最稳妥的办法是加括号,避免歧义。
4.3 运算符优先级和括号的作用
Python的运算符优先级和数学里的规则基本一致:先乘除后加减,幂运算优先于乘除。但代码一长,人就会晕。我给你的建议是:不要试图背优先级表,遇到复杂表达式,直接用括号把要优先计算的部分括起来,又清楚又安全。
比如result = (a + b) * c,一眼就能看出是先算加法。这种写法不会降低性能,反而能提升代码的可读性,利大于弊。等代码写多了你会发现,可读性永远比自以为是的简洁更重要。
5. 流程控制:让程序学会自主判断和循环
5.1 if条件判断的完整语法
程序与人最大的区别是,程序可以按照一定规则自动决策。if语句就是决策的核心。基本结构是这样:
score = 85 if score >= 90: grade = "优秀" elif score >= 80: grade = "良好" elif score >= 60: grade = "及格" else: grade = "不及格" print(grade)注意几个关键点:if、elif、else后面都要写冒号;条件成立时要执行的代码必须缩进,Python用缩进来区分代码块,缩进四个空格是惯例;elif可以有多个,但else最多只有一个。
嵌套if也允许,但我建议新手避免过深嵌套,否则代码会变得像迷宫一样难以阅读。如果逻辑复杂,可以用and、or来合并条件,或者提前return,这些技巧后面学到函数时会遇到。
5.2 for循环遍历列表和range的妙用
循环是解决重复劳动的最有效工具。for循环最常用的场景是遍历列表,比如把每一个学生的名字打印出来:
students = ["张三", "李四", "王五"] for name in students: print(name)如果要循环固定次数,比如打印1到10,就需要range函数:
for i in range(1, 11): print(i)range(1, 11)生成的是1到10的整数序列,注意同样左闭右开,不包含11。如果只写range(5),则从0开始生成0、1、2、3、4,共五个数。这个细节经常让人蒙圈,记住左闭右开就万事大吉。
在循环里,两个常用的控制语句是break和continue。break是提前结束整个循环,continue是跳过当前这次,直接进入下一轮。比如:
for i in range(1, 100): if i % 7 == 0: break # 遇到第一个能被7整除的数就停止 if i % 2 == 0: continue # 偶数不打印 print(i)这段代码会打印奇数,直到遇到7为止。break和continue在爬虫翻页、数据处理过滤时都很常用,一定要亲手跑一遍。
5.3 while循环的使用场景和死循环防护
while循环和for循环最大的区别在于,while是“直到条件不满足才停”,for是“遍历完一个序列才停”。计数型的重复任务用for更合适,而不知道具体循环几次的任务,比如等待用户输入直到合法、反复尝试连接服务器,用while更顺手。
countdown = 5 while countdown > 0: print(f"倒计时{countdown}秒") countdown -= 1 print("开始!")while循环最要命的问题是忘记更新循环变量,导致无穷循环,程序卡死。上面代码如果少了countdown -= 1那行,countdown永远大于0,永远出不来。开发时如果真的不小心写出了死循环,可以用Ctrl+C强制终止程序,不用慌。
还有一点需要知道的是for和else、while和else的配合,这是Python特有的语法。循环正常结束时会执行else里的代码,但如果循环被break终止,else就不会执行。这个特性在某些查找场景下能省不少事,比如判断一个数是不是质数:
num = 17 for i in range(2, num): if num % i == 0: print(f"{num}不是质数") break else: print(f"{num}是质数")这段代码里,如果break触发了,else就会被跳过;如果循环完整跑完都没找到约数,else里的质数提示就会输出。这个写法很Pythonic,新手熟练掌握后会感觉代码写起来非常优雅。
5.4 循环嵌套的入门:九九乘法表实战
循环嵌套听起来吓人,其实就是外层循环每执行一次,内层循环完整执行一遍。拿九九乘法表来练手是最经典的:
for i in range(1, 10): for j in range(1, i + 1): print(f"{j} x {i} = {i * j}", end="\t") print()运行结果会是一张完整的九九乘法表。注意print函数默认会在末尾换行,这里用end="\t"把换行符换成了制表符,这样内层循环在一行内打印。外层循环每结束一轮,就用一个空print()换行。这个练习能把循环、range、f-string、print参数全部串起来,非常值得亲手敲三遍,每一遍都会加深理解。
6. 函数:把重复代码打包成工具
6.1 函数定义、参数和返回值的核心逻辑
函数是代码复用的基础。当你发现某段逻辑在多处重复出现时,就应该把它封装成函数。函数就像一台机器,你往里面放进原料(参数),它经过加工,最后吐出产品(返回值)。
定义一个最简单的函数:
def greet(name): return f"你好,{name}!" print(greet("小明")) # 你好,小明!这里的def关键字用来定义函数,greet是函数名,name是参数,return是返回值。调用函数时用函数名加括号,把实际参数传进去。
函数可以没有参数,也可以有多个参数;可以返回值,也可以不返回。没有return时,函数默认返回None。None是Python里一个特殊的值,表示“什么都没有”,注意它和空字符串、0都是不同的。
6.2 默认参数和关键字参数的使用技巧
Python的函数参数很灵活,支持默认值:
def introduce(name, age=18, city="杭州"): print(f"我叫{name},今年{age},来自{city}") introduce("小红") # 使用默认年龄和城市 introduce("小红", 20, "上海") # 全部指定 introduce("小红", city="北京") # 只指定城市,用关键字参数默认参数的好处是,调用时可以少写很多参数。但有一个坑必须特别注意:默认参数不应该使用可变对象,比如不要写成def func(items=[])。因为默认参数在定义时只会被创建一次,多次调用时会共享同一个列表,导致数据互相污染。正确做法是:
def func(items=None): if items is None: items = [] items.append("x") return items这个坑非常经典,网上有大量程序员在这里翻过车,写在这里希望各位远避。
6.3 函数作用域和global、return的配合
函数内部定义变量默认都是局部变量,只能在函数内部使用。外部变量在函数内部只能读取,不能直接修改。比如:
count = 0 def add(): count += 1 # 这里会报错 add()报错原因就是Python认为count是局部变量,但它在赋值前被引用了。如果实在需要修改全局变量,要用global声明:
count = 0 def add(): global count count += 1 add() print(count)不过我建议新手别乱用global,它会让代码的依赖关系变得很隐晦,难以调试。绝大多数场景下,你可以把外部值作为参数传进来,再把返回值赋给外部变量,这样代码更清晰。
7. 异常处理:让程序在出错时优雅一点
7.1 try-except的基本写法
写程序不可避免会出错。出错了不可怕,可怕的是程序直接崩溃,用户一脸懵。异常处理就是用来“拦截”错误的机制,让程序在出错后还能继续运行或者给出友好提示。
最常见的错误包括:除以零导致的ZeroDivisionError、类型转换格式错误导致的ValueError、访问列表不存在的索引导致的IndexError、读取不存在的文件导致的FileNotFoundError。它们的处理方法都一样:
try: num = int(input("请输入一个数字: ")) print(100 / num) except ZeroDivisionError: print("不能除以0") except ValueError: print("请输入合法的数字") else: print("一切正常,没有异常发生") finally: print("这条语句无论如何都会执行")try块里放的是可能出错的代码;except块是用来捕获特定异常的,可以有多个;else是try没有异常时执行的;finally是无论有没有异常都会执行的。这个结构在涉及文件读写时特别重要,因为文件打开后无论如何都要关闭,finally就是干这个的。
7.2 如何避免过度使用异常
异常处理是好东西,但也不能滥用。我见过很多新手把整个主流程都塞进try里,出错了就一个except Exception吞掉,结果bug被静默掩盖,排查起来非常痛苦。我的建议是:只在可能会抛异常的关键位置使用,并且尽量捕获具体的异常类型,而不是笼统地用Exception。至少要把错误信息打出来,比如except Exception as e: print(e),方便定位问题。
8. 常见问题与排查技巧实录
8.1 环境变量和模块安装报错速查
| 报错现象 | 可能原因 | 解决办法 |
|---|---|---|
| 'python' 不是内部或外部命令 | 安装时未勾选Add to PATH | 重装勾选,或在系统变量里手动添加路径 |
| ModuleNotFoundError: No module named 'xxx' | 库未安装,或pip装错了Python版本 | 用pip install xxx,确认pip和python同版本 |
| pip不是内部或外部命令 | Python没有安装pip | 用python -m ensurepip --upgrade修复,或者重装 |
| SyntaxError: Non-ASCII character | 代码里出现了中文字符,且文件编码不是UTF-8 | 文件开头加# -*- coding: utf-8 -*-或保存为UTF-8格式 |
| IndentationError | 缩进错误 | 检查空格和Tab是否混用,统一用四个空格 |
我特别提醒一句:不要混用Tab和空格缩进。虽然Python允许两种方式,但在同一个文件里混用,解释器会报错,甚至表面上对不齐也会报错。养成统一用空格的习惯,最好在编辑器里开启“将Tab键转为空格”。
8.2 学习过程中最容易犯的三个代码错误
第一个错误是大小写不敏感。Python变量名是区分大小写的,Print和print是两个完全不同的东西。所有内置函数和关键字都是小写,比如print、if、for,写成了Print或For就会SyntaxError。
第二个错误是丢了冒号或引号。if语句、for语句、def语句后面的冒号特别容易被忽略,字符串的引号经常只写了一半。这类语法错误其实很好排查,因为编辑器一般会给出红色波浪线或者错误提示,照着提示改就行。
第三个错误是可迭代对象混用。把字典直接当列表遍历,遍历的是键而不是值;把字符串和数字用加号拼接,直接报类型错误。理解type()函数的用法,遇到怀疑时先打印一下变量类型,养成这个习惯能解决一大半问题。
8.3 优化代码的小习惯:print调试法
调试新手不要太早学各种高大上的debugger,先用最朴素的print调试法就够。在怀疑出问题的位置,打印关键变量的值,看它是否符合预期。比如循环没按想象执行,就在循环里打印每轮的值;函数返回结果不对,就打印函数内部计算过程的中间量。
打个比方,你煮的菜味道不对,总得先看看放了哪些料、放了多少。print就是在做饭过程中随时尝一口,直观又有用。等你的代码量上去了,再接触断点调试、日志系统,会自然得多。
8.4 记不住语法怎么办:善用官方文档和帮助
很多零基础朋友学完就忘,尤其是那些内置方法和返回值,半个月不看就忘光了。这太正常了,连我这样的老程序员也经常要查文档,真正能全部背下来的,都是天天在用的人。你用不着焦虑。
常用的查资料姿势有两种:第一,用Python自带的help函数,比如在命令行里执行help(str),就能看到字符串类型的所有方法说明;第二,直接打开Python官方文档的教程部分,网址是docs.python.org,英文看不懂可以用浏览器翻译,或者看国内质量高的中文翻译网站。搜索引擎搜“python 某方法名 + 示例”,基本都能解决90%的问题。
9. 一个完整的入门级小项目:用户信息登记薄
9.1 项目需求和分析思路
学到这里,基础语法你基本都见过了。为了让这些知识串起来,我带你写一个非常小但是完整的项目:用户信息登记薄。它能完成下面的功能:
- 让用户输入姓名、年龄、城市。
- 判断用户是否成年。
- 把信息保存到列表里。
- 支持打印所有已登记的用户信息。
这个小项目覆盖了变量、输入输出、类型转换、条件判断、循环、列表、字符串格式化这些核心知识点。代码量不大,但是五脏俱全,非常适合作为第一个练手项目。
9.2 完整代码和运行效果
下面是完整的代码,直接复制到一个user_book.py文件里运行即可:
users = [] def add_user(): print("---- 添加用户 ----") name = input("请输入姓名: ") age = int(input("请输入年龄: ")) city = input("请输入城市: ") if age >= 18: adult = "成年" else: adult = "未成年" user = {"name": name, "age": age, "city": city, "status": adult} users.append(user) print(f"用户{name}添加成功!") def show_users(): print("---- 用户列表 ----") if not users: print("还没有任何用户") return for user in users: print(f"姓名: {user['name']},年龄: {user['age']},城市: {user['city']},状态: {user['status']}") while True: print("\n1. 添加用户") print("2. 显示所有用户") print("3. 退出") choice = input("请选择操作: ") if choice == "1": add_user() elif choice == "2": show_users() elif choice == "3": print("再见!") break else: print("无效输入,请重新选择")这一段代码里,列表用来存所有用户,字典用来存每个用户的属性,函数用来组织添加和展示的逻辑,while True配合break实现菜单循环,if-elif-else处理用户选择。因为用了input获取的是字符串,年龄那一行故意用int()转换,如果用户输入了非数字,程序会抛ValueError,你可以试试看怎么用异常处理把它修复。这算留给你的一个小任务,做出来以后,你的代码处理能力会比只读不练的人高出好几个档次。
9.3 扩展思考的方向
基础版的用户可以尝试把这个项目继续扩展,比如增加删除用户的功能、把数据保存到json文件里、用字典按名字快速查找用户等等。每增加一个需求,你就会多遇到一个新的知识点,这样学起来远比看书写题有意思。
在真实世界里,Python的入门项目还有很多,比如写一个猜数字游戏、做一个简易计算器、批量重命名文件、抓取简单网页数据等等。只要把这篇基础版的知识点吃透,这些项目你已经有了动手的底气。
我个人在带新人的过程中,最深的体会就是:学编程最大的捷径其实就是多敲、多试、多犯错。错误不是打击,是反馈。你去改掉一个错误,你的理解就加深一层。Python这门语言的脾气很好,它允许你一步一步探索,不会一上来就给你一个巨大的下马威。你现在要做的,就是装好环境,把上面的示例代码亲自敲一遍,然后在这个基础上,继续往前走。