Python基础语法进阶:函数、面向对象、异常处理与模块化工程实践
Python 基础语法通常会被拆成两块来学:上面一半是变量、数据类型、条件分支、循环、字符串操作这些“跑起来再说”的内容;下面一半则是真正决定代码能不能被复用、能不能放进工程、能不能被别人看懂的语法点,包括函数、列表推导式、文件读写、异常处理、类与对象、模块与包管理。
这次我们就把 Python 基础语法(下)一次理清楚。本文会直接围绕函数定义、参数传递、推导式、文件读写、异常捕获、面向对象、模块导入、pip 安装和虚拟环境展开,每一节都有可以直接复制的代码示例、运行结果和常见报错处理。适合已经掌握 Python 基础语法上半部分、准备从“会写小脚本”过渡到“能写工程代码”的读者。
1. 本文内容速览
| 知识点 | 说明 |
|---|---|
| 函数 | 定义、调用、默认参数、可变参数、返回值、lambda |
| 推导式 | 列表推导式、字典推导式、集合推导式 |
| 文件读写 | 文本文件、with 语句、编码处理 |
| 异常处理 | try-except、else、finally、raise、自定义异常 |
| 面向对象 | 类、实例、属性、继承、property、classmethod |
| 模块与包 | import、from-import、__name__、pip、虚拟环境 |
| 常用标准库 | os、sys、json、collections、datetime、re |
学习本文之前,建议先完成一次 Python 基础语法(上)的练习,至少能独立写出 if-elif-else 判断和 for / while 循环。硬件方面没有特殊要求,普通笔记本装好 Python 3.8 以上版本即可。
2. 环境准备与运行方式
2.1 检查 Python 版本
打开终端或命令行,输入:
如果命令无法识别,说明 Python 没有加入系统环境变量。Windows 下安装 Python 时要注意勾选 “Add Python to PATH”,装完重新打开终端再试一次。
想要确认 Python 的可执行路径,可以使用:
如果系统同时装了多个 Python 版本,建议使用 py 启动器:
2.2 三种常见运行方式
| 方式 | 适用场景 | 命令 |
|---|---|---|
| 交互式终端 | 快速验证单条语法 | python 进入 REPL |
| 脚本文件 | 正式写代码和练习 | python demo.py |
| Jupyter Notebook | 分段教学和数据分析 | jupyter notebook |
本文示例全部以脚本文件方式运行。建议在本地建一个专门的练习目录,例如 python-course,把每个示例保存成独立 .py 文件,方便逐个执行。
3. 函数:从定义到高阶用法
函数是 Python 代码复用的基本单位。把一段有特定功能的代码封装成函数,后续在多个位置调用同一个函数,可以显著减少重复代码。
3.1 函数基本定义
运行结果:
这里的 def 是定义函数的关键字,greet 是函数名,name 是参数,return 把结果返回给调用方。
3.2 默认参数
函数可以给参数设置默认值。调用时如果不传该参数,就使用默认值。
运行结果:
默认参数要放在非默认参数后面,否则会报 SyntaxError: non-default argument follows default argument。
3.3 返回值与多返回值
Python 函数可以返回多个值,本质是返回一个元组。
3.4 可变参数 *args 和关键字参数 **kwargs
当函数参数数量不确定时,可以使用 *args 接收任意多个位置参数,**kwargs 接收任意多个关键字参数。
运行结果:
这在写装饰器、通用配置函数、框架扩展时非常常用。
3.5 lambda 表达式
lambda 用于定义简单的匿名函数,适合在排序、筛选等一次性场景中使用。
运行结果:
3.6 递归函数
递归是函数调用自身的写法,适用于树形结构遍历、分治算法等场景。写递归时必须有终止条件,否则会报 RecursionError。
上面的代码计算 5 的阶乘,结果为 120。
4. 推导式:一行代码提升效率
推导式是 Python 中非常实用的语法糖,常见的有列表推导式、字典推导式和集合推导式。它能把传统多行循环压缩成一行,同时代码可读性依然清晰。
4.1 列表推导式
传统写法:
推导式写法:
运行结果:
还可以加条件:
运行结果:
4.2 字典推导式
运行结果:
4.3 集合推导式
运行结果:
4.4 推导式使用建议
推导式不是万能的。当逻辑分支较多、嵌套层次较深时,普通 for 循环更容易阅读和维护。建议遵循一个原则:单层循环加上一个简单条件用推导式,多层嵌套或复杂业务逻辑用普通循环。
5. 文件读写与编码处理
文件读写是 Python 基础语法中最常被实际项目使用的部分之一。日志分析、数据导入导出、配置文件处理都离不开它。
5.1 写入文本文件
这里的 with 语句会在代码块结束后自动关闭文件,避免忘记 f.close()。
5.2 读取文本文件
如果需要按行读取,可以使用 readlines() 或者直接迭代文件对象:
strip() 会去掉每行末尾的换行符。
5.3 追加写入
追加内容时不覆盖原文件,使用 "a" 模式:
5.4 文件打开模式速查
| 模式 | 说明 |
|---|---|
"r" |
只读,文件不存在会报错 |
"w" |
写入,文件不存在会创建,存在会覆盖 |
"a" |
追加,文件不存在会创建 |
"rb" |
以二进制只读方式打开 |
"wb" |
以二进制写入方式打开 |
5.5 编码问题排查
Windows 系统默认编码可能是 GBK,Python 读取文本时如果未指定编码,可能出现 UnicodeDecodeError。解决方案是打开文件时统一指定:
如果原文件本身是 GBK 编码,则需要把参数改为 encoding="gbk",或者统一把源文件另存为 UTF-8 格式。
6. 异常处理:让程序不轻易崩溃
程序运行过程中,文件不存在、网络超时、用户输入格式错误等情况都可能引发异常。异常处理的作用是让程序在出错时给出明确提示,而不是直接中断。
6.1 try-except 基本结构
如果用户输入 abc,会输出“输入的不是合法数字”;输入 0,会输出“除数不能为 0”。
6.2 else 和 finally
else 在异常没有发生时执行,finally 在不管有没有异常都会执行,适合做资源释放。
6.3 raise 主动抛出异常
在函数中检查到非法参数时,可以主动抛出一个异常:
6.4 自定义异常
复杂的项目中,自定义异常可以让调用方更清楚地知道错误类型。
注意事项:异常处理不能滥用,不要把业务逻辑的错误全部藏到 except Exception 里不处理,那样会让调试变得非常困难。捕获异常后至少要打印日志或记录上下文。
7. 面向对象:类、继承与实用方法
Python 是面向对象语言。当你需要把数据和操作数据的方法封装在一起时,就会用到类。
7.1 定义类和实例化
__init__ 是初始化方法,在创建实例时自动调用。self 指向当前实例本身,通过它访问实例属性。
school 是类属性,所有实例共享;name 是实例属性,每个实例独立保存。
7.2 继承
子类继承父类后,可以直接复用父类的方法,也可以重写。
运行结果:
7.3 super() 调用父类方法
7.4 property 属性装饰器
@property 可以把方法变成属性访问,适合在赋值之前做校验。
7.5 classmethod 与 staticmethod
classmethod 第一个参数是 cls,可以访问类属性;staticmethod 与类和实例都无关,相当于放在类里的普通函数。
8. 模块、包与第三方库管理
当单个 .py 文件越来越长时,需要把代码拆分成多个模块和包。
8.1 模块导入
假设有文件 utils.py:
在另一个文件里导入:
8.2 if __name__ == "__main__"
这个判断在 Python 工程中非常常见,作用是:当文件被直接运行时执行里面的代码,当文件被 import 时不执行。
这样写的好处是模块被别处导入时不会产生副作用。
8.3 包的目录结构
一个最小的 Python 包结构:
__init__.py 文件标记这个目录是一个 Python 包,可以留空,也可以写包的导出信息。
8.4 pip 安装第三方库
安装第三方库的基础命令:
安装指定版本:
卸载库:
查看已安装库:
如果 pip 下载速度不理想,可以临时使用国内镜像源:
8.5 使用虚拟环境
每个项目使用独立的虚拟环境,可以避免不同项目的依赖版本互相冲突。
创建虚拟环境:
激活虚拟环境:
Windows:
macOS / Linux:
退出虚拟环境:
激活后终端提示符前面会出现 (venv),此时再用 pip install 安装的库只会安装到当前虚拟环境中。
8.6 导出和安装依赖
9. 常用标准库速查
Python 标准库非常丰富,这里挑几个在实际项目中几乎每天都会用到的库做速查。
9.1 os 和 sys
9.2 json
ensure_ascii=False 是为了让中文在 JSON 文件中正常显示,indent=2 控制缩进格式。
9.3 collections
Counter 是统计频次的实用工具:
运行结果:
9.4 datetime
9.5 re 正则表达式
运行结果:
正则表达式内容较多,初学阶段先掌握 re.search、re.findall、re.sub 三个函数即可。
10. 常见错误与排查方法
| 错误现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
ModuleNotFoundError |
模块未安装或不在搜索路径 | 检查导入路径,用 pip list 查看已装库 |
pip install 模块名 或调整项目目录结构 |
SyntaxError |
括号未闭合、缩进错误、中文标点 | 查看错误提示的行号,检查上一行 | 统一使用 4 个空格缩进,避免 TAB 与空格混用 |
TypeError: missing 1 required positional argument |
调用函数时没有传够参数 | 查看函数定义签名 | 补齐参数或用默认参数 |
NameError |
变量名拼写错误或未定义 | 检查变量赋值位置和拼写 | 修正变量名 |
UnicodeDecodeError |
文件编码与打开方式不一致 | 确认文件编码格式 | 打开文件时指定 encoding |
RecursionError |
递归没有终止条件或层数过深 | 检查递归函数的退出逻辑 | 补充终止条件或改用循环 |
PermissionError |
没有权限写入文件 | 检查文件属性和运行用户 | 更换目录或修改文件权限 |
IndexError |
列表下标超出范围 | 检查集合长度 | 先判断长度再取值 |
这些错误在基础语法练习阶段最容易出现。看到报错先读最后一行,大多数 Python 报错信息已经把行号和错误类型标得很清楚了。
11. 最佳实践与学习建议
Python 基础语法(下)学完之后,建议按下面几条路径进行练习。
第一,所有代码示例不要只看,要逐个手动敲一遍。手敲和复制粘贴的效果差别很大,尤其是缩进和中文引号问题,只有自己写过才会真正遇到。
第二,做一个小型的综合练习。例如写一个“学生成绩管理”脚本,要求包含函数、类、文件读写和异常处理。先不加第三方库,把上面的语法点全部串起来。
第三,拆分项目目录。建议每个练习项目保留独立目录,并尽早使用虚拟环境,从第一个项目开始就养成隔离依赖的习惯。
第四,在写代码的过程中把常见错误记下来,建立自己的错误笔记。这一篇表格里的错误类型是入门阶段最高频的,后面还会遇到配置错误、环境变量错误和网络相关错误,逐步补齐即可。
第五,学习面向对象时不要一开始就追求设计模式。先把类、属性、方法、继承这四件事练熟,等接触真实项目需求后,再理解为什么需要封装和抽象。
第六,涉及读取文件内容、批量处理数据等任务时,先在测试小文件上验证逻辑,确认结果正确后再扩展到生产数据。这样可以避免一次处理大量文件时出现覆盖和误操作。
12. 下一步可以做什么
Python 基础语法的上下两部分都掌握后,可以尝试的方向包括:用 requests 和 BeautifulSoup 做网页数据采集、用 pandas 做表格数据分析、用 Flask 或 FastAPI 写本地接口服务、用 openpyxl 处理 Excel 文件、用 PyQt 或 Tkinter 做桌面工具。
基础阶段最容易踩的坑,一个是过度依赖复制粘贴导致代码风格混乱,另一个是看到复杂功能就急着去学框架。更稳妥的顺序是先花一周把这些基础语法点做熟,再根据方向选择对应库。下一课可以接着写一个综合案例,把这一章的函数、类、文件读写和异常处理全部用进同一个脚本里。