控制流#

控制流语句用于控制程序的执行顺序,包括条件语句和循环语句。掌握控制流是编程的基础。

条件语句#

if 语句#

if 语句用于根据条件执行不同的代码块。

# 基本语法
if condition:
    # 如果条件为True,执行这里的代码
    statement

# 示例
age = 20
if age >= 18:
    print("已成年")

if-else 语句#

# 基本语法
if condition:
    # 如果条件为True,执行这里
    statement1
else:
    # 如果条件为False,执行这里
    statement2

# 示例
age = 15
if age >= 18:
    print("已成年")
else:
    print("未成年")

if-elif-else 语句#

# 基本语法
if condition1:
    statement1
elif condition2:
    statement2
elif condition3:
    statement3
else:
    statement4

# 示例:成绩等级
score = 85
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 60:
    print("及格")
else:
    print("不及格")

嵌套条件语句#

age = 25
has_license = True

if age >= 18:
    if has_license:
        print("可以开车")
    else:
        print("需要先考驾照")
else:
    print("未成年,不能开车")

条件表达式的简化#

# 使用逻辑运算符简化
age = 25
has_license = True

if age >= 18 and has_license:
    print("可以开车")

# 使用链式比较
x = 10
if 0 < x < 20:
    print("x在0和20之间")

循环语句#

for 循环#

for 循环用于遍历序列(如列表、字符串、元组等)。

# 基本语法
for item in sequence:
    # 对每个item执行操作
    statement

# 遍历列表
fruits = ["apple", "banana", "orange"]
for fruit in fruits:
    print(fruit)

# 遍历字符串
for char in "Python":
    print(char)

# 遍历字典
user = {"name": "Alice", "age": 30, "city": "Beijing"}
for key in user:
    print(key, user[key])

for key, value in user.items():
    print(key, value)

range() 函数#

range() 函数生成一个数字序列,常用于 for 循环。

# range(stop) - 从0开始到stop-1
for i in range(5):
    print(i)  # 0, 1, 2, 3, 4

# range(start, stop) - 从start开始到stop-1
for i in range(2, 5):
    print(i)  # 2, 3, 4

# range(start, stop, step) - 指定步长
for i in range(0, 10, 2):
    print(i)  # 0, 2, 4, 6, 8

# 反向遍历
for i in range(5, 0, -1):
    print(i)  # 5, 4, 3, 2, 1

# 转换为列表
numbers = list(range(5))  # [0, 1, 2, 3, 4]

enumerate() 函数#

enumerate() 函数同时获取索引和值。

# 基本用法
fruits = ["apple", "banana", "orange"]
for index, fruit in enumerate(fruits):
    print(index, fruit)
# 输出:
# 0 apple
# 1 banana
# 2 orange

# 指定起始索引
for index, fruit in enumerate(fruits, start=1):
    print(index, fruit)
# 输出:
# 1 apple
# 2 banana
# 3 orange

zip() 函数#

zip() 函数用于同时遍历多个序列。

names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]

# 同时遍历两个列表
for name, age in zip(names, ages):
    print(f"{name} is {age} years old")
# 输出:
# Alice is 25 years old
# Bob is 30 years old
# Charlie is 35 years old

# 多个序列
cities = ["Beijing", "Shanghai", "Guangzhou"]
for name, age, city in zip(names, ages, cities):
    print(f"{name}, {age}, {city}")

# zip() 返回的是迭代器,可以转换为列表
pairs = list(zip(names, ages))  # [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

while 循环#

while 循环在条件为 True 时重复执行代码块。

# 基本语法
while condition:
    # 只要条件为True,就执行这里的代码
    statement

# 示例:计数
count = 0
while count < 5:
    print(count)
    count += 1

# 示例:用户输入
while True:
    user_input = input("输入'quit'退出: ")
    if user_input == "quit":
        break
    print(f"你输入了: {user_input}")

循环控制语句#

break 语句#

break 语句用于立即退出循环。

# 在for循环中使用break
for i in range(10):
    if i == 5:
        break  # 当i等于5时退出循环
    print(i)  # 只打印 0, 1, 2, 3, 4

# 在while循环中使用break
count = 0
while True:
    if count >= 5:
        break
    print(count)
    count += 1

continue 语句#

continue 语句用于跳过当前迭代,继续下一次迭代。

# 跳过偶数
for i in range(10):
    if i % 2 == 0:
        continue  # 跳过偶数
    print(i)  # 只打印 1, 3, 5, 7, 9

# 跳过空值
items = [1, None, 2, None, 3]
for item in items:
    if item is None:
        continue
    print(item)  # 只打印 1, 2, 3

pass 语句#

pass 语句是空操作,用于占位。

# 在循环中使用pass
for i in range(5):
    if i == 2:
        pass  # 什么都不做,继续执行
    print(i)

# 在条件语句中使用pass
if condition:
    pass  # 暂时不实现,避免语法错误
else:
    print("else block")

循环的 else 子句(重点难点)#

Python 的 forwhile 循环可以有一个 else 子句,这是一个容易被忽视的特性。

重要else 子句只有在循环正常结束(不是通过 break 退出)时才会执行。

# for循环的else子句
for i in range(5):
    print(i)
else:
    print("循环正常结束")
# 输出:
# 0
# 1
# 2
# 3
# 4
# 循环正常结束

# 如果使用break,else不会执行
for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print("这行不会执行")
# 输出:
# 0
# 1
# 2

# while循环的else子句
count = 0
while count < 5:
    print(count)
    count += 1
else:
    print("循环正常结束")

# 实际应用:查找元素
numbers = [1, 2, 3, 4, 5]
target = 6

for num in numbers:
    if num == target:
        print(f"找到了 {target}")
        break
else:
    print(f"没有找到 {target}")
# 输出:没有找到 6

# 如果target = 3,输出:找到了 3(else不会执行)

使用场景

  • 搜索算法:如果找到目标就 break,否则执行 else 处理未找到的情况
  • 验证:如果所有元素都满足条件,循环正常结束,执行 else

嵌套循环#

循环可以嵌套使用。

# 嵌套for循环:打印乘法表
for i in range(1, 4):
    for j in range(1, 4):
        print(f"{i} × {j} = {i*j}", end="  ")
    print()  # 换行
# 输出:
# 1 × 1 = 1  1 × 2 = 2  1 × 3 = 3
# 2 × 1 = 2  2 × 2 = 4  2 × 3 = 6
# 3 × 1 = 3  3 × 2 = 6  3 × 3 = 9

# 嵌套循环中使用break和continue
for i in range(3):
    for j in range(3):
        if j == 1:
            break  # 只退出内层循环
        print(f"i={i}, j={j}")
# 输出:
# i=0, j=0
# i=1, j=0
# i=2, j=0

循环中的变量作用域#

# 循环变量在循环外也可以访问
for i in range(3):
    pass
print(i)  # 2(最后的值)

# Python 3中,循环变量不会创建新的作用域
# 这与某些语言不同

列表推导式中的条件#

列表推导式可以包含条件语句。

# 基本条件过滤
evens = [x for x in range(10) if x % 2 == 0]  # [0, 2, 4, 6, 8]

# 条件表达式
result = [x if x > 0 else 0 for x in range(-3, 4)]  # [0, 0, 0, 0, 1, 2, 3]

# 多重条件
result = [x for x in range(20) if x % 2 == 0 if x % 3 == 0]  # [0, 6, 12, 18]

常见模式#

遍历并修改列表#

# 错误的方式(不推荐)
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        numbers.remove(num)  # 危险!在遍历时修改列表
print(numbers)  # 可能不是预期结果

# 正确的方式1:创建新列表
numbers = [1, 2, 3, 4, 5]
odds = [num for num in numbers if num % 2 != 0]

# 正确的方式2:使用切片复制
numbers = [1, 2, 3, 4, 5]
for num in numbers[:]:  # 遍历副本
    if num % 2 == 0:
        numbers.remove(num)

# 正确的方式3:反向遍历
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers) - 1, -1, -1):
    if numbers[i] % 2 == 0:
        del numbers[i]

无限循环#

# 使用while True创建无限循环
while True:
    user_input = input("输入命令: ")
    if user_input == "quit":
        break
    # 处理命令

循环计数器#

# 使用enumerate
items = ["a", "b", "c"]
for index, item in enumerate(items):
    print(f"{index}: {item}")

# 手动计数
count = 0
for item in items:
    print(f"{count}: {item}")
    count += 1

性能考虑#

# 避免在循环中进行不必要的计算
# 不好的做法
for i in range(1000):
    result = len(my_list) * 2  # len()在每次迭代都计算

# 好的做法
list_length = len(my_list) * 2
for i in range(1000):
    result = list_length

下一步#

掌握了控制流后,可以学习:

  1. 函数 - 学习如何封装代码逻辑,提高代码复用性
  2. 面向对象编程 - 学习更高级的代码组织方式