上一篇【第 004 篇】Python 数据类型与变量:从零开始理解数据
下一篇【第 006 篇】函数——Python 编程的核心抽象


系列说明:本系列共 30 篇,全面介绍 Python 编程从零基础到软件工程师的完整路径。本文为第 005 篇,讲解 Python 的流程控制语句:条件判断(if/elif/else)和循环(for/while),这是让程序具备"思考"和"重复"能力的核心机制。


摘要

没有流程控制的程序只是一个执行固定步骤的脚本,真正有用的程序需要能够做判断(根据条件选择不同的执行路径)和做重复(对大量数据循环处理)。这两种能力分别由条件语句循环语句提供。

本文涵盖:

  • if / elif / else 条件判断的完整用法
  • 比较运算符与逻辑运算符
  • for 循环遍历序列
  • range() 函数生成数字序列
  • while 循环按条件重复
  • break(跳出循环)、continue(跳过当次)、pass(占位)
  • 循环的 else 子句(Python 独有特性)
  • 列表推导式(List Comprehension)
  • 生成器表达式
  • 常见模式与实战案例

一、条件判断:if / elif / else

1.1 基本语法

# 基本 if 语句
temperature = 35

if temperature > 30:
    print("天气很热,记得喝水!")
    print("建议开空调")

# if-else
if temperature > 30:
    print("天气热")
else:
    print("天气凉爽")

# 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(f"成绩:{score} → 等级:{grade}")
# 成绩:85 → 等级:B(良好)

注意事项

  • ifelifelse 后面必须有冒号 :
  • 代码块用 4 个空格缩进
  • elif 可以有多个,else 最多一个,且在末尾

1.2 比较运算符

a, b = 10, 20

print(a == b)   # False:等于
print(a != b)   # True:不等于
print(a < b)    # True:小于
print(a <= b)   # True:小于等于
print(a > b)    # False:大于
print(a >= b)   # False:大于等于

# Python 支持链式比较(非常优雅)
x = 15
print(10 < x < 20)   # True(等价于 10 < x and x < 20)
print(1 < 2 < 3 < 4) # True

# 字符串比较(按字典序,即 ASCII 码大小)
print("apple" < "banana")  # True
print("Z" < "a")            # True(大写字母 ASCII 码小于小写)

1.3 逻辑运算符

# and(与):两个条件都为 True
age = 25
has_ticket = True

if age >= 18 and has_ticket:
    print("可以入场")

# or(或):至少一个条件为 True
is_vip = False
is_member = True

if is_vip or is_member:
    print("享受折扣")

# not(非):取反
is_closed = False

if not is_closed:
    print("商店营业中")

# 组合逻辑(注意运算符优先级:not > and > or)
a, b, c = True, False, True

# 不推荐:依赖优先级,可读性差
result = a or b and c

# 推荐:用括号明确意图
result = a or (b and c)
print(result)  # True

1.4 短路求值(Short-circuit Evaluation)

Python 的 andor 采用短路求值,这是一个重要特性:

# and:左边为 False,不再计算右边
x = 0
# 如果 x 为 0,不会触发 ZeroDivisionError
if x != 0 and 10 / x > 1:
    print("成立")
else:
    print("x 为 0,短路跳过了除法")

# or:左边为 True,不再计算右边
name = None
# 常用技巧:提供默认值
display_name = name or "匿名用户"
print(display_name)  # 匿名用户

name = "Alice"
display_name = name or "匿名用户"
print(display_name)  # Alice

1.5 三元运算符(条件表达式)

Python 的"三元运算符"语法与其他语言不同:

# 语法:值_if_true if 条件 else 值_if_false
age = 20
status = "成年" if age >= 18 else "未成年"
print(status)  # 成年

# 实际应用
score = 75
result = "通过" if score >= 60 else "未通过"

# 可以嵌套(但不推荐过多嵌套,可读性下降)
grade = "A" if score >= 90 else ("B" if score >= 80 else "C")

二、for 循环

2.1 遍历序列

for 循环用于遍历任何可迭代对象(列表、字符串、字典、集合等):

# 遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
    print(f"我喜欢吃{fruit}")

# 遍历字符串(逐字符)
for char in "Python":
    print(char, end=" ")
print()  # 换行
# P y t h o n

# 遍历 range() 生成的数字序列
for i in range(5):
    print(i, end=" ")
print()
# 0 1 2 3 4

2.2 range() 函数详解

range() 是生成整数序列的内置函数:

# range(stop):从 0 到 stop-1
list(range(5))        # [0, 1, 2, 3, 4]

# range(start, stop):从 start 到 stop-1
list(range(2, 8))     # [2, 3, 4, 5, 6, 7]

# range(start, stop, step):步长
list(range(0, 20, 5)) # [0, 5, 10, 15]
list(range(10, 0, -1)) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1](倒序)

# 实际使用场景
# 打印 1 到 10 的平方
for i in range(1, 11):
    print(f"{i}² = {i**2}")

# 遍历偶数
for i in range(0, 20, 2):
    print(i, end=" ")
# 0 2 4 6 8 10 12 14 16 18

2.3 enumerate():同时获取索引和值

fruits = ["苹果", "香蕉", "橙子"]

# 普通方式(不推荐)
for i in range(len(fruits)):
    print(f"{i}: {fruits[i]}")

# 使用 enumerate(推荐)
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

# 指定起始索引
for i, fruit in enumerate(fruits, start=1):
    print(f"第{i}个:{fruit}")
# 第1个:苹果
# 第2个:香蕉
# 第3个:橙子

2.4 zip():同时遍历多个序列

names = ["Alice", "Bob", "Charlie"]
scores = [92, 85, 78]
grades = ["A", "B", "C"]

for name, score, grade in zip(names, scores, grades):
    print(f"{name}: {score}分 ({grade})")
# Alice: 92分 (A)
# Bob: 85分 (B)
# Charlie: 78分 (C)

# zip 在最短序列结束时停止
# 如需处理长度不等的情况,用 itertools.zip_longest

2.5 遍历字典

person = {"name": "Alice", "age": 30, "city": "北京"}

# 遍历键
for key in person:
    print(key)

# 遍历值
for value in person.values():
    print(value)

# 遍历键值对(最常用)
for key, value in person.items():
    print(f"{key}: {value}")

三、while 循环

3.1 基本语法

while 循环在条件为 True 时持续执行:

# 倒计时
count = 5
while count > 0:
    print(f"倒计时:{count}")
    count -= 1  # 等价于 count = count - 1
print("发射!🚀")

# 用户输入验证
password = ""
while password != "python123":
    password = input("请输入密码:")
    if password != "python123":
        print("密码错误,请重试")
print("登录成功!")

3.2 无限循环与 break

有时需要"永远循环,直到某条件触发退出":

# 游戏主循环示意
while True:  # 无限循环
    command = input("请输入命令(quit 退出):")
    if command == "quit":
        print("再见!")
        break  # 跳出循环
    elif command == "help":
        print("可用命令:help, quit")
    else:
        print(f"执行命令:{command}")

四、循环控制:break / continue / pass

4.1 break:提前退出循环

# 在列表中查找第一个负数
numbers = [4, 7, 2, -3, 8, -1, 5]

for num in numbers:
    if num < 0:
        print(f"找到第一个负数:{num}")
        break  # 找到后立即退出循环
else:
    print("没有找到负数")  # 循环正常结束(没有 break)时执行

4.2 continue:跳过当次迭代

# 打印 1-10 中的奇数,跳过偶数
for i in range(1, 11):
    if i % 2 == 0:
        continue  # 跳过偶数,继续下一次循环
    print(i, end=" ")
# 1 3 5 7 9

# 过滤处理数据
data = [10, None, 25, None, 30, 0, 45]

valid_data = []
for item in data:
    if item is None or item == 0:
        continue  # 跳过无效数据
    valid_data.append(item)

print(valid_data)  # [10, 25, 30, 45]

4.3 pass:占位符

pass 语句什么都不做,用作占位符:

# 占位:函数/类还没有实现
def future_feature():
    pass  # 待实现

class PlaceholderClass:
    pass  # 待实现

# 在 if 中占位
for i in range(10):
    if i % 2 == 0:
        pass  # 偶数暂时不处理
    else:
        print(i, end=" ")
# 1 3 5 7 9

4.4 循环的 else 子句(Python 独有)

Python 的 forwhile 循环可以有 else 子句,仅当循环正常结束(没有被 break 打断)时执行:

# 查找列表中的特定元素
def find_prime(numbers):
    for num in numbers:
        if num > 1:
            for i in range(2, int(num**0.5) + 1):
                if num % i == 0:
                    break  # 找到因子,不是质数
            else:
                # for 正常结束(没有 break),说明 num 是质数
                print(f"{num} 是质数")

find_prime([2, 3, 4, 5, 6, 7, 8, 9, 10])
# 2 是质数
# 3 是质数
# 5 是质数
# 7 是质数
# while-else 的应用
attempt = 0
max_attempts = 3

while attempt < max_attempts:
    password = input(f"第 {attempt + 1} 次输入密码:")
    if password == "correct":
        print("验证成功!")
        break
    attempt += 1
else:
    # while 正常结束(attempt >= max_attempts),说明超过最大尝试次数
    print("验证失败,账户已锁定")

五、列表推导式(List Comprehension)

列表推导式是 Python 最具特色的语法之一,可以用一行代码创建列表:

5.1 基本语法

# 传统写法
squares = []
for i in range(1, 11):
    squares.append(i ** 2)

# 列表推导式(更简洁)
squares = [i ** 2 for i in range(1, 11)]
print(squares)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

语法:[表达式 for 变量 in 可迭代对象]

5.2 带条件过滤

# 语法:[表达式 for 变量 in 可迭代对象 if 条件]

# 获取 1-20 中的偶数
evens = [x for x in range(1, 21) if x % 2 == 0]
print(evens)  # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# 过滤并转换:把字符串列表中长度 > 3 的单词转为大写
words = ["cat", "python", "go", "javascript", "rust"]
long_words_upper = [w.upper() for w in words if len(w) > 3]
print(long_words_upper)  # ['PYTHON', 'JAVASCRIPT', 'RUST']

# 实际应用:处理用户列表
users = [
    {"name": "Alice", "active": True},
    {"name": "Bob", "active": False},
    {"name": "Charlie", "active": True},
]
active_names = [user["name"] for user in users if user["active"]]
print(active_names)  # ['Alice', 'Charlie']

5.3 嵌套推导式

# 展平二维列表
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [num for row in matrix for num in row]
print(flat)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 生成乘法表
table = [(x, y, x*y) for x in range(1, 4) for y in range(1, 4)]
for x, y, product in table:
    print(f"{x} × {y} = {product}")

注意:列表推导式应保持简洁可读。如果逻辑过于复杂,应改用普通 for 循环。

5.4 字典推导式与集合推导式

# 字典推导式
squares_dict = {x: x**2 for x in range(1, 6)}
print(squares_dict)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 反转字典(键值互换)
original = {"a": 1, "b": 2, "c": 3}
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict)  # {1: 'a', 2: 'b', 3: 'c'}

# 集合推导式
unique_lengths = {len(word) for word in ["hello", "world", "hi", "python"]}
print(unique_lengths)  # {2, 5, 6}(集合自动去重)

六、生成器表达式

生成器表达式与列表推导式类似,但用圆括号 () 而非方括号 [],不会立即生成所有元素,而是按需生成,内存效率更高:

# 列表推导式:立即生成所有数据,占用内存
squares_list = [x**2 for x in range(1_000_000)]  # 占用大量内存

# 生成器表达式:惰性求值,按需生成
squares_gen = (x**2 for x in range(1_000_000))  # 几乎不占内存

# 适合一次性消费(如求和)
total = sum(x**2 for x in range(1, 11))
print(total)  # 385

# 适合配合其他函数
max_val = max(x**2 for x in range(-5, 6))
print(max_val)  # 25

# 检查是否存在满足条件的元素
has_negative = any(x < 0 for x in [1, 2, -3, 4])
print(has_negative)  # True

all_positive = all(x > 0 for x in [1, 2, 3, 4])
print(all_positive)  # True

七、嵌套循环实战

7.1 打印九九乘法表

for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # 换行

输出:

1×1=1
1×2=2	2×2=4
1×3=3	2×3=6	3×3=9
...

7.2 模式打印

# 打印三角形
n = 5
for i in range(1, n + 1):
    print("*" * i)

# 打印菱形
for i in range(1, n + 1):
    print(" " * (n - i) + "*" * (2 * i - 1))
for i in range(n - 1, 0, -1):
    print(" " * (n - i) + "*" * (2 * i - 1))

八、综合实战:猜数字游戏

"""
猜数字游戏
综合运用:条件判断、while 循环、break/continue、格式化输出
"""
import random

def play_guess_game():
    """运行一次猜数字游戏。"""
    secret = random.randint(1, 100)  # 随机生成 1-100 的数字
    max_attempts = 7
    attempts = 0

    print("=" * 40)
    print("欢迎来到猜数字游戏!")
    print(f"我想了一个 1 到 100 之间的数字")
    print(f"你有 {max_attempts} 次机会")
    print("=" * 40)

    while attempts < max_attempts:
        attempts += 1
        remaining = max_attempts - attempts + 1

        # 获取用户输入
        try:
            guess = int(input(f"\n第 {attempts} 次猜测(剩余 {remaining} 次):"))
        except ValueError:
            print("⚠️ 请输入一个整数!")
            attempts -= 1  # 输入无效不算次数
            continue

        # 范围检查
        if guess < 1 or guess > 100:
            print("⚠️ 请输入 1 到 100 之间的数字!")
            attempts -= 1
            continue

        # 判断结果
        if guess == secret:
            print(f"\n🎉 恭喜!你猜对了!答案就是 {secret}")
            print(f"你用了 {attempts} 次猜到了!")
            if attempts <= 3:
                print("🌟 太厉害了!")
            elif attempts <= 5:
                print("👍 不错的成绩!")
            break
        elif guess < secret:
            diff = secret - guess
            if diff <= 5:
                print("📈 太小了,非常接近!")
            elif diff <= 20:
                print("📈 小了一些")
            else:
                print("📈 太小了,差得远呢")
        else:
            diff = guess - secret
            if diff <= 5:
                print("📉 太大了,非常接近!")
            elif diff <= 20:
                print("📉 大了一些")
            else:
                print("📉 太大了,差得远呢")
    else:
        # 用完所有机会
        print(f"\n😞 很遗憾,机会用完了!答案是 {secret}")

    # 询问是否再玩
    again = input("\n再来一局?(y/n): ")
    if again.lower() == "y":
        play_guess_game()  # 递归调用(简单演示)
    else:
        print("感谢游玩,再见!👋")

# 运行游戏
play_guess_game()

九、总结

本文深入讲解了 Python 的流程控制:

语句用途关键点
if/elif/else条件分支支持链式比较,elif 可多个
for遍历可迭代对象enumerate()zip()items()
range()生成整数序列三参数:start, stop, step
while按条件循环注意避免死循环
break跳出循环跳出最内层循环
continue跳过当次继续下一次迭代
pass占位符语法上需要语句但无内容时
for/while...else循环正常结束时执行break 打断则不执行
列表推导式简洁创建列表[expr for x in iter if cond]
生成器表达式惰性求值内存效率高,(expr for x in iter)

下一篇,我们进入函数的世界——Python 编程最重要的抽象机制,学会如何将代码封装成可复用的模块。


上一篇【第 004 篇】Python 数据类型与变量:从零开始理解数据
下一篇【第 006 篇】函数——Python 编程的核心抽象


参考资料

  1. Python 官方文档 - 控制流
  2. Python 官方文档 - 列表推导式
  3. PEP 202 — List Comprehensions
  4. PEP 289 — Generator Expressions
  5. Python 官方文档 - range()
  6. Python 官方文档 - enumerate()

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐