Python的流程控制(if / for / while)是每个开发者必须掌握的基础知识,但从新手到熟练工之间常有细节被忽略。本文基于Python 3.10+,系统梳理条件判断、循环、迭代工具、模式匹配以及常见陷阱,并用两个完整Demo巩固知识点。
- def test_falsy():
- falsy_list = [None, False, 0, 0.0, "", [], {}, set(), range(0)]
- for v in falsy_list:
- print(f"{repr(v):>10} -> {'假值' if not v else '真值'}")
- test_falsy()
复制代码
一、条件语句:if / elif / else 与三元表达式
Python的条件判断基于真值测试——任何对象都能被bool()转化为布尔值。假值(Falsy)包括None、False、数值零、空容器等。if / elif / else语法如下:
- score = 85
- if score >= 90:
- grade = "A - 优秀"
- elif score >= 80:
- grade = "B - 良好"
- elif score >= 70:
- grade = "C - 中等"
- elif score >= 60:
- grade = "D - 及格"
- else:
- grade = "F - 不及格"
- print(grade) # B - 良好
复制代码
三元表达式用于简单赋值:
- age = 20
- result = "成年" if age >= 18 else "未成年"
- print(result) # 成年
复制代码
条件组合使用and / or / not,并利用短路求值简化代码:
- user_input = ""
- name = user_input or "匿名" # 如果user_input为空,默认为匿名
- print(name) # 匿名
复制代码
二、循环语句:for / while 与 else 子句
for循环基于迭代器协议,遍历任何可迭代对象。while循环根据条件驱动。Python的循环支持else子句——当循环正常结束(未触发break)时执行,这在C/C++中不存在。
- # for...else 查找质数
- for n in range(2, 10):
- for x in range(2, n):
- if n % x == 0:
- print(f"{n} = {x} * {n // x}")
- break
- else:
- print(f"{n} 是质数")
复制代码
while True + break模式常用于菜单或输入等待场景:
- while True:
- cmd = input("输入 quit 退出:")
- if cmd == "quit":
- break
- print(f"你输入了:{cmd}")
复制代码
三、range / enumerate / zip 并行迭代
range是惰性序列,只存储start/stop/step,不占用大内存:
- r = range(1000000)
- import sys
- print(sys.getsizeof(r)) # 48字节
复制代码
enumerate同时获取索引和元素:
- fruits = ["苹果", "香蕉", "橙子"]
- for idx, fruit in enumerate(fruits, start=1):
- print(f"第{idx}个:{fruit}")
复制代码
zip并行组合多个序列,以最短为准。利用zip进行矩阵转置或创建字典:
- matrix = [[1,2,3],[4,5,6],[7,8,9]]
- transposed = list(zip(*matrix))
- print(transposed) # [(1,4,7),(2,5,8),(3,6,9)]
- keys = ["name","age"]
- values = ["yance",30]
- d = dict(zip(keys, values))
- print(d) # {'name':'yance','age':30}
复制代码
四、break / continue / pass 与循环控制
break跳出当前循环,continue跳过本次迭代,pass仅做占位。注意break只跳一层,跳出多层可借助标志变量或封装函数。
- # 封装函数跳出多层循环
- def find_pair():
- for i in range(5):
- for j in range(5):
- if i * j == 6:
- return i, j
- return None
- result = find_pair()
复制代码
continue在while循环中需避免跳过条件变量更新:
- count = 0
- while count < 5:
- if count == 2:
- count += 1 # 必须先更新再continue
- continue
- print(count)
- count += 1
复制代码
五、match-case 模式匹配(Python 3.10+)
match-case支持字面量、变量绑定、类模式、序列模式、映射模式、守卫和or模式。与if-elif链相比,模式匹配对复杂结构解构更清晰。
- def process_point(point):
- match point:
- case (0, 0):
- print("原点")
- case (x, 0):
- print(f"X轴上 x={x}")
- case (0, y):
- print(f"Y轴上 y={y}")
- case (x, y):
- print(f"二维点({x},{y})")
- case _:
- print("非二维点")
- process_point((3,0)) # X轴上 x=3
复制代码
六、常见陷阱与最佳实践
陷阱包括:在循环中修改正在遍历的列表、可变默认参数与循环闭包、浮点数做循环条件、无限循环耗尽资源。最佳实践推荐用列表推导式、any()/all()、使用字典替代冗长if-elif链。
- # 使用字典替代if-elif
- def get_grade(score):
- level_map = {
- (90,101): "A",
- (80,90): "B",
- (70,80): "C",
- (60,70): "D",
- (0,60): "F"
- }
- for (low, high), grade in level_map.items():
- if low <= score < high:
- return grade
- return "未知"
- print(get_grade(85)) # B
复制代码
七、实操Demo:猜数字游戏与简易计算器
- import random
- # 猜数字游戏
- secret = random.randint(1,100)
- while True:
- guess = int(input("猜一个1-100之间的数:"))
- if guess < secret:
- print("小了")
- elif guess > secret:
- print("大了")
- else:
- print("恭喜!猜对了!")
- break
复制代码- # 简易计算器
- while True:
- expr = input("输入表达式(如 3+5)或 'quit' 退出:")
- if expr == 'quit':
- break
- try:
- result = eval(expr) # 生产环境建议替换为安全解析
- print(f"{expr} = {result}")
- except Exception as e:
- print(f"错误:{e}")
复制代码
八、总结
Python的流程控制以缩进和惰性迭代为特色,掌握if/for/while及其扩展(else子句、range、enumerate、zip、match-case)能写出更简洁高效的代码。记住假值列表、短路求值、多层循环跳出技巧,避免常见陷阱。 |