Python基础语法学习
1 先把环境跑起来
| 检查项 | 命令 | 正常结果 | 如果报错了怎么办? |
|---|---|---|---|
| Python 有没有装好 | python --version |
Python 3.11.9 之类 | 提示“不是内部或外部命令”→ 把 Python 加入系统 PATH |
| pip 能不能用 | python -m pip --version |
pip 24.0 … | 提示 upgrade → 照它说的 python -m pip install -U pip |
| 能不能建虚拟环境 | python -m venv venv |
出现 venv 文件夹 | 提示缺少 ensurepip → Ubuntu 用 sudo apt install python3-venv |
第一个小程序
把下面 3 行新建成 hello.py,双击或者 python hello.py 能跑就行。
|
|
拆给你看
print()是 Python 自带的“扩音器”,括号里写什么就往外吐什么。- 字符串可以用单引号
' '、双引号" "、三引号''' '''包裹,效果一样。 - 行首的
#叫“单行注释”,机器会无视,写给人类看的。 - 多行注释用三引号
'''或"""包起来,常用来写函数说明书(docstring)。
2 基础语法结构
2.1 代码长什么样才好看
|
|
小白注意
Python 用“缩进”当大括号 { },只要缩进不对就直接报 IndentationError。
2.2 变量与数据类型
|
|
拆给你看
- 变量名第一次出现时就被“贴”上数据,不需要提前声明。
type()相当于“照妖镜”,能看出变量到底是什么类型。
3 最常用的“容器”——字符串、列表、字典、元组、集合
3.1 字符串(str)
字符串是 Python 里一切文本的“万能容器”:存文字、传信息、拼格式、做清洗,既能当数据,又能当接口,让人与程序、程序与程序之间用“人话”无缝沟通。
一、查:有没有、在哪、多少次
|
|
【课堂小练习】
目标:用
in / find / index / count快速完成「有无-定位-计数」三连问。案例 1:邮箱格式快检
原始数据:
email = "user.name@example.com"任务:
- 判断是否同时包含
@与.;- 找出
@第一次出现的位置;- 统计
.在字符串里共出现几次。
二、改:大小写、去垃圾、替换
|
|
【课堂小练习】
目标:用「大小写 + 去空格 + 替换」组合技,一键把「用户手抖输入」变成「标准字段」。
案例1:收货地址标准化
原始数据:
addr = " beiJing Old-STREET #8-2-502 "任务:
- 去掉首尾空格;
- 把
#替换成「号」;- 其余部分全转小写,再把每个单词首字母大写(即
title());- 最终得到标准地址:
Beijing Old-Street 号8-2-502要求:不允许手动拼串,必须纯靠字符串方法。
三、切 & 接:split、join、切片
|
|
【课堂小练习】
目标:用「 split → join → 切片 」三步法,把“一行杂合数据”拆干净再拼成“想要的样子”。
案例:订单快照格式化
原始数据:
order = "20250909,MacBook Air,MGN63CH/A,¥8999,2"任务:
- 以逗号拆分,得到各字段列表;
- 取出日期,并切片成年/月/日三部分,用
/拼回:2025/09/09;- 把商品名与型号用「 - 」连接,形成短描述:
MacBook Air-MGN63CH/A;- 计算小计(单价 × 数量),最后按「日期 | 短描述 | 小计」格式用「 | 」拼成新字符串输出。
预期结果:
2025/09/09 | MacBook Air-MGN63CH/A | ¥17998要求:全程不允许手动写死任何字段,必须基于
split结果动态取; 每个任务完成之后,都需要输出变量的值。
四、格式化的 3 种主流写法
|
|
【课堂小练习】
目标:用「% → str.format → f-string」三种写法中的任意一种写法,把「商品单价、数量、折扣」算出的「实付金额」格式化输出。
案例:购物车小票
原始数据:
1 2 3 4product = "AirPods Pro" unit_price = 1999 quantity = 2 discount = 0.85 # 8.5 折任务:
- 计算实付:
unit_price * quantity * discount;- 格式化方式输出一行文字,参考输出:
1商品:AirPods Pro,数量:2,实付:3398.30 元要求:实付保留 2 位小数。
3.2 列表(list)
列表是 Python 的“百变收纳盒”:按序装任何东西,随时增删改排,用一条索引就能瞬间取出,让一堆数据既听话又好找。
一、创建与查看
|
|
二、增:4 种添加方式
|
|
【课堂小练习】
目标:考察学生对列表追加、扩展与定点插入三种常用修改操作的区分与灵活运用。
任务:
- 定义一个列表,包含三个元素
10,20,30;- 在尾部添加一个元素
99;- 在尾部再添加一组元素
[100, 101, 102];- 在索引
2的位置插入一个元素66;最终应输出:
[10, 20, 66, 30, 99, 100, 101, 102]
三、删:4 种删除方式
|
|
【课堂小练习】
目标:考察列表按值删除、按索引pop、默认pop及clear四种常见删除/清空操作的区分与使用。
任务:
- 定义一个列表,lst = [‘red’, ‘green’, ‘blue’, ‘green’, ‘yellow’];
- 按值删除,仅删第一个’green’ ;
- 用pop(1)取出并打印索引
1的元素及剩余列表;- 无参pop()删掉末尾元素,打印该元素及剩余列表;
- 一键清空整个列表。
要求:每一步完成之后,都需要输出列表的值。
四、改 & 排序
|
|
五、查:索引、计数、是否存在
|
|
【课堂小练习】
目标:考察列表排序、最值获取、成员存在性判断与元素计数等基础操作。
任务:
- 定义一个列表,
lst = [8, 3, 8, 5, 8, 2, 9, 3];- 原地降序排序;
- 输出最大值;
- 判断数字 8 是否存在;
- 统计数字 8 出现的次数。
要求:每一步完成之后,都需要输出列表的值。
六、综合案例
【综合案例】“班级成绩管理小系统”
你手里有一份某次测验的原始成绩单,请利用列表的各种增删改查、排序、统计操作,一次性完成以下5个子任务(每步必须输出对应结果):
-
初始化与录入
从空列表开始,依次追加5名同学的成绩:
78, 85, 92, 85, 66。 -
补录与修正
① 发现漏录一名同学,成绩为
88,请将其插入到索引2的位置;② 紧接着把
92分同学的成绩改为95。 -
去重与排序
① 仅删除第一次出现的
85;② 将列表原地按升序排列并输出。
-
统计查询
① 输出当前最高分;
② 统计
85分在新列表中出现的次数;③ 判断
90分是否存在于列表中。 -
清空备份
把处理完的最终列表一次性清空,并输出“列表已清空,长度:X”。
3.3 字典(dict)
字典是 Python 的“查表神器”:把独一无二的“键”当成门牌号,秒查到对应的“值”,让数据有名有姓、一一对应,随时增删改查。
一、创建与查看
|
|
二、增 & 改:键存在就改,不存在就增
|
|
【课堂小练习 · 字典“增改”案例】
已有字典
book = {'isbn': '978-7-111', 'title': 'Python基础'},用直接赋值方式新增价格price68 元,并把title改为'Python核心编程',打印字典。对同一字典使用
setdefault:① 若
price已存在则返回其值,否则设为 88;② 若
author不存在则新增'张三'并返回该值;依次打印两个操作的返回值及字典。
对同一字典使用
update:一次性合并{'price': 78, 'publisher': '机械工业'},其中price若已存在则覆盖,打印最终字典。
三、查:3 种取法 + 遍历全家桶
|
|
【课堂小练习 · 字典“查询与遍历”案例】
已有字典
product = {'id': 'P1001', 'spec': {'颜色': '蓝色', '尺寸': 'L'}},用方括号取出id并打印;用get取出price并打印,若不存在则返回-1。用多级
get安全方式取出spec中颜色的值并打印;再尝试取出重量并打印,若不存在则返回'无数据'。分别用三种方式遍历
product:① 只遍历所有键并依次打印;
② 同时遍历键和值,每行打印
键:值; ③ 只遍历所有值并依次打印。
四、删:pop / clear
|
|
五、综合案例
【综合案例 · 一份成绩单的“成长轨迹”】
初始空白档案
|
|
任务1 补齐个人信息
① 新增性别 gender = 'F'
② 年龄 +1 → age = 19
③ 英语成绩提至 英语 = 90
➜ 打印字典(第一次“成长”)
任务2 安全补录
① setdefault 取 age(已存在,返回 19 并打印)
② setdefault 补录 hometown = 'Hangzhou'(新增并打印)
➜ 打印字典(家乡落户)
任务3 期末总评更新
批量 update 合并 {'passed': False, 'rank': 5}(原 passed 被覆盖)
➜ 打印字典(喜提未通过 & 年级排名)
任务4 快速查询
① 方括号取 id
② get 取 phone,缺失返回 'unknown'
③ 多级 get 取 scores 内数学成绩,缺失返回 0
➜ 三个结果空格分隔一行打印
任务5 遍历全家福
① 遍历所有键
② 遍历键值对,格式 key:value
③ 遍历所有值
➜ 各用一行打印,元素间空格分隔
任务6 毕业清档
① pop 删除并返回 rank
② clear 一键清空整个字典
➜ 先打印 pop 返回值,再打印清空后字典(两行)
小白口诀
字典是“带名字的抽屉”,找东西用钥匙(键),钥匙不存在就 get 给默认,避免报错。
3.4 元组
一句话先记住:元组就是“不能改的列表”,一旦创建,长度、元素都锁死;也正因为“只读”,它才快、才安全,才能当字典/集合的钥匙。
一、创建 & 基本查看
|
|
二、只读操作(能看,不能改)
|
|
三、不可改特性演示(会报错)
|
|
四、为啥要用元组?3 个场景
-
字典键 / 集合元素 列表不能当键,元组可以:
pos = {(120.5, 30.2): "北京"} -
函数多返回值
return x, y实际返回的是一个元组。 -
并行赋值
for x, y in points:拆包遍历,代码更短更快。
3.5 集合
集合是 Python 的“排重+速算”利器:一键去重、毫秒级判断元素是否存在,还能把交集、并集、差集等集合运算变成一行代码,专治重复与关系问题。
一、创建与查看
|
|
二、增:添加元素
|
|
三、删:4 种常用删除
|
|
四、集合运算:交并差
|
|
五、综合案例
【综合案例题:小明的图书标签整理】
小明是一位图书管理员,他手头有两份本周新到馆的图书标签列表,分别来自两个不同的编目系统。每个标签用字符串表示,列表中可能存在重复标签。
列表 A(第一份): ["Python", "算法", "Python", "数据结构", "算法", "数据库"]
列表 B(第二份): ["算法", "机器学习", "数据库", "深度学习", "算法"]
现在他需要你帮忙完成以下任务:
- 使用集合一次性去除每份列表中的重复标签;
- 找出两份列表共同拥有的标签(交集);
- 统计只在第一份列表出现的标签(差集);
- 把所有去重后的标签合并成一份完整无重复的总标签库(并集);
- 最后,从总标签库中随机弹出一个标签作为本周推荐标签并打印。
要求:每一步完成之后,都需要输出结果的值。
4 程序控制流——让代码会“拐弯”
4.1 条件语句
一、单分支
单分支:只有一个“如果”,语法:
|
|
示例:
|
|
二、双分支
双分支:非此即彼,语法:
|
|
示例:
|
|
三、多分支
多分支:依次判断多个条件,语法:
|
|
注:
elif是else if的简写,表示“否则如果”。
示例:
|
|
小白注意:判断可以连写:200 <= code < 300 完全合法。
四、综合练习
某市出租车按行驶里程 distance(公里,浮点数)计费,规则如下:
- 起步价 10 元,含 2 公里;
- 2–20 公里(含):每公里 1.6 元;
- 20 公里以上:每公里 2.4 元。
请计算并输出以下三种里程的车费,结果保留到分(2 位小数):
① 1.8 km ② 18.6 km ③ 26.4 km
4.2 循环语句
循环语句的核心作用是:让计算机重复执行某段代码,直到满足特定条件为止。
Python 中有两种主流循环(while 与 for)以及配套关键字(break / continue / else)。
1.while 循环
Python 的 while 循环用于重复执行一段代码块,只要条件为真。它是“条件控制型”循环,不像 for 是“计数控制型”。
基本语法结构
|
|
- 条件表达式 返回布尔值(
True或False)。 - 每次循环开始前都会重新评估条件。
- 如果条件为
True,执行循环体;否则退出循环。
示例1:打印 1 到 5
|
|
示例2:while循环遍历列表
|
|
控制语句:break、continue、else
break:提前退出整个循环。continue:跳过本次迭代,继续下一轮。else:循环正常走完才执行(被 break 就不执行),常用于“查找失败”场景。
示例:break
|
|
示例:continue
|
|
示例:else
|
|
死循环(慎用)
|
|
⚠️ 注意:死循环必须配合
break或外部中断(如 Ctrl+C)退出。
2.for 循环
Python 的 for 循环本质上是一种 “遍历(迭代)循环”,它不会自己去“计数”,而是 逐个取“可迭代对象”里的元素,直到取完为止。
基础语法骨架
可迭代对象:list、tuple、str、bytes、range、dict、set、生成器、自定义迭代器……
- 目标变量:每次循环从可迭代对象里取出的当前元素,名字随意起。
else块:仅当循环没有被break中断时才会运行。
最常用的 6 种遍历模式
| 场景 | 代码片段 | 说明 |
|---|---|---|
| ① 遍历 list / tuple | for item in ['a','b','c']: |
元素直接拿 |
| ② 遍历字符串 | for ch in 'hello': |
逐个字符 |
| ③ 遍历字典键 | for k in d: 或 for k in d.keys(): |
默认就是键 |
| ④ 遍历字典键值对 | for k, v in d.items(): |
拆包同时拿键值 |
| ⑤ 带索引遍历 | for idx, item in enumerate(lst): |
从 0 开始计数 |
| ⑥ 指定区间步长 | for i in range(start, stop, step): |
半开区间 [start, stop) |
range函数:
|
|
示例1:遍历 list / tuple
|
|
示例2:遍历字符串(逐字符)
|
|
示例3:遍历字典的键
|
|
示例4:遍历字典的键值对
|
|
示例5:带索引遍历(enumerate)
|
|
示例6:指定区间与步长(range)
|
|
3.循环控制语句
控制语句:break、continue、else
break:提前退出整个循环。continue:跳过本次迭代,继续下一轮。else:循环正常走完才执行(被 break 就不执行),常用于“查找失败”场景。
一、break:立刻“跳出整个循环”,语法:
|
|
执行流程图
|
|
两大典型模板
① “找到即停”
|
|
② while 死循环 + break 出口
|
|
易错点
break只能跳出一层循环;嵌套多层需要在对应层写 break。- 与
if搭配时一定注意缩进,千万别把break写到if外。
二、continue:跳过“本轮剩余语句”,直接下一轮,语法:
|
|
执行流程图
|
|
典型模板——“过滤式”处理
|
|
易错点
在 while 循环里写 continue 时,务必确保循环变量仍被更新,否则容易变真·死循环:
|
|
三、for / while … else:只有“没被 break”时才跑,语法:
|
|
执行流程图
|
|
两大经典场景
① “查找失败提示”(最常用)
|
|
② “重试超限”
|
|
易错点
else 与 for/while 对齐,千万莫缩进到 if 层,否则逻辑全变。
综合示例
|
|
|
|
运行结果(仅两种可能):
|
|
或(若把范围改成 1~5)
|
|
4.综合练习
【题目 1 】
已知列表 data = [4, -3, -9, 12, 5, 6, 3, 0],用 while 循环遍历该列表(遇到 0 即停):
① 若元素值负数,则忽略;
② 当出现两次数字能被 3 整除时,立刻输出它们的和并结束程序;
③ 若遍历到 0 时仍未出现上述连续两数,输出“条件未达成”。
要求:必须使用 while、continue、break、else。
【题目 2】
驿站收到一串包裹重量(克)列表:
|
|
- 负数表示扫描失败,直接跳过;
- 一旦遇到 > 2000 克 的大件包裹,立即输出其重量并终止分拣;
- 若全部扫描完都没有大件,输出
"所有包裹均为小件,自动分拣完成"。
要求: 仅用 一次 for...else 循环实现,必须用 continue 和 break。
5 函数与模块——把代码“打包”复用
5.1 自定义函数
把“会重复用到的几行代码”取个名字,以后想用时直接喊这个名字,就能一次性跑完——这就是自定义函数。
在 Python 中,自定义函数使用 def 关键字来定义,基本语法如下:
一、基本语法结构
|
|
示例
|
|
关键点说明
| 元素 | 说明 |
|---|---|
def |
定义函数的关键字 |
| 函数名 | 应符合标识符命名规则(小写+下划线推荐) |
| 参数 | 可选,支持默认值、可变参数等 |
return |
返回值,若无则返回 None |
小白步骤
def起头 → 写函数名 → 括号里写参数。- 冒号结尾 → 函数体必须缩进。
- 想返回结果就
return,不写默认返回None。
二、函数参数的类别
在 Python 中,自定义函数的参数可以分为以下几种主要类别:
1.位置参数
- 按照参数位置依次传递,调用时必须提供。
- 是最常见的参数类型。
|
|
2.默认参数
- 默认参数必须放在非默认参数之后。
- 参数有默认值,调用时可以不传。
|
|
3.关键字参数
- 调用函数时,使用
参数名=值的形式,顺序不重要。 - 提高代码可读性。
|
|
三、综合练习
【题目 1:学生信息录入】
要求:
- 自定义函数
add_student,参数依次为name、age、gender、city(默认值为"北京")。 - 调用函数时,必须指定参数名传入
gender,其余参数可按位置或指定参数名传入。 - 函数返回格式化的字符串:
"姓名:{name},年龄:{age},性别:{gender},城市:{city}"。
示例:
|
|
【题目 2:计算订单总价】
要求:
- 自定义函数
calculate_total,参数为price、quantity(默认值为 1)、discount(默认值为1,表示无折扣,折扣值为 0~1 的小数)。 - 调用函数时,必须按指定参数名传入
discount,其余参数可按位置或指定参数名传入。 - 函数返回折后总价(保留两位小数)。
示例:
|
|
5.2 模块导入
|
|
终端中执行命令:
pip install requests
import 顺序口诀
标准库 → 第三方库 → 自己写的库,中间空一行,方便阅读。
6 文件操作——把数据“倒”进硬盘
在 Python 中,写入文件的基本语法如下:
1. 使用 open() 和 write() 方法
|
|
-
打开(或创建)文件:使用
open('example.txt', 'w', encoding='utf-8')以写入模式('w')打开一个名为example.txt的文件。- 如果文件已存在,会清空原内容;
- 如果文件不存在,会自动创建新文件。
encoding='utf-8'指定使用 UTF-8 编码写入,确保支持中文等特殊字符。
-
写入内容:
file.write('Hello, world!\n')将字符串"Hello, world!\n"写入文件。\n表示换行,写入后文件内容会另起一行。
-
关闭文件:
file.close()手动关闭文件,释放系统资源。- 关闭后,对文件的操作结束,确保数据完全写入磁盘。
【总结】这段代码会创建(或清空)一个 UTF-8 编码的 example.txt 文件,写入一行 "Hello, world!" 并换行,最后关闭文件。
2. 使用 with 语句(推荐方式)
|
|
with … as file:- 自动生成一个文件对象
file,离开 with 块时自动调用file.close(),即使中途出错也能保证文件被正确关闭。
- 自动生成一个文件对象
- 模式
'w'- 若文件已存在,原内容会被清空;不存在则新建。
encoding='utf-8'- 明确采用 UTF-8 编码,防止中文等非 ASCII 字符乱码。
write('Hello, world!\n')- 把字符串写进文件,并在行尾加换行符
\n。
- 把字符串写进文件,并在行尾加换行符
【总结】这段代码用“with 语句”以 写入模式 打开(或创建)example.txt,把 "Hello, world!\n" 写进去,写完自动关闭文件。
3. 追加写入(不覆盖原内容)
|
|
要求:在评论区提交生成的 示例.txt 文件内容的截图。
'a':以追加模式(append)打开文件。如果文件不存在,会创建新文件;如果存在,写入的内容会添加到文件末尾,不会覆盖原有内容。
4.从文件读取数据
在 Python 中,读取文件内容最常用的方式是使用内置的 open() 函数,结合 with 语句来确保文件正确关闭。以下是几种常见的读取方式:
1.读取整个文件内容
|
|
'r'表示以只读文本模式打开文件。
2.逐行读取
【方式1】
|
|
for line in f:逐行遍历文件对象f,每次循环line是一个字符串,包含当前行的内容(包括行末的换行符\n)。
【方式2】
|
|
line = f.readline():读取文件的第一行(含行尾\n),赋给变量line。若文件为空,则line为''。while line::只要读到的字符串非空,就继续循环;到文件末尾时readline()返回'',循环结束。
3.读取所有行到列表
|
|
5.课堂小练习
练习1
【课堂小练习】 文件操作练习1:将列表中的数字逐行写入文本文件
题目描述
给定一个 Python 列表 numbers,其中包含 10 个浮点数或整数元素,请编写一段程序,将列表中的每个数字按顺序逐行写入一个名为 num.txt 的文本文件中。要求使用 utf-8 编码,并在文件写入完成后,在控制台输出提示信息:“num.txt 已生成,共 10 个数字。”
要求
- 使用
with open(...)语句打开文件,确保文件正确关闭。 - 每个数字占一行,数字与数字之间不能有空行。
- 评论时截图需要截取
num.txt文件的内容。
示例
假设列表为:
|
|
程序运行后,生成的 num.txt 文件内容应为:
|
|
控制台输出:
|
|
提示
- 使用
for循环遍历列表。 - 使用字符串格式化(如 f-string)将数字转为字符串并写入文件。
- 每行末尾需添加换行符
\n。
练习2
用 Python 的 with 语句,先清空(或新建)poem.txt,依次写入两行诗句并追加两行,再完整读出打印,最后逐行统计并输出行数,确保文件最终含四句诗且被正确关闭。
任务要求:
-
若
poem.txt已存在,请先清空它;若不存在则创建。 -
向文件写入下面两行诗句(不包括行号,每行后要有换行):
1 2春眠不觉晓, 处处闻啼鸟。 -
追加第三、四行诗句:
1 2夜来风雨声, 花落知多少。 -
读取整个文件内容并赋值给变量
full_text,然后打印full_text。 -
重新以逐行方式读取文件,统计文件的总行数,并将结果打印为:
1文件共有 X 行。 -
整个过程中必须使用
with语句,确保文件被正确关闭。
请用一段完整的 Python 代码实现以上 6 个步骤,并确保最后文件 poem.txt 的内容为:
|
|
6. 写入 CSV 文件
csv文件说明
Comma-Separated Values,“逗号分隔值” 的纯文本表格格式,一行就是一条记录,字段之间用逗号(或其他符号)隔开。
没有复杂格式、没有宏,任何文本编辑器都能打开,也被 Excel、Pandas、数据库等直接识别。
核心规则(标准 RFC 4180)
- 每行一条记录,行尾
\r\n或\n。 - 字段默认用逗号
,分隔;也可指定分号、制表符等。 - 字段内容若出现 逗号、换行、双引号,整个字段必须用 双引号 包裹。
- 字段内的双引号要写成 两个连续双引号
""。 - 文件通常可选第一行做 表头(列名)。
示例
|
|
优点
- 纯文本,跨平台、跨语言、体积小。
- 读写简单,几乎任何软件/编程语言都有现成解析器。
缺点
- 只存数据,不保存类型、公式、颜色等富信息。
- 如果字段里逗号、引号多,人工阅读较乱。
一句话:CSV 就是“最小化电子表格”,用来朴素、高效地搬数据。
写入csv文件
|
|
-
newline=''阻止 Python 在 Windows 下把\n写成\r\n,避免产生空行。 -
csv.writer(file)创建一个按 CSV 规则处理逗号、引号、转义的写入器。 -
writer.writerows(rows)一次写入多行,结果文件内容:1 2 3Name,Age Alice,25 Bob,30
【总结】把二维列表 rows 写成标准 CSV 文件 data.csv,自动处理空行、UTF-8 编码,写完自动关闭文件。
7. 写入 Excel 文件
(使用 openpyxl)
|
|
-
from openpyxl import Workbook导入 openpyxl 的 Workbook 类(内存中的空 Excel 文件)。 -
wb = Workbook()创建空白工作簿,自动带一张名为 “Sheet” 的工作表。 -
ws = wb.active拿到当前活动工作表对象 ws。
-
ws['A1'] = 'Name'ws['B1'] = 'Age'给单元格直接赋值,写入表头。 -
ws.append(['Alice', 25])ws.append(['Bob', 30])按行追加列表:自动依次填到 A2/B2、A3/B3。 -
wb.save('data.xlsx')把整个工作簿写入磁盘,生成真正的.xlsx文件。
【总结】用 openpyxl 新建一个 Excel 工作簿,把表头 “Name / Age” 写在 A1/B1,再追加两行数据,最后保存为 data.xlsx。
8. JSON 文件
JSON说明
JSON(JavaScript Object Notation)是一种轻量级、文本格式的数据交换标准,易于人阅读和编写,也易于机器解析和生成。它基于 JavaScript 的子集,但独立于语言,几乎所有现代编程语言都内置支持。
核心特性
- 纯文本:完全由 Unicode 字符(如 UTF-8)组成,无二进制内容。
- 键值对结构:数据以
键:值的形式存储,键必须是双引号包裹的字符串。 - 层次化:支持嵌套的对象(Object)和数组(Array),可表示复杂数据结构。
- 无冗余:无注释(
//或/* */不允许),无尾随逗号(如[1, 2,]会报错)。
数据类型
| 类型 | 示例 | 规则 |
|---|---|---|
| 对象 | {"name": "Alice"} |
无序的键值对集合,键必须是字符串,值可以是任意合法类型。 |
| 数组 | [1, "2", true] |
有序的值列表,元素类型可混合。 |
| 字符串 | "hello\n世界" |
必须用双引号,支持转义(如 \"、\\、\u4e2d 表示 Unicode 字符)。 |
| 数字 | 42, -3.14, 1e10 |
仅支持十进制,无 NaN 或 Infinity(需用 null 或字符串替代)。 |
| 布尔值 | true, false |
小写,无其他写法(如 True 报错)。 |
| 空值 | null |
表示“无值”,区别于 0、"" 或 undefined(后者在 JSON 中非法)。 |
示例对比
合法 JSON:
|
|
非法 JSON:
|
|
常见用途
- API 通信:如 RESTful 接口的请求/响应体(如
{"code": 200, "data": {...}})。 - 配置文件:如
package.json(Node.js)、tsconfig.json(TypeScript)。 - 数据存储:NoSQL 数据库(如 MongoDB)以 JSON 格式存储文档。
JSON示例
示例1:用户配置(user-config.json)
|
|
示例2:商品列表(products.json)
|
|
示例3:RESTful 接口返回(api-user-by-id.json)
|
|
写入json文件
示例1
|
|
【代码说明】
json.dump(data, f, ensure_ascii=False, indent=4):把内存中的变量 data(通常是 dict / list 等 Python 对象)序列化成 JSON 格式的字符串,并直接写入文件 f。
ensure_ascii=False:允许写入非 ASCII 字符(如中文),否则会被转义成\uXXXX。indent=4:让 JSON 多行缩进 4 个空格,美观易读。
loaded_data = json.load(f):把文件中的 JSON 文本反序列化成 Python 对象,赋值给变量 loaded_data。此时 loaded_data 的数据类型/结构与原来的 data 基本一致(字典、列表、嵌套结构等)。
7 异常处理——让程序“摔倒了”也能爬起来
在 Python 中,异常处理主要通过 try...except...else...finally 语句来实现。基本语法如下:
1.基本语法结构
|
|
pass是一个空操作语句——什么都不做,只是占位。保持语法完整,避免解释器报错。
- try 语句块(必写)
|
|
- 只要这里面的任何一条语句抛出了异常,解释器会立即中断 try 内剩余语句,去匹配后面的 except;
- 如果 try 里没有异常,则跳过所有 except,去走 else(如果有)。
- except 语句块(0 个或多个)
|
|
- 顺序匹配:从上到下第一个类型相符的 except 会被执行,其余忽略。
e就是 被捕获的那个异常实例(对象),通过它你可以查看异常信息:print(e)或str(e)。
- else 语句块(0 个或 1 个,必须在所有 except 之后、finally 之前)
|
|
- 仅当 try 块完全没有抛异常时才执行。
- finally 语句块(0 个或 1 个,必须放在最末尾)
|
|
- 0~1 个,固定放在最后;
- 无论是否发生异常、无论是否已 return/break,都必定执行;
- 常用于释放资源。
执行顺序一张图记住:
|
|
2.基本示例
数组越界异常
|
|
数组越界捕获示例
|
|
说明:
try:包裹可能出错的代码。except:捕获并处理特定异常。else:如果try中没有异常,则执行。finally:无论是否发生异常,都会执行(常用于清理资源,如关闭文件、网络连接等)。
3.捕获所有异常
上面的IndexError只能捕获数组越界错误。可以使用下面的代码来捕获程序的所有异常。
|
|
⚠️ 注意:捕获所有异常会掩盖程序中的错误,建议只捕获你能处理的异常。
兜底所有剩余异常(类型错误、键错误、系统错误……)。
一旦前面没有命中任何“具体异常”,就会落到这一层,防止程序因为“意料之外的错误”而崩溃。
4.手动抛出异常
在 Python 中,raise 是用于手动触发异常的关键字。它的作用是让程序在特定条件下主动抛出异常,从而中断当前流程,进入异常处理机制。
基本语法
|
|
示例1
获取年龄,若为负数则主动抛出 ValueError 并捕获处理
|
|
- 提示用户输入年龄,并尝试将输入转换为整数。
- 检查年龄是否为负数:
- 如果是负数,手动抛出
ValueError异常,并附带错误信息“年龄不能是负数!”。
- 如果是负数,手动抛出
- 捕获并处理
ValueError异常:- 如果输入不是有效的整数(例如输入了字母),Python 会自动抛出
ValueError,也会被except捕获。 - 如果年龄为负数,手动抛出的
ValueError也会被捕获。
- 如果输入不是有效的整数(例如输入了字母),Python 会自动抛出
- 如果没有异常发生,则打印用户输入的年龄。
总结:这段代码用于安全地获取用户输入的年龄,并对非整数输入和负数年龄进行异常处理,避免程序崩溃。
示例2
读取用户输入的密码,若长度不足 6 位则主动抛出并捕获 ValueError,否则提示设置成功。
|
|
4.异常捕获综合示例
示例1
读取整数并计算 10 除以该数,捕获非整数或除零异常
|
|
代码功能:
| 代码段 | 功能说明 |
|---|---|
try: |
开始监视下面两行语句,任何一步抛异常都会被捕获。 |
x = int(input("请输入整数:")) |
把用户输入转成 int;如果输入不是合法整数,会抛 ValueError。 |
y = 10 / x |
用 10 除以用户输入;如果用户输入 0,会抛 ZeroDivisionError。 |
except ValueError as e: |
专门接住“输入不是整数”的情况,打印友好提示。 |
except ZeroDivisionError as e: |
专门接住“除以 0”的情况,打印友好提示。 |
except Exception as e: |
兜底:如果前面两个具体异常都没命中,任何其他异常(理论上已没有,但写库/写服务时常留保险)都会被这里捕获,并打印异常类型名 + 描述。 |
else: |
只有 try 块里没有抛出任何异常时才会进来,打印计算结果 y。 |
finally: |
无论前面是否出现异常、是否被捕获,都会执行;通常放“必须收尾”的代码,如释放文件、网络连接、打印日志等。 |
type(e).__name__:拿到异常对象e的实际类名(字符串),例如IndexError、ValueError、KeyError等。
示例2
从文件读取数字并计算平方根,全程捕获并报告异常。
|
|
功能说明:
- 让用户输入文件路径。
- 检查文件是否存在,不存在则主动抛出并捕获
FileNotFoundError。 - 读取文件第一行内容并转为浮点数,若格式非法则捕获
ValueError。 - 若数字为负,主动抛出并捕获
ValueError,提示“不能对负数开平方”。 - 若一切正常,计算并打印平方根。
- 无论是否发生异常,最后都会打印一条“无论成功与否,都会执行 finally”的提示。
综合练习
练习1
【课堂小练习】 异常处理练习1:读取指定文件并求和
要求:
编写一个程序,实现以下功能:
手动创建文件num.txt,内容如下:
|
|
- 读取文件内容,计算文件中所有数字的总和(每行一个数字)。
- 使用
try...except...else...finally结构处理以下异常情况:- 文件
num.txt不存在时,捕获FileNotFoundError,并打印提示:“文件 num.txt 不存在,请创建该文件并确保其路径正确。” - 文件内容中存在非数字行时,捕获
ValueError,并打印提示:“文件内容格式错误,所有行必须是数字。”
- 文件
- 如果文件读取和计算都成功,打印总和,格式为:“文件内数字总和为:xxx”。
- 无论是否发生异常,
finally块中都要打印:“文件操作结束,程序执行完毕。”
8 爬虫案例:抓取豆瓣高分电影并保存 CSV
导读
- 目标:一键拿到「豆瓣高分」最新 Top100 电影清单
- 包括片名、评分、评分人数、年份、国家/地区、类型 6 大关键信息。
- 方法:直接调用豆瓣移动端未公开的开放接口(无需登录、无 Cookie)
- 通过 1 行 HTTP GET 请求即可批量返回 100 条数据。
- 流程:请求 → 解析 → 排序 → 落盘
- 10 行核心代码完成网络请求与 JSON 解析;
- 按评分从高到低排序,保证榜单即看即用;
- 自动写入本地 CSV(UTF-8 编码),Excel/Numbers 直接双击打开。
- 结果:得到 douban_top100.csv
- 可做个人观影指南、数据可视化原始素材,或喂给推荐算法做冷启动。
|
|
课后练习
- 把
params里的limit改成 200,看豆瓣是不是只返 100(接口封顶)。 - 把排序关键字换成“评分人数”,找“评分人数最多但分数 < 8.0”的奇葩电影。
- 如果返回 418 “I’m a teapot”,尝试加
cookies或time.sleep()降速。
结语
本章你学会了:
- Python 安装、缩进、注释、变量、类型;
- 字符串、列表、字典、元组、集合的“增删改查”;
- 条件、循环、函数、模块、文件、异常;
- 一个爬虫案例:抓取豆瓣电影。
下一章我们将引入 BeautifulSoup + XPath,真正解析 HTML 网页,把“肉眼可见”的数据统统抓下来!