Skip to content

5.1 if 条件语句与多分支判断

在 Python 中,if 语句是程序控制流的基础。它允许我们根据条件的真假来决定是否执行某段代码。这就像生活中做选择题——如果天气好,我们就去爬山;否则,就宅在家里打游戏。

Python 的 if 语句支持三种基本结构:

  • 单分支:只有 if
  • 双分支:if + else
  • 多分支:if + elif + else

下面这个表格列出了 if 语句的核心用法:

功能名称实例调用方法具体功能、注意事项、必需参数/可选参数
单条件判断if condition:当 condition 为 True 时执行代码块,condition 必须是布尔表达式
双分支判断if condition: ... else: ...condition 为 True 执行 if 块,否则执行 else 块
多分支判断if c1: ... elif c2: ... else: ...从上到下依次检查条件,找到第一个为 True 的条件执行对应代码块

来看一个完整的示例,演示如何根据分数判断成绩等级:

python
# 获取用户输入的分数,注意 input() 接收到的始终是字符串
score_str = input("请输入您的考试分数(0-100):")
score = float(score_str)

if score < 0 or score > 100:
    print("输入的分数无效")
elif score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 70:
    print("中等")
elif score >= 60:
    print("及格")
else:
    print("不及格")

注意

本教程使用的是 Python 3,input() 接收到的始终是字符串,不存在 Python 2 中 input() 会执行代码的安全风险。如果你在旧系统中遇到 Python 2,请务必改用 raw_input()。

注意事项:

  • 条件表达式不需要用括号包围(虽然加上也不报错)
  • Python 使用缩进来表示代码块,而不是大括号
  • elif 是 "else if" 的缩写,可以有多个 elif 分支
  • 条件判断是从上到下顺序执行的,一旦某个条件满足,后面的条件就不会再检查了

这段代码展示了如何安全地处理用户输入,并使用多分支条件判断来给出不同的反馈。通过异常处理确保程序不会因为无效输入而崩溃。

5.2 for 循环遍历容器

for 循环是 Python 中最常用的循环结构,特别适合用来遍历各种容器类型(如列表、元组、字符串、字典等)。它的设计理念是"对每个元素做同样的事情",这让代码既简洁又直观。

Python 的 for 循环与其他语言不同,它直接遍历容器中的元素,而不是通过索引。当然,如果你确实需要索引,Python 也提供了优雅的解决方案。

下面是 for 循环的主要用法:

功能名称实例调用方法具体功能、注意事项、必需参数/可选参数
基本遍历for item in container:遍历容器中的每个元素,item 是当前元素的变量名
带索引遍历for index, item in enumerate(container):同时获取元素的索引和值,enumerate() 返回 (index, value) 元组
范围遍历for i in range(start, stop, step):生成数字序列进行遍历,start 默认为 0,step 默认为 1

让我们看几个实用的示例:

python
# 示例1:遍历列表中的水果
fruits = ["苹果", "香蕉", "橙子", "葡萄"]

print("我的水果清单:")
# 直接遍历列表元素
for fruit in fruits:
    # fruit 变量在每次循环中自动获取列表中的下一个元素
    print(f"- {fruit}")

print("\n带编号的水果清单:")
# 使用 enumerate() 同时获取索引和元素
for index, fruit in enumerate(fruits):
    # index 从 0 开始,如果想要从 1 开始,可以用 enumerate(fruits, 1)
    print(f"{index + 1}. {fruit}")

# 示例2:遍历字符串
message = "Hello Python!"
print(f"\n分析字符串 '{message}':")
# 字符串也是可遍历的容器,每个字符都是一个元素
for char in message:
    if char.isalpha():  # 检查是否为字母
        print(f"'{char}' 是字母")
    elif char.isdigit():  # 检查是否为数字
        print(f"'{char}' 是数字")
    else:
        print(f"'{char}' 是特殊字符")

# 示例3:使用 range() 生成数字序列
print("\n倒计时开始:")
# range(5, 0, -1) 生成 5, 4, 3, 2, 1
for i in range(5, 0, -1):
    print(i)
print("发射!")

注意事项:

  • for 循环可以配合 break(跳出循环)和 continue(跳过当前迭代)使用
  • 在遍历过程中不要修改正在遍历的容器,这可能导致意外行为
  • range() 函数返回的是一个 range 对象,不是列表,这样更节省内存
  • 字符串、列表、元组、字典、集合等都是可迭代对象,都可以用 for 循环遍历

这些示例展示了 for 循环在不同场景下的应用,从简单的列表遍历到复杂的字符串分析,体现了 Python 循环结构的灵活性和易用性。

5.3 while 循环与循环控制

while 循环是另一种重要的循环结构,它基于条件判断来决定是否继续执行循环体。与 for 循环不同,while 循环适用于那些不知道确切迭代次数的场景,比如等待用户输入有效数据、实现游戏主循环等。

while 循环的核心思想是"只要条件为真,就一直执行"。但要小心,如果条件永远不会变为假,就会造成无限循环!

以下是 while 循环的关键用法:

功能名称实例调用方法具体功能、注意事项、必需参数/可选参数
基本 while 循环while condition:当 condition 为 True 时重复执行循环体
循环控制 - breakbreak立即退出整个循环,无论条件是否仍为真
循环控制 - continuecontinue跳过当前迭代的剩余代码,直接进入下一次循环条件检查

下面是一个综合示例,演示如何使用 while 循环实现一个简单的猜数字游戏:

python
import random

# 生成 1-100 之间的随机整数作为目标数字
target_number = random.randint(1, 100)
print("欢迎来到猜数字游戏!")
print("我已经想好了一个 1-100 之间的数字,你能猜中吗?")

# 初始化猜测次数和用户输入
guess_count = 0
user_input = ""

# 主游戏循环
while True:  # 使用无限循环,通过 break 控制退出
    guess_count += 1  # 增加猜测次数
    
    try:
        # 获取用户输入
        user_input = input(f"第 {guess_count} 次猜测,请输入你的数字(输入 'quit' 退出):")
        
        # 检查用户是否想要退出游戏
        if user_input.lower() == 'quit':
            print(f"游戏结束!正确答案是 {target_number}")
            break
            
        # 将输入转换为整数
        guess = int(user_input)
        
        # 检查输入范围
        if guess < 1 or guess > 100:
            print("请输入 1-100 之间的数字!")
            guess_count -= 1  # 无效输入不计入猜测次数
            continue  # 跳过本次循环的剩余部分
            
        # 判断猜测结果
        if guess == target_number:
            print(f"恭喜你!猜对了!答案就是 {target_number}")
            print(f"你总共用了 {guess_count} 次猜测")
            break  # 猜对了,退出循环
        elif guess < target_number:
            print("太小了!再试试更大的数字")
        else:
            print("太大了!再试试更小的数字")
            
    except ValueError:
        # 处理非数字输入
        if user_input.lower() != 'quit':  # 如果不是 quit 命令
            print("请输入有效的数字!")
            guess_count -= 1  # 无效输入不计入猜测次数

print("感谢游玩!")

注意事项:

  • while True 创建无限循环,必须在循环体内使用 break 来退出
  • 使用 continue 可以跳过当前迭代,但要确保循环变量或条件会在后续发生变化
  • while 循环中要特别注意避免无限循环,确保循环条件最终会变为 False
  • while 循环适合处理不确定次数的操作,而 for 循环更适合已知次数的遍历

这个猜数字游戏充分展示了 while 循环的灵活性,通过结合 breakcontinue 语句,实现了复杂的游戏逻辑控制。

5.4 列表推导式简化循环

列表推导式(List Comprehension)是 Python 中一个非常优雅的特性,它允许我们用一行代码创建新的列表,而不需要写完整的 for 循环。这不仅让代码更简洁,通常还比传统的循环更快!

列表推导式的基本语法是:[expression for item in iterable if condition]。你可以把它理解为"对可迭代对象中的每个元素,应用某个表达式,如果满足条件的话"。

下面是列表推导式的主要应用场景:

功能名称实例调用方法具体功能、注意事项、必需参数/可选参数
基本列表推导[x*2 for x in numbers]对每个元素应用表达式,numbers 必须是可迭代对象
带条件过滤[x for x in numbers if x > 0]只包含满足条件的元素,if 子句是可选的
嵌套列表推导[[x*y for y in range(3)] for x in range(3)]创建嵌套结构,外层循环在前,内层循环在后

让我们通过几个实际例子来看看列表推导式的威力:

python
# 示例1:基本的列表变换
numbers = [1, 2, 3, 4, 5]
print(f"原始列表: {numbers}")

# 传统 for 循环方式
squared_old = []
for num in numbers:
    squared_old.append(num ** 2)

# 列表推导式方式
squared_new = [num ** 2 for num in numbers]

print(f"传统方式: {squared_old}")
print(f"推导式方式: {squared_new}")

# 示例2:带条件过滤
mixed_numbers = [-3, -1, 0, 2, 4, 6, 8, -5]
print(f"\n混合数字列表: {mixed_numbers}")

# 只保留正数并求平方
positive_squares = [num ** 2 for num in mixed_numbers if num > 0]
print(f"正数的平方: {positive_squares}")

# 更复杂的条件:只保留偶数且大于2的数字
filtered_numbers = [num for num in mixed_numbers if num > 2 and num % 2 == 0]
print(f"大于2的偶数: {filtered_numbers}")

# 示例3:处理字符串
words = ["apple", "banana", "cherry", "date"]
print(f"\n原始单词列表: {words}")

# 将所有单词转为大写
uppercase_words = [word.upper() for word in words]
print(f"大写单词: {uppercase_words}")

# 只处理长度大于5的单词
long_words_upper = [word.upper() for word in words if len(word) > 5]
print(f"长单词的大写形式: {long_words_upper}")

# 示例4:嵌套列表推导式(创建乘法表)
print("\n3x3 乘法表:")
multiplication_table = [[i * j for j in range(1, 4)] for i in range(1, 4)]
for row in multiplication_table:
    print(row)

# 示例5:字典推导式(虽然章节是列表推导式,但提一下其他推导式)
students = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]
student_scores = {name: score for name, score in zip(students, scores)}
print(f"\n学生成绩字典: {student_scores}")

注意事项:

  • 列表推导式虽然简洁,但不要过度嵌套,否则会影响代码可读性
  • 对于复杂的逻辑,传统的 for 循环可能更清晰易懂
  • 列表推导式会一次性创建整个列表,如果数据量很大,可能会占用较多内存
  • Python 还支持集合推导式 {expression for item in iterable} 和字典推导式 {key: value for item in iterable}
  • 推导式中的变量作用域在 Python 3 中是局部的,不会污染外部命名空间

列表推导式是 Python 的标志性特性之一,掌握它能让你的代码更加 Pythonic(符合 Python 风格)。不过记住,代码的可读性永远比炫技更重要!