当前位置: 首页 > news >正文

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
  • 使用文档字符串说明函数功能
http://www.dtcms.com/a/342613.html

相关文章:

  • K 均值聚类:从概念到实践的无监督学习之旅
  • 面试后的跟进策略:如何提高录用几率并留下专业印象
  • 暂停更新的高速下载网盘,作者可能不再维护
  • Oracle: cannot decrease column length because some value is too big
  • .NET Core MongoDB 查询数据异常及解决
  • 分布式集群压测+grafana+influxdb+Prometheus详细步骤
  • 详细说明http协议特别是conten-length和chunk编码,并且用linux的命令行演示整个过程
  • Python读取和设置PNG图片的像素值
  • 软件漏洞扫描的测试内容(二)
  • DzzOffice V2.3.7 核心功能升级与关键问题修复,体验全面优化!
  • 计算机网络-1——第一阶段
  • 【苹果软件】Prism Mac 9.4苹果系统免费安装包英文版 Graphpad Prism for Mac 9.4软件免费下载与详细图文教程!!
  • UGUI源码剖析(12):实战演练——从零构建一个健壮的Gradient顶点特效
  • 虚幻基础:目标值之间的过渡
  • 数字货币发展存在的问题:交易平台的问题不断,但监管日益加强
  • C++ string类(c_str , find和rfind , npos , find_first_of)
  • DeepSeek V3.1正式发布,专为下代国产芯设计
  • 【LeetCode 热题 100】322. 零钱兑换——(解法二)自底向上
  • 2025年物流大数据分析的主要趋势
  • 血缘元数据采集开放标准:OpenLineage Dataset Facets
  • Python-Pandas GroupBy 进阶与透视表学习
  • 如何用算力魔方4060安装PaddleOCR MCP 服务器
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码3
  • JavaWeb前端03(Ajax概念及在前端开发时应用)
  • Windows下,将本地视频转化成rtsp推流的方法
  • 高效处理NetCDF文件经纬度转换:一个纯CDO驱动的Bash脚本详解
  • GitHub 热榜项目 - 日榜(2025-08-21)
  • 009.Redis Predixy + Sentinel 架构
  • 深度卷积神经网络AlexNet
  • 【NVIDIA-B200】生产报错 Test CUDA failure common.cu:1035 ‘system not yet initialized‘