2025-08-21 Python进阶1——控制流语句
文章目录
- 1 分支结构
- 1.1 if 语句
- 1.2 match 语句(Python 3.10+)
- 2 循环结构
- 2.1 for 语句
- 2.2 range () 函数
- 2.3 循环控制语句
- 2.4 循环的 else 子句
- 3 其他语句
- 3.1 pass 语句
- 4 函数定义补充
- 4.1 函数参数进阶
- 4.1.1 默认值参数
- 4.1.2 关键字参数
- 4.1.3 不定长参数
- 4.1.4 参数传递限制
- 4.2 解包实参列表
- 4.3 文档字符串(Docstring)
- 5 编码风格建议(PEP 8)
1 分支结构
1.1 if 语句
- 用于根据条件执行不同代码块
- 可搭配
elif
(else if 的缩写)和else
使用
x = int(input("请输入整数: "))
if x < 0:print("负数")
elif x == 0:print("零")
elif x == 1:print("1")
else:print("大于1的数")
1.2 match 语句(Python 3.10+)
- 类似其他语言的 switch,但功能更强大
- 支持模式匹配,可提取值到变量
def http_error(status):match status:case 400:return "请求错误"case 404:return "页面未找到"case 418:return "我是一个茶壶" # 著名的愚人节彩蛋case _: # 通配符,匹配所有其他情况return "网络错误"
复杂模式匹配示例:
# 匹配元组
point = (3, 0)
match point:case (0, 0):print("原点")case (0, y):print(f"Y轴: {y}")case (x, 0):print(f"X轴: {x}")case (x, y):print(f"坐标: ({x}, {y})")
2 循环结构
2.1 for 语句
- 用于迭代序列(列表、字符串、元组等)
- 语法:
for 变量 in 序列: 代码块
# 遍历列表
words = ['cat', 'window', 'defenestrate']
for w in words:print(w, len(w)) # 输出单词及其长度
注意:迭代时修改序列可能导致意外结果,建议迭代副本:
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
# 安全删除 inactive 用户(迭代副本)
for user, status in users.copy().items():if status == 'inactive':del users[user]
2.2 range () 函数
- 生成等差数列,常用于创建循环计数
- 语法:
range(起始值, 结束值, 步长)
(起始值默认 0,步长默认 1)
# 基本用法
for i in range(5):print(i) # 0,1,2,3,4(不包含5)# 指定起始和结束
list(range(5, 10)) # [5,6,7,8,9]# 指定步长
list(range(0, 10, 3)) # [0,3,6,9]# 倒序
list(range(-10, -100, -30)) # [-10,-40,-70]
2.3 循环控制语句
break
:跳出当前循环continue
:跳过本次循环,进入下一次
# break 示例:找到第一个能被2和3同时整除的数
for n in range(1, 20):if n % 2 == 0 and n % 3 == 0:print(f"找到: {n}")break # 找到后立即退出循环# continue 示例:只打印奇数
for num in range(2, 10):if num % 2 == 0:continue # 跳过偶数print(f"奇数: {num}")
2.4 循环的 else 子句
- 循环正常结束(未被 break)时执行
- 常用于判断循环是否找到目标
# 判断是否为质数
for n in range(2, 10):for x in range(2, n):if n % x == 0:print(f"{n} = {x} * {n//x}")breakelse:# 未执行 break 时执行(是质数)print(f"{n} 是质数")
3 其他语句
3.1 pass 语句
- 空语句,不执行任何操作
- 用于语法需要但逻辑无需操作的场景(占位符)
# 空循环
while True:pass # 等待用户中断(Ctrl+C)# 空类
class MyEmptyClass:pass# 未实现的函数
def plan_to_do():pass # 以后再实现
4 函数定义补充
4.1 函数参数进阶
4.1.1 默认值参数
- 为参数指定默认值,调用时可省略
- 默认值在函数定义时计算,而非调用时
def ask_ok(prompt, retries=4, reminder='请重试!'):while retries > 0:reply = input(prompt)if reply in {'y', 'yes'}:return Trueif reply in {'n', 'no'}:return Falseretries -= 1print(reminder)raise ValueError("无效输入")# 调用方式
ask_ok("确定要退出吗?") # 使用默认的retries和reminder
ask_ok("要覆盖文件吗?", 2) # 自定义retries
注意:默认值为可变对象(列表、字典等)时需谨慎:
# 错误示例:默认列表会累积调用结果
def bad_append(a, L=[]):L.append(a)return Lprint(bad_append(1)) # 输出:[1]
print(bad_append(2)) # 输出:[1, 2]
print(bad_append(3)) # 输出:[1, 2, 3]# 正确示例:每次调用创建新列表
def good_append(a, L=None):if L is None:L = []L.append(a)return L
4.1.2 关键字参数
- 调用时用
参数名=值
形式传递,可打乱顺序
def parrot(voltage, state='僵硬', action='飞', type='挪威蓝鹦鹉'):print(f"这只鹦鹉不会{action},即使你给它{voltage}伏电压")print(f"这只{type}的羽毛真漂亮")print(f"它已经{state}了!")# 关键字参数调用
parrot(voltage=1000)
parrot(action='爆炸', voltage=10000)
4.1.3 不定长参数
*args
:接收多个位置参数,存为元组**kwargs
:接收多个关键字参数,存为字典
def print_info(title, *args, **kwargs):print(f"标题: {title}")print("位置参数:", args)print("关键字参数:", kwargs)print_info("测试", 1, 2, 3, name="张三", age=20)
# 输出:
# 标题: 测试
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': '张三', 'age': 20}
4.1.4 参数传递限制
/
前的参数仅限位置传递*
后的参数仅限关键字传递
def func(pos_only, /, pos_or_kw, *, kw_only):print(pos_only, pos_or_kw, kw_only)func(1, 2, kw_only=3) # 正确
# func(pos_only=1, 2, kw_only=3) # 错误(pos_only仅限位置)
# func(1, 2, 3) # 错误(kw_only仅限关键字)
4.2 解包实参列表
*
解包列表 / 元组为位置参数**
解包字典为关键字参数
def sum(a, b, c):return a + b + c# 解包列表
nums = [1, 2, 3]
print(sum(*nums)) # 等价于 sum(1,2,3)# 解包字典
params = {'a':1, 'b':2, 'c':3}
print(sum(**params)) # 等价于 sum(a=1, b=2, c=3)
4.3 文档字符串(Docstring)
- 函数内第一个字符串,用于说明函数功能
- 可通过
__doc__
属性访问
def fib(n):"""生成小于n的斐波那契数列参数:n: 数列的上限值返回:包含斐波那契数的列表"""result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a + breturn resultprint(fib.__doc__) # 打印文档字符串
5 编码风格建议(PEP 8)
- 缩进用 4 个空格,不使用制表符
- 每行代码不超过 79 个字符
- 函数和类之间用空行分隔
- 运算符前后、逗号后加空格(如
a = b + c
) - 类名用
UpperCamelCase
,函数名用lowercase_with_underscores
- 使用文档字符串说明函数功能