本文是我 Agent 开发学习路线的 Python 基础阶段笔记后续会持续更新 Agent 相关的进阶内容欢迎关注我的专栏「Agent 学习」一起进步。Python 入门到进阶完整学习笔记 | 基础语法 容器 函数 面向对象本文整理了 Python 从环境搭建、基础语法、流程控制、五大数据容器、函数、面向对象、异常处理、模块与包全套入门知识点包含大量实操代码、经典案例、易错点与开发快捷键适合零基础自学、复习、面试复盘使用。Python启航初识荷兰计算机科学家吉多·范罗苏姆龟叔在1991年发布的编程语言环境准备解释器Python官网https://www.python.org/在python解释器退出到windowsexit()一次性执行多行python代码,将多行python代码定义在一个文件中(hello.py),然后用python命令运行:python xxx.py(先切换到指定目录)编写程序,英文符号开发工具IDE:集成开发工具Shiftalt句号 调大字体Shiftalt逗号 调小字体入门程序注释:#快捷键:ctrl/Python中使用;作为语句分隔符,使用换行符作为终止符剖析—目录结构.idea文件:保存项目的配置信息.venv文件:虚拟环境,保存项目的环境信息通过虚拟的运行.venv,可以保证每个Python项目都在一个相对独立的隔离环境中运行,项目与项目之间互不影响剖析—配置设置-外观与行为Python核心语法数据存储与运算字面量与变量字面量程序中直接书写的固定值变量程序中用来存储单个数据的容器变量是指存储数据的容器(空间),而不是其中存储的数据Python是动态类型语言,在程序运行时才进行检查,变量的类型可以在程序运行过程中改变(一个变量可以接收不同类型的值)定义格式:变量名 变量的值连续赋值:a,b 1,‘‘python’’标识符字母数字下划线不能以数字开头不能使用关键字严格区分大小写true合法 True非法(因为是关键字)命名规范见名知意多部分使用下划线连接:(蛇形命名法):update_time英文字母全小写PEP8:代码规范文档指南常见数据类型变量本身没有类型,type(变量)输出的类型时变量中存储的数据的类型type(要查看类型的数据)isinstance(数据,类型) # True False字符串字符:是文本世界的基本单位,也是字符串的基本组成单位# 定义字符串的三种方式 s1 string s2 python # 英文缩写要转义 msg It\s very good # 上面两种不支持换行,要做字符串的拼接 s3 hello: 欢迎学习 卡基地和hi火车 #多行字符串 print(s1) print(type(s1))字符串拼接[!CAUTION]号可以用来拼接两个字符串,但是无法将非字符串与字符串进行拼接(非字符串需要转换为字符串类型)str(int数字)-str(age) 将int类型的数字转为字符串字符串格式化%占位符注意:前面有多少个占位符(%s),后面就需要有多少个变量(或数据),前后数量要一致f”内容{变量/表达式}”输入与输出[!CAUTION]无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型name input(请输入您的姓名:) print(f您的姓名是{name}) age input(请输入您的年龄:) print(f您的年龄是{age})运算符算术运算符y float(input(y:))精度损失:由于计算机底层是基于二进制进行数据的存储与处理,二进制是无法准确的表示所有的小数,因此涉及到浮点数的运算,可能损失精度赋值运算符有浮点数参与运算,答案也是浮点数,哪怕是整除//比较运算符逻辑运算符数据的逻辑处理—流程控制语句条件判断基本格式进阶if语句的嵌套pass是一个空语句,起到一个语法占位的作用模式匹配match…case循环whileformsg input(请输入要遍历的字符串:) for s in msg: print(f元素{s}) else: print(结束)range嵌套循环shift回车(enter) 快速回车print(“*”):print自带换行效果,每一次执行都会输出新的一行中print(“*”,end“ ”):end表示的是每一次输出以什么结束;默认\n,表示换行,不想换行就为空字符串m int(input(长度:)) n int(input(宽度:)) for j in range(n): for i in range(m): print(*,end ) print()# 打印99乘法表 for i in range(1,10): # 外层循环,控制行 for j in range(1,i1): # 内层循环,控制列 print(f{j} x {i} {j*i},end\t) print()break:只能出现在循环中,表示跳出循环的含义(break跳出循环时,while后面else中的代码不会执行)continue:只能出现在循环中,表示中断本次循环,直接进入下一次循环数据存储容器列表(list)注意:如果指定的索引超出范围,索引报错有序:输入和取出值的大小一致切片常见方法内置的常见功能(添加元素\删除元素\排序等)案例解包推导式s1 [i**2 for i in range(1,21)] print(s1) s [12,15,48,96,88,36,77,91,53,11] s1 [i**2 for i in s if i%20] print(s1) # 去重 # for num in s: # if num not in s3: # s3.append(num) # print(s3)字符串(str)基本操作常用方法案例if mail.count()1 and . in mail:# 回文 s input(输入一个字符串:) s_reverse s[::-1] print(s_reverses) #反转后大写后输出 lst [] for i in range(0,10): s input(请输入字符串:) s_reverse s[::-1] s_reverse s_reverse.upper() lst.append(s_reverse) for i in lst: print(i,end )元组(tuple)基本操作组包与解包a 10 b 20 #a,b b,a # 组包 t b,a # 解包 a,b t print(a,b)案例集合(set)基本操作无序,不可重复,可修改的数据容器空集合:s set() print(s) print(type(s))[!CAUTION]空集合的定义不可以使用{},{}表示的是空字典,由于集合是无序的,因此不支持下标索引访问案例字典(dict)里面存储的是键值对(key:value)类型的数据,可以根据键(key)找到对应的值(value)字典定义key不能重复,如果重复,后面的值会覆盖掉前面的值key必须是不可变类型(str,int ,float,tuple),不能是list,set,dict常用操作遍历# 遍历 for k in dict1.keys(): print(f{k}:{dict1[k]}) for item in dict1.items(): print(f{item[0]}:{item[1]}) for k,v in dict1.items(): print(f{k}:{v})案例同时进行列编辑:altshift列总结函数Python内置函数:提前定义好的可以重复使用实现特定功能函数基础函数定义函数定义的时候并不会执行,只有在调用的时候,函数体的逻辑才会执行函数必须先定义,后调用函数的参数与返回值如果返回值有多个,多个返回值之间逗号分隔,多个返回值会封装到元组中保留一位小数round(2*3.14*r,1)解包操作def circle_area_len(r): return 3.14*r*r,round(2*3.14*r,1) a,l circle_area_len(10) print(a) print(l)函数说明文档函数的嵌套调用案例回文:用切片reverse_s s[::-1] return s reverse_s函数进阶函数变量的作用域函数参数详解传参方式默认参数跳过一个默认参数,后面的默认参数要使用关键字参数指定传入(默认是位置参数)不定长参数这里*agrs只封装位置参数,关键字参数不会封装到元组里面元组保留一位小数:round(参数,保留小数个数)**kwargs封装关键字参数为字典参数类型匿名函数reversefalse(默认)案例递归调用:函数中自己调用自己的情况(先层层递进,再逐层回归)一定要有终结点类型注解基本介绍类型注解只是起到语法提示作用,并不会影响程序运行的结果函数类型注解模块导入模块自定义模块常量:名字全大写字符串重复输出:(‘’-‘’ * 30)重复输出30次导入模块会输出被导入模块的测试代码(print()语句)__name__ :Python中的内置变量,表示的当前模块的名字(直接运行当前模块,__ name__ 的值为’__ main __ ‘’(字符串),当该模块被导入时,__ __ name __的值就是模块名称)执行当前文件,则会执行如下代码,如果被当作模块导入,则如下代码不执行ctrly直接删除一行软件包(package)# 如果要通过from utils import * 导入包下的所有模块,需要__init__.py 文件中添加__all__[] __all__ [ my_fun, my_var ] from utils import * my_var.log_separator2() print(my_fun.PI)# 相对路径:从当前文件所在目录开始查找 # from utils.my_var import log_separator3 # 绝对路径:从项目的根目录下开始查找 from 第二章.utils.my_var import log_separator3 log_separator3()面向对象基础类与对象动态添加属性:不推荐推荐:class Car: # __init__ 方法是初始化的方法,会在对象创建时自动调用,可以在该方法中为对象设置对应的属性 # self:是第一个参数,表示当前所创建出来的实例对象 def __init__(self,c_color,c_brand,c_name,c_price): # self.属性参数值 self.colorc_color self.brandc_brand self.namec_name self.pricec_price print(初始化完毕) # 创建对象 c1 Car(红色,BMW,x7,800000) print(c1.__dict__)实例方法魔法方法实例属性与类属性通过实例对象,查找属性时,会先查找实例属性;实例属性不存在,再查找类属性实例属性属于单个对象每个对象独有类属性属于类被所有实例对象共享案例异常常见异常类型常见的有这些ZeroDivisionError # 除数为 0 IndexError # 下标越界 KeyError # 字典 key 不存在 NameError # 变量名不存在 TypeError # 类型错误 ValueError # 值错误 FileNotFoundError # 文件不存在 AttributeError # 对象没有这个属性或方法 ImportError # 导入模块失败举几个例子# KeyError d {name: Tom} print(d[age]) # TypeError print(年龄 18) # ValueError num int(abc)注意区分TypeError和ValueErrorint([1, 2, 3]) # TypeError类型不合适 int(abc) # ValueError类型是字符串没问题但值不能转成整数try…except 基本用法格式try: 可能出错的代码 except 异常类型: 出错后的处理代码例子try: a int(input(请输入一个数字)) print(10 / a) except ZeroDivisionError: print(除数不能为 0) except ValueError: print(请输入合法数字)如果用户输入0会进入except ZeroDivisionError如果用户输入abc会进入except ValueError捕获多个异常可以分开写try: x int(input(请输入数字)) print(10 / x) except ValueError: print(输入的不是数字) except ZeroDivisionError: print(不能除以 0)也可以合并写try: x int(input(请输入数字)) print(10 / x) except (ValueError, ZeroDivisionError): print(输入有问题)分开写的好处是可以针对不同错误给不同提示。捕获异常对象 as etry: print(10 / 0) except ZeroDivisionError as e: print(发生错误, e)输出发生错误 division by zeroe就是异常对象里面保存了错误信息。Exception捕获大多数异常try: x int(input(请输入数字)) print(10 / x) except Exception as e: print(程序出错, e)Exception是很多常见异常的父类可以捕获大多数普通错误。但是不建议一上来就无脑写except Exception: pass因为这会把错误隐藏掉程序出问题你也不知道。比如try: result 10 / 0 except Exception: pass程序不会报错但你也不知道它其实失败了。else没有异常时执行try: x int(input(请输入数字)) except ValueError: print(输入错误) else: print(转换成功, x)else的意思是try里面没有发生异常才执行。更完整一点try: x int(input(请输入除数)) result 10 / x except ValueError: print(请输入数字) except ZeroDivisionError: print(不能除以 0) else: print(结果是, result)finally不管有没有异常都执行try: f open(test.txt, r, encodingutf-8) content f.read() except FileNotFoundError: print(文件不存在) finally: print(程序结束)finally常用于释放资源比如关闭文件、关闭数据库连接、释放锁等。更常见的是f None try: f open(test.txt, r, encodingutf-8) content f.read() print(content) except FileNotFoundError: print(文件不存在) finally: if f: f.close()不过实际开发中文件处理更推荐用with open(test.txt, r, encodingutf-8) as f: content f.read()with会自动关闭文件比finally更方便。raise主动抛出异常有时候不是 Python 自动报错而是你自己判断不合法然后主动抛异常。def set_age(age): if age 0: raise ValueError(年龄不能小于 0) print(年龄是, age) set_age(-1)会报ValueError: 年龄不能小于 0这在函数参数校验里很常见。比如def divide(a, b): if b 0: raise ZeroDivisionError(除数不能为 0) return a / b自定义异常可以自己定义异常类通常继承Exceptionclass AgeError(Exception): pass def set_age(age): if age 0 or age 150: raise AgeError(年龄范围不合法) print(年龄设置成功) try: set_age(200) except AgeError as e: print(年龄错误, e)输出年龄错误 年龄范围不合法自定义异常常用于大型项目中让错误类型更清晰。比如class LoginError(Exception): pass class PermissionError(Exception): pass class BalanceNotEnoughError(Exception): pass这样看到异常名字就知道业务出错原因。异常的执行流程看这个例子try: print(1) print(10 / 0) print(2) except ZeroDivisionError: print(3) finally: print(4) print(5)输出1 3 4 5解释print(1) # 正常执行 print(10 / 0) # 出错跳到 except print(2) # 不执行 except # 捕获异常输出 3 finally # 一定执行输出 4 后续代码继续执行输出 5异常处理的常见写法写法一用户输入校验while True: try: age int(input(请输入年龄)) break except ValueError: print(输入错误请输入整数) print(你的年龄是, age)写法二读取文件try: with open(data.txt, r, encodingutf-8) as f: data f.read() except FileNotFoundError: print(文件不存在) except PermissionError: print(没有权限读取文件)写法三网络请求、数据库操作try: # 连接数据库 # 查询数据 pass except Exception as e: print(操作失败, e) finally: # 关闭连接 pass总结try: 可能出错的代码 except 错误类型: 出错后的处理 else: 没出错时执行 finally: 不管出不出错都执行本篇覆盖 Python 零基础核心语法、数据容器、函数、面向对象、异常处理、模块包是入门必备全套知识点建议多敲代码练习案例吃透基础再进阶爬虫 / 数据分析 / 后端等方向。
《Python 入门到进阶完整学习笔记 | 基础语法 + 容器 + 函数 + 面向对象》
发布时间:2026/6/8 2:14:35
本文是我 Agent 开发学习路线的 Python 基础阶段笔记后续会持续更新 Agent 相关的进阶内容欢迎关注我的专栏「Agent 学习」一起进步。Python 入门到进阶完整学习笔记 | 基础语法 容器 函数 面向对象本文整理了 Python 从环境搭建、基础语法、流程控制、五大数据容器、函数、面向对象、异常处理、模块与包全套入门知识点包含大量实操代码、经典案例、易错点与开发快捷键适合零基础自学、复习、面试复盘使用。Python启航初识荷兰计算机科学家吉多·范罗苏姆龟叔在1991年发布的编程语言环境准备解释器Python官网https://www.python.org/在python解释器退出到windowsexit()一次性执行多行python代码,将多行python代码定义在一个文件中(hello.py),然后用python命令运行:python xxx.py(先切换到指定目录)编写程序,英文符号开发工具IDE:集成开发工具Shiftalt句号 调大字体Shiftalt逗号 调小字体入门程序注释:#快捷键:ctrl/Python中使用;作为语句分隔符,使用换行符作为终止符剖析—目录结构.idea文件:保存项目的配置信息.venv文件:虚拟环境,保存项目的环境信息通过虚拟的运行.venv,可以保证每个Python项目都在一个相对独立的隔离环境中运行,项目与项目之间互不影响剖析—配置设置-外观与行为Python核心语法数据存储与运算字面量与变量字面量程序中直接书写的固定值变量程序中用来存储单个数据的容器变量是指存储数据的容器(空间),而不是其中存储的数据Python是动态类型语言,在程序运行时才进行检查,变量的类型可以在程序运行过程中改变(一个变量可以接收不同类型的值)定义格式:变量名 变量的值连续赋值:a,b 1,‘‘python’’标识符字母数字下划线不能以数字开头不能使用关键字严格区分大小写true合法 True非法(因为是关键字)命名规范见名知意多部分使用下划线连接:(蛇形命名法):update_time英文字母全小写PEP8:代码规范文档指南常见数据类型变量本身没有类型,type(变量)输出的类型时变量中存储的数据的类型type(要查看类型的数据)isinstance(数据,类型) # True False字符串字符:是文本世界的基本单位,也是字符串的基本组成单位# 定义字符串的三种方式 s1 string s2 python # 英文缩写要转义 msg It\s very good # 上面两种不支持换行,要做字符串的拼接 s3 hello: 欢迎学习 卡基地和hi火车 #多行字符串 print(s1) print(type(s1))字符串拼接[!CAUTION]号可以用来拼接两个字符串,但是无法将非字符串与字符串进行拼接(非字符串需要转换为字符串类型)str(int数字)-str(age) 将int类型的数字转为字符串字符串格式化%占位符注意:前面有多少个占位符(%s),后面就需要有多少个变量(或数据),前后数量要一致f”内容{变量/表达式}”输入与输出[!CAUTION]无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型name input(请输入您的姓名:) print(f您的姓名是{name}) age input(请输入您的年龄:) print(f您的年龄是{age})运算符算术运算符y float(input(y:))精度损失:由于计算机底层是基于二进制进行数据的存储与处理,二进制是无法准确的表示所有的小数,因此涉及到浮点数的运算,可能损失精度赋值运算符有浮点数参与运算,答案也是浮点数,哪怕是整除//比较运算符逻辑运算符数据的逻辑处理—流程控制语句条件判断基本格式进阶if语句的嵌套pass是一个空语句,起到一个语法占位的作用模式匹配match…case循环whileformsg input(请输入要遍历的字符串:) for s in msg: print(f元素{s}) else: print(结束)range嵌套循环shift回车(enter) 快速回车print(“*”):print自带换行效果,每一次执行都会输出新的一行中print(“*”,end“ ”):end表示的是每一次输出以什么结束;默认\n,表示换行,不想换行就为空字符串m int(input(长度:)) n int(input(宽度:)) for j in range(n): for i in range(m): print(*,end ) print()# 打印99乘法表 for i in range(1,10): # 外层循环,控制行 for j in range(1,i1): # 内层循环,控制列 print(f{j} x {i} {j*i},end\t) print()break:只能出现在循环中,表示跳出循环的含义(break跳出循环时,while后面else中的代码不会执行)continue:只能出现在循环中,表示中断本次循环,直接进入下一次循环数据存储容器列表(list)注意:如果指定的索引超出范围,索引报错有序:输入和取出值的大小一致切片常见方法内置的常见功能(添加元素\删除元素\排序等)案例解包推导式s1 [i**2 for i in range(1,21)] print(s1) s [12,15,48,96,88,36,77,91,53,11] s1 [i**2 for i in s if i%20] print(s1) # 去重 # for num in s: # if num not in s3: # s3.append(num) # print(s3)字符串(str)基本操作常用方法案例if mail.count()1 and . in mail:# 回文 s input(输入一个字符串:) s_reverse s[::-1] print(s_reverses) #反转后大写后输出 lst [] for i in range(0,10): s input(请输入字符串:) s_reverse s[::-1] s_reverse s_reverse.upper() lst.append(s_reverse) for i in lst: print(i,end )元组(tuple)基本操作组包与解包a 10 b 20 #a,b b,a # 组包 t b,a # 解包 a,b t print(a,b)案例集合(set)基本操作无序,不可重复,可修改的数据容器空集合:s set() print(s) print(type(s))[!CAUTION]空集合的定义不可以使用{},{}表示的是空字典,由于集合是无序的,因此不支持下标索引访问案例字典(dict)里面存储的是键值对(key:value)类型的数据,可以根据键(key)找到对应的值(value)字典定义key不能重复,如果重复,后面的值会覆盖掉前面的值key必须是不可变类型(str,int ,float,tuple),不能是list,set,dict常用操作遍历# 遍历 for k in dict1.keys(): print(f{k}:{dict1[k]}) for item in dict1.items(): print(f{item[0]}:{item[1]}) for k,v in dict1.items(): print(f{k}:{v})案例同时进行列编辑:altshift列总结函数Python内置函数:提前定义好的可以重复使用实现特定功能函数基础函数定义函数定义的时候并不会执行,只有在调用的时候,函数体的逻辑才会执行函数必须先定义,后调用函数的参数与返回值如果返回值有多个,多个返回值之间逗号分隔,多个返回值会封装到元组中保留一位小数round(2*3.14*r,1)解包操作def circle_area_len(r): return 3.14*r*r,round(2*3.14*r,1) a,l circle_area_len(10) print(a) print(l)函数说明文档函数的嵌套调用案例回文:用切片reverse_s s[::-1] return s reverse_s函数进阶函数变量的作用域函数参数详解传参方式默认参数跳过一个默认参数,后面的默认参数要使用关键字参数指定传入(默认是位置参数)不定长参数这里*agrs只封装位置参数,关键字参数不会封装到元组里面元组保留一位小数:round(参数,保留小数个数)**kwargs封装关键字参数为字典参数类型匿名函数reversefalse(默认)案例递归调用:函数中自己调用自己的情况(先层层递进,再逐层回归)一定要有终结点类型注解基本介绍类型注解只是起到语法提示作用,并不会影响程序运行的结果函数类型注解模块导入模块自定义模块常量:名字全大写字符串重复输出:(‘’-‘’ * 30)重复输出30次导入模块会输出被导入模块的测试代码(print()语句)__name__ :Python中的内置变量,表示的当前模块的名字(直接运行当前模块,__ name__ 的值为’__ main __ ‘’(字符串),当该模块被导入时,__ __ name __的值就是模块名称)执行当前文件,则会执行如下代码,如果被当作模块导入,则如下代码不执行ctrly直接删除一行软件包(package)# 如果要通过from utils import * 导入包下的所有模块,需要__init__.py 文件中添加__all__[] __all__ [ my_fun, my_var ] from utils import * my_var.log_separator2() print(my_fun.PI)# 相对路径:从当前文件所在目录开始查找 # from utils.my_var import log_separator3 # 绝对路径:从项目的根目录下开始查找 from 第二章.utils.my_var import log_separator3 log_separator3()面向对象基础类与对象动态添加属性:不推荐推荐:class Car: # __init__ 方法是初始化的方法,会在对象创建时自动调用,可以在该方法中为对象设置对应的属性 # self:是第一个参数,表示当前所创建出来的实例对象 def __init__(self,c_color,c_brand,c_name,c_price): # self.属性参数值 self.colorc_color self.brandc_brand self.namec_name self.pricec_price print(初始化完毕) # 创建对象 c1 Car(红色,BMW,x7,800000) print(c1.__dict__)实例方法魔法方法实例属性与类属性通过实例对象,查找属性时,会先查找实例属性;实例属性不存在,再查找类属性实例属性属于单个对象每个对象独有类属性属于类被所有实例对象共享案例异常常见异常类型常见的有这些ZeroDivisionError # 除数为 0 IndexError # 下标越界 KeyError # 字典 key 不存在 NameError # 变量名不存在 TypeError # 类型错误 ValueError # 值错误 FileNotFoundError # 文件不存在 AttributeError # 对象没有这个属性或方法 ImportError # 导入模块失败举几个例子# KeyError d {name: Tom} print(d[age]) # TypeError print(年龄 18) # ValueError num int(abc)注意区分TypeError和ValueErrorint([1, 2, 3]) # TypeError类型不合适 int(abc) # ValueError类型是字符串没问题但值不能转成整数try…except 基本用法格式try: 可能出错的代码 except 异常类型: 出错后的处理代码例子try: a int(input(请输入一个数字)) print(10 / a) except ZeroDivisionError: print(除数不能为 0) except ValueError: print(请输入合法数字)如果用户输入0会进入except ZeroDivisionError如果用户输入abc会进入except ValueError捕获多个异常可以分开写try: x int(input(请输入数字)) print(10 / x) except ValueError: print(输入的不是数字) except ZeroDivisionError: print(不能除以 0)也可以合并写try: x int(input(请输入数字)) print(10 / x) except (ValueError, ZeroDivisionError): print(输入有问题)分开写的好处是可以针对不同错误给不同提示。捕获异常对象 as etry: print(10 / 0) except ZeroDivisionError as e: print(发生错误, e)输出发生错误 division by zeroe就是异常对象里面保存了错误信息。Exception捕获大多数异常try: x int(input(请输入数字)) print(10 / x) except Exception as e: print(程序出错, e)Exception是很多常见异常的父类可以捕获大多数普通错误。但是不建议一上来就无脑写except Exception: pass因为这会把错误隐藏掉程序出问题你也不知道。比如try: result 10 / 0 except Exception: pass程序不会报错但你也不知道它其实失败了。else没有异常时执行try: x int(input(请输入数字)) except ValueError: print(输入错误) else: print(转换成功, x)else的意思是try里面没有发生异常才执行。更完整一点try: x int(input(请输入除数)) result 10 / x except ValueError: print(请输入数字) except ZeroDivisionError: print(不能除以 0) else: print(结果是, result)finally不管有没有异常都执行try: f open(test.txt, r, encodingutf-8) content f.read() except FileNotFoundError: print(文件不存在) finally: print(程序结束)finally常用于释放资源比如关闭文件、关闭数据库连接、释放锁等。更常见的是f None try: f open(test.txt, r, encodingutf-8) content f.read() print(content) except FileNotFoundError: print(文件不存在) finally: if f: f.close()不过实际开发中文件处理更推荐用with open(test.txt, r, encodingutf-8) as f: content f.read()with会自动关闭文件比finally更方便。raise主动抛出异常有时候不是 Python 自动报错而是你自己判断不合法然后主动抛异常。def set_age(age): if age 0: raise ValueError(年龄不能小于 0) print(年龄是, age) set_age(-1)会报ValueError: 年龄不能小于 0这在函数参数校验里很常见。比如def divide(a, b): if b 0: raise ZeroDivisionError(除数不能为 0) return a / b自定义异常可以自己定义异常类通常继承Exceptionclass AgeError(Exception): pass def set_age(age): if age 0 or age 150: raise AgeError(年龄范围不合法) print(年龄设置成功) try: set_age(200) except AgeError as e: print(年龄错误, e)输出年龄错误 年龄范围不合法自定义异常常用于大型项目中让错误类型更清晰。比如class LoginError(Exception): pass class PermissionError(Exception): pass class BalanceNotEnoughError(Exception): pass这样看到异常名字就知道业务出错原因。异常的执行流程看这个例子try: print(1) print(10 / 0) print(2) except ZeroDivisionError: print(3) finally: print(4) print(5)输出1 3 4 5解释print(1) # 正常执行 print(10 / 0) # 出错跳到 except print(2) # 不执行 except # 捕获异常输出 3 finally # 一定执行输出 4 后续代码继续执行输出 5异常处理的常见写法写法一用户输入校验while True: try: age int(input(请输入年龄)) break except ValueError: print(输入错误请输入整数) print(你的年龄是, age)写法二读取文件try: with open(data.txt, r, encodingutf-8) as f: data f.read() except FileNotFoundError: print(文件不存在) except PermissionError: print(没有权限读取文件)写法三网络请求、数据库操作try: # 连接数据库 # 查询数据 pass except Exception as e: print(操作失败, e) finally: # 关闭连接 pass总结try: 可能出错的代码 except 错误类型: 出错后的处理 else: 没出错时执行 finally: 不管出不出错都执行本篇覆盖 Python 零基础核心语法、数据容器、函数、面向对象、异常处理、模块包是入门必备全套知识点建议多敲代码练习案例吃透基础再进阶爬虫 / 数据分析 / 后端等方向。