流程控制

翻译整理自 Python Tutorial - Control Flow。

1. if 语句

x = int(input("x: "))
if x < 0:
    print("neg")
elif x == 0:
    print("zero")
else:
    print("pos")

条件无括号,必须有冒号 : 与缩进块。

2. for 循环

Python 的 for 不是 C 风格,而是迭代序列:

words = ["cat", "dog", "fish"]
for w in words:
    print(w)

for i in range(5):       # 0 1 2 3 4
    print(i)

for i in range(2, 5):    # 2 3 4
    print(i)

for i, w in enumerate(words):
    print(i, w)

不要在迭代中修改序列

会导致跳过元素,应改用 copy:

for w in words[:]:
    if len(w) > 3:
        words.insert(0, w)

3. while 循环

n = 5
while n > 0:
    print(n)
    n -= 1

4. break、continue、else

else 在循环正常结束(未 break)时执行:

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print(n, "合数", x)
            break
    else:
        print(n, "质数")

5. pass、match

pass 是空操作占位符:

class MyException(Exception):
    pass

match 语句(3.10+)

类似 C 的 switch,但支持结构化匹配:

command = "go"
match command:
    case "go":
        print("go")
    case "stop":
        print("stop")
    case _:
        print("unknown")

支持解构:

point = (3, 4)
match point:
    case (0, 0):
        print("origin")
    case (x, 0):
        print(f"x={x}")
    case (0, y):
        print(f"y={y}")
    case (x, y):
        print(f"x={x}, y={y}")

6. 函数定义

def fib(n):
    """返回斐波那契数列前 n 项"""
    a, b = 0, 1
    result = []
    for _ in range(n):
        result.append(a)
        a, b = b, a + b
    return result

fib(10)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

7. 默认参数

def ask_ok(prompt, retries=3, reminder="再试一次"):
    while True:
        ok = input(prompt)
        if ok in ("y", "yes"):
            return True
        if ok in ("n", "no"):
            return False
        retries -= 1
        if retries < 0:
            raise ValueError("invalid")
        print(reminder)

陷阱:默认值只绑定一次,可变默认值(如 []、{})会被共享。

def f(a, L=[]):
    L.append(a)
    return L
f(1)  # [1]
f(2)  # [1, 2]  ← 不是 [2]

正确写法:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

8. 关键字参数与 *args / **kwargs

def f(pos, /, normal, *, kw):
    print(pos, normal, kw)

f(1, 2, kw=3)        # 1 2 3
# f(1, normal=2, kw=3)

def var(*args, **kwargs):
    print(args, kwargs)

var(1, 2, a=3)       # (1, 2) {'a': 3}
  • / 前为仅位置参数
  • * 后为仅关键字参数

9. 解包参数

args = [3, 6]
range(*args)         # 解包列表

d = {"n": 5}
fib(**d)             # 解包字典为关键字

10. lambda

匿名函数:

pairs = [(1, "one"), (3, "three"), (2, "two")]
pairs.sort(key=lambda p: p[0])

11. 文档字符串

def my_function():
    """Do nothing.

    More description here.
    """
    pass

print(my_function.__doc__)

小结

Python 的流程控制简洁优雅,下一章深入函数特性。