Python 学习笔记(第一期与第二期)------基础语法------核心知识点自测与详解
本自测解析针对 Python 学习笔记系列第一期(基础语法·上篇:环境搭建与数据基石)和第二期(基础语法·下篇:运算符全解与实战演练)的核心内容。共 10 题,每题包含题目回顾、考查知识点、详细解答与分析,帮助读者巩固 Python 基础语法与运算符的核心技能。
文章索引:[Python 学习笔记(第一期)------基础语法(上篇):环境搭建与数据基石
Python 学习笔记(第二期)------基础语法(下篇):运算符全解与实战演练
更多自我检测系列欢迎浏览:每日知识点小问答
我的主页:AOwhisky,这里有更多运维系统性知识整理和其他有趣内容,欢迎与我一起探讨学习~
第一期与第二期:基础语法(第 1-5 题)
题目一:Python 环境安装与 pip 镜像源配置
题目 :Python 安装完成后,如何在命令行验证安装是否成功?如果在执行 pip install 时出现下载超时错误,原因是什么?请写出永久配置国内镜像源(以清华源为例)的具体步骤。
考查知识点
- Python 多平台安装与验证 ------ 第一期 §1
- pip 镜像源配置 ------ 第一期 §2.2
详细解答
验证安装是否成功:
在命令提示符(CMD)或终端中执行以下命令:
bash
python --version
pip --version
如果配置正确,会分别输出 Python 版本号和 pip 版本号。例如:
text
Python 3.12.0
pip 23.2.1 from C:\Python312\Lib\site-packages\pip (python 3.12)
pip 安装超时的原因:
- 默认连接的是国外官方源(
pypi.org),国内网络访问速度慢,容易超时 - 根本解决方法是永久配置国内镜像源
永久配置清华源(Windows):
| 步骤 | 操作 |
|---|---|
| 1. 定位配置文件目录 | 打开文件资源管理器,在地址栏输入 %APPDATA% 并回车,进入当前用户的 AppData/Roaming 目录 |
| 2. 创建 pip 文件夹 | 在该目录下新建一个名为 pip 的文件夹 |
| 3. 创建 pip.ini 文件 | 进入 pip 文件夹,新建一个名为 pip.ini 的文本文档(注意扩展名必须是 .ini) |
| 4. 填入配置内容 | 用记事本打开 pip.ini,复制以下内容并保存 |
ini
[global]
timeout = 40
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
extra-index-url =
https://mirrors.aliyun.com/pypi/simple/
https://pypi.douban.com/simple/
[install]
trusted-host =
pypi.tuna.tsinghua.edu.cn
mirrors.aliyun.com
pypi.douban.com
macOS / Linux 用户 :在家目录(~)下创建隐藏文件夹 .pip,然后在其中创建 pip.conf 文件,填入相同内容。
配置完成后,再次执行 pip install <包名> 即可体验到飞升的下载速度。
题目二:Python 代码格式规范------缩进与注释
题目:Python 中推荐的缩进方式是什么?为什么不能混用 Tab 和空格?单行注释和多行注释(文档字符串)分别如何编写?请指出以下代码中的格式错误并修正。
python
if True:
print("缩进错误")
else:
print("正确缩进")
考查知识点
- 代码缩进规则 ------ 第一期 §3.2
- 注释规范 ------ 第一期 §3.1
详细解答
缩进规范:
- Python 官方推荐使用 4 个空格 作为一级缩进
- 主流 IDE 均支持按 Tab 键自动转换为 4 个空格
- 严禁混用 Tab 和空格,否则会报错:
text
IndentationError: unindent does not match any outer indentation level
注释规范:
| 注释类型 | 语法 | 说明 |
|---|---|---|
| 单行注释 | # 注释内容 |
# 和内容之间建议空一格;行尾注释与代码间至少空两格 |
| 多行注释(文档字符串) | """注释内容""" |
使用三对双引号或单引号包裹,通常放在函数/类开头 |
错误代码修正:
python
# ❌ 错误:if 语句下面的代码块没有缩进
if True:
print("缩进错误")
# ✅ 修正
if True:
print("缩进正确") # 4 个空格缩进
else:
print("也正确") # 4 个空格缩进
题目三:变量本质与动态类型
题目 :请解释 Python 中"变量是贴在值上的便利贴"这一比喻的含义。Python 是静态类型还是动态类型语言?以下代码执行后,num 的类型分别是什么?
python
num = 100
print(type(num))
num = "Hello"
print(type(num))
num = 3.14
print(type(num))
考查知识点
- 变量本质与内存模型 ------ 第一期 §5
- 动态类型特性 ------ 第一期 §5
详细解答
"便利贴"比喻的含义:
- 变量本身不存储数据,而是指向内存中存储数据的位置
- 可以将变量理解为贴在数据上的"标签"或"便利贴"
- 当执行
num = 100时,系统在内存中创建整数 100,然后将标签num贴在该内存空间上 - 执行
num = "Hello"时,将标签num从整数 100 上揭下来,贴到字符串"Hello"上 - 原来的 100 如果没有其他标签引用,会被垃圾回收机制清理
动态类型:
Python 是动态类型 语言。变量本身没有类型,变量所指向的数据才有类型。同一变量可以在不同时刻指向不同类型的值。
代码类型追踪:
python
num = 100
print(type(num)) # <class 'int'>
num = "Hello"
print(type(num)) # <class 'str'>
num = 3.14
print(type(num)) # <class 'float'>
题目四:六大组合数据类型对比
题目 :请从"是否可变"、"是否有序"、"元素是否唯一"三个维度,对比 list、tuple、set、dict、str 五种数据类型,并各举一个创建示例。为什么字典的键不能使用列表类型?
考查知识点
- 六大组合数据类型 ------ 第一期 §6
- 可变与不可变类型 ------ 第一期 §6
详细解答
五种数据类型对比表:
| 类型 | 是否可变 | 是否有序 | 元素是否唯一 | 创建示例 |
|---|---|---|---|---|
| list(列表) | ✅ 可变 | ✅ 有序 | ❌ 允许重复 | [1, 2, "hello"] |
| tuple(元组) | ❌ 不可变 | ✅ 有序 | ❌ 允许重复 | (1, 2, "hello") |
| str(字符串) | ❌ 不可变 | ✅ 有序 | ❌ 允许重复 | "Python" |
| set(集合) | ✅ 可变 | ❌ 无序 | ✅ 必须唯一 | {1, 2, 3} |
| dict(字典) | ✅ 可变 | ❌ 无序(Py3.7+ 按插入顺序) | 键必须唯一 | {"name": "Tom"} |
为什么字典的键不能使用列表:
- 字典的键必须是不可变类型(hashable)
- 列表是可变类型(可以增删改元素),其哈希值会变化
- 如果用列表作为键,一旦列表内容变化,字典将无法正确定位该键值对
- 因此,
{[1, 2]: "value"}会抛出TypeError
白话理解:
- 列表:购物车,可随意增减,有顺序
- 元组:密封档案盒,放入后不可更改
- 集合:自动去重的收纳盒,无序摆放
- 字典:新华字典,通过"键"快速查找对应的"值"
题目五:数字类型与进制转换
题目 :Python 中整型支持哪四种进制表示?请写出将十进制数 255 转换为二进制、八进制、十六进制的方法。浮点数转整数时会发生什么?以下代码的输出是什么?
python
print(int(3.99))
print(float(10))
print(bool(0))
print(bool([]))
考查知识点
- 整型的四种进制 ------ 第一期 §7.1
- 进制转换函数 ------ 第一期 §7.1
- 数字类型转换 ------ 第一期 §7.5
- 布尔类型与真值测试 ------ 第一期 §7.4
详细解答
四种进制表示:
| 进制 | 前缀 | 示例 | 对应十进制 |
|---|---|---|---|
| 二进制(Binary) | 0b 或 0B |
0b11111111 |
255 |
| 八进制(Octal) | 0o 或 0O |
0o377 |
255 |
| 十进制(Decimal) | 无 | 255 |
255 |
| 十六进制(Hex) | 0x 或 0X |
0xFF |
255 |
进制转换:
python
num = 255
print(bin(num)) # 0b11111111
print(oct(num)) # 0o377
print(hex(num)) # 0xff
浮点数转整数:
- 使用
int()将浮点数转换为整数时,直接截断小数部分,不进行四舍五入 int(3.99)→3
布尔类型与真值测试:
bool是int的子类,True等价于 1,False等价于 0- 以下情况会被视为
False:None、False、任何数字类型的 0、任何空序列(''、[]、())、任何空字典({})
代码输出:
python
print(int(3.99)) # 3
print(float(10)) # 10.0
print(bool(0)) # False
print(bool([])) # False
第一期与第二期:基础语法(第 6-10 题)
题目六:算术运算符与类型提升
题目 :Python 中 / 和 // 运算符的区别是什么?10 / 3 和 10 // 3 的输出分别是什么?混合运算时,Python 的类型提升规则是什么?以下代码的输出是什么?
python
print(10 / 2.0)
print(10 - (3 + 5j))
考查知识点
- 算术运算符 ------ 第二期 §1
- 混合运算类型提升 ------ 第二期 §1
详细解答
/ 与 // 的区别:
| 运算符 | 名称 | 示例 | 结果 | 说明 |
|---|---|---|---|---|
/ |
真除法 | 10 / 3 |
3.333... |
结果总是浮点数 |
// |
整除(地板除) | 10 // 3 |
3 |
向下取整,返回整数部分 |
混合运算的类型提升规则:
当不同类型的数字混合运算时,Python 会自动向"更高精度"的类型提升:
- 整型 + 浮点型 → 浮点型
- 整型 + 复数 → 复数
- 浮点型 + 复数 → 复数
代码输出:
python
print(10 / 2.0) # 5.0(整型 10 提升为浮点型)
print(10 - (3 + 5j)) # (7 - 5j)(整型 10 提升为复数)
题目七:赋值运算符(含海象运算符)
题目 :以下代码的执行结果是什么?请解释海象运算符 := 的作用,并与传统写法对比。
python
# 代码段一
x = y = z = 1
a, b = 1, 2
print(x, y, z, a, b)
# 代码段二
num = 5
num += 2
num *= 3
print(num)
# 代码段三(海象运算符)
while (data := input("请输入内容:")) == "":
print("内容不能为空!")
考查知识点
- 链式赋值与平行赋值 ------ 第二期 §2.1
- 复合赋值运算符 ------ 第二期 §2.2
- 海象运算符
:=------ 第二期 §2.3
详细解答
代码段一:链式赋值与平行赋值
x = y = z = 1:三个变量同时赋值为 1(链式赋值)a, b = 1, 2:a 赋值为 1,b 赋值为 2(平行赋值/元组解包)- 输出:
1 1 1 1 2
代码段二:复合赋值
python
num = 5
num += 2 # num = 5 + 2 = 7
num *= 3 # num = 7 * 3 = 21
print(num) # 21
代码段三:海象运算符 :=
海象运算符允许在表达式内部为变量赋值,因形似海象的眼睛和长牙而得名。
传统写法(需先赋值再判断):
python
data = input("请输入内容:")
while len(data) == 0:
print("内容不能为空!")
data = input("请输入内容:")
海象运算符写法(在 while 条件中同时完成赋值和判断):
python
while (data := input("请输入内容:")) == "":
print("内容不能为空!")
运行效果:如果用户直接按回车(输入空字符串),会提示"内容不能为空!"并再次询问;如果输入了有效内容,则退出循环。
⚠️ 注意 :海象运算符优先级较低,与比较运算符混用时必须加括号
()。
题目八:比较运算符、逻辑运算符与短路求值
题目:请写出以下代码的输出,并解释逻辑运算符的短路求值原则。
python
a, b, c = 10, 5, 0
print(a > b) # ①
print(a < b) # ②
print(5 <= a <= 15) # ③
print(c and a / c) # ④
print(a > b or c > a) # ⑤
print(not (a == 10)) # ⑥
考查知识点
- 比较运算符与链式比较 ------ 第二期 §3
- 逻辑运算符与短路求值 ------ 第二期 §4
详细解答
代码输出:
python
a, b, c = 10, 5, 0
print(a > b) # True(10 > 5)
print(a < b) # False(10 < 5)
print(5 <= a <= 15) # True(链式比较:5 <= 10 <= 15)
print(c and a / c) # 0(c=0 为假,短路,不执行 a/c,避免除零错误)
print(a > b or c > a) # True(a > b 为 True,or 短路,不再计算 c > a)
print(not (a == 10)) # False(a == 10 为 True,取反为 False)
短路求值原则:
| 运算符 | 原则 | 返回规则 |
|---|---|---|
and |
如果左边为假,不再计算右边 | 返回第一个假值,或最后一个真值 |
or |
如果左边为真,不再计算右边 | 返回第一个真值,或最后一个假值 |
代码④详解 :c and a / c 中,c = 0 为假,and 直接返回 0,不执行 a / c,因此避免了 ZeroDivisionError。
代码⑤详解 :a > b 为 True,or 直接返回 True,不执行 c > a。
题目九:成员运算符与位运算
题目 :请写出以下代码的输出。位运算 ~9 的结果为什么是 -10?请简述按位取反的计算过程。
python
print('o' in 'Python') # ①
print(3 in [1, 2, 3]) # ②
print("name" in {"name": "Tom", "age": 18}) # ③
print(9 & 3) # ④
print(9 | 3) # ⑤
print(9 ^ 3) # ⑥
print(~9) # ⑦
print(9 << 1) # ⑧
print(9 >> 1) # ⑨
考查知识点
- 成员运算符
in/not in------ 第二期 §5 - 位运算符 ------ 第二期 §6
详细解答
代码输出:
python
print('o' in 'Python') # True(字符串中查找字符)
print(3 in [1, 2, 3]) # True(列表中查找元素)
print("name" in {"name": "Tom", "age": 18}) # True(字典中判断的是键,不是值)
位运算结果:
python
print(9 & 3) # 1 (00001001 & 00000011 = 00000001)
print(9 | 3) # 11 (00001001 | 00000011 = 00001011)
print(9 ^ 3) # 10 (00001001 ^ 00000011 = 00001010)
print(~9) # -10
print(9 << 1) # 18 (左移一位 = 9 * 2)
print(9 >> 1) # 4 (右移一位 = 9 // 2)
按位取反 ~9 = -10 的计算过程:
- 确定补码 :9 是正数,正数的原码 = 反码 = 补码,所以 9 的补码为
00001001 - 对补码取反 :得到新的补码
11110110 - 将补码转换为原码 :
- 符号位(最高位)为 1,表示负数
- 其余位取反:
00001001 - 再 +1:
00001010= 10 - 最终结果为
-10
记忆口诀 :
~x等价于-x - 1。例如~9 = -10,~(-9) = 8。
题目十:运算符优先级与综合实战
题目:请写出以下代码的输出,并说明运算符的优先级如何影响计算结果。然后回答:如果表达式中包含多种运算符且不确定优先级时,最佳实践是什么?
python
a, b, c = 2, 3, 4
result1 = c ** b * a
result2 = c ** (b * a)
result3 = 10 + 5 * 2 ** 3 - 4
result4 = (10 + 5) * (2 ** 3) - 4
print(result1)
print(result2)
print(result3)
print(result4)
考查知识点
- 运算符优先级 ------ 第二期 §7
- 实战最佳实践 ------ 第二期 §7
详细解答
代码输出:
python
a, b, c = 2, 3, 4
result1 = c ** b * a # 4**3 * 2 = 64 * 2 = 128
result2 = c ** (b * a) # 4**(3*2) = 4**6 = 4096
result3 = 10 + 5 * 2 ** 3 - 4 # 10 + 5 * 8 - 4 = 10 + 40 - 4 = 46
result4 = (10 + 5) * (2 ** 3) - 4 # 15 * 8 - 4 = 120 - 4 = 116
print(result1) # 128
print(result2) # 4096
print(result3) # 46
print(result4) # 116
优先级分析:
| 表达式 | 优先级顺序 | 计算过程 |
|---|---|---|
c ** b * a |
** 先于 * |
(4**3) * 2 = 64 * 2 |
c ** (b * a) |
括号最高 | 4 ** (3*2) = 4**6 |
10 + 5 * 2 ** 3 - 4 |
** → * → + - |
10 + (5*(2**3)) - 4 |
(10 + 5) * (2 ** 3) - 4 |
括号最高 | (15) * (8) - 4 |
最佳实践:
当不确定运算符优先级时,直接使用括号
()明确计算顺序。
括号不仅能确保计算逻辑与预期一致,还能大幅提升代码可读性:
python
# ❌ 难以理解
total = a + b * c ** d // e - f
# ✅ 一目了然
total = a + (b * (c ** d) // e) - f
附:知识点对应总表
| 题号 | 主要考查知识点(对应笔记章节) |
|---|---|
| 1 | 第一期 §1 环境安装验证;第一期 §2.2 pip 镜像源配置 |
| 2 | 第一期 §3.2 缩进规则;第一期 §3.1 注释规范 |
| 3 | 第一期 §5 变量本质与动态类型 |
| 4 | 第一期 §6 六大组合数据类型对比 |
| 5 | 第一期 §7.1 进制与转换;第一期 §7.5 类型转换;第一期 §7.4 布尔与真值测试 |
| 6 | 第二期 §1 算术运算符与类型提升 |
| 7 | 第二期 §2 赋值运算符(链式/复合/海象) |
| 8 | 第二期 §3 比较运算符;第二期 §4 逻辑运算符与短路求值 |
| 9 | 第二期 §5 成员运算符;第二期 §6 位运算符 |
| 10 | 第二期 §7 运算符优先级与最佳实践 |
学习建议:对于答错的题目,请回看第一期或第二期对应章节,并动手在 Python 交互式环境中执行相关命令。基础语法和运算符是 Python 编程的基石,建议通过反复练习加深理解。
--- Compiled and Authored by Whisky --- July 12 th, 2026