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 的条件执行对应代码块 |
来看一个完整的示例,演示如何根据分数判断成绩等级:
# 获取用户输入的分数,注意 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 |
让我们看几个实用的示例:
# 示例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 时重复执行循环体 |
| 循环控制 - break | break | 立即退出整个循环,无论条件是否仍为真 |
| 循环控制 - continue | continue | 跳过当前迭代的剩余代码,直接进入下一次循环条件检查 |
下面是一个综合示例,演示如何使用 while 循环实现一个简单的猜数字游戏:
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 循环的灵活性,通过结合 break 和 continue 语句,实现了复杂的游戏逻辑控制。
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)] | 创建嵌套结构,外层循环在前,内层循环在后 |
让我们通过几个实际例子来看看列表推导式的威力:
# 示例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 风格)。不过记住,代码的可读性永远比炫技更重要!