Python 第七节 循环语句for和while使用详解及注意事项
1. Python循环语句概述
循环是编程中重复执行特定代码块的结构。Python 提供两种主要的循环结构:for循环和while循环
。
2. for
循环
2.1 基本语法
for 变量 in 序列:循环体
2.2 遍历不同数据类型
# 遍历列表
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:print(fruit)# 遍历字符串
for char in "Hello":print(char)# 遍历字典
person = {'name': 'Alice', 'age': 25, 'city': 'Beijing'}
for key in person:print(f"{key}: {person[key]}")# 遍历字典的键值对
for key, value in person.items():print(f"{key} = {value}")
2.3 使用 range()
函数
# 基本用法
for i in range(5):print(i) # 0, 1, 2, 3, 4# 指定起始和结束值
for i in range(2, 6):print(i) # 2, 3, 4, 5# 指定步长
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
2.4 使用 enumerate()
获取索引
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):print(f"索引 {index}: {fruit}")# 指定起始索引
for index, fruit in enumerate(fruits, start=1):print(f"第 {index} 个水果: {fruit}")
2.5 使用 zip()
同时遍历多个序列
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
cities = ['Beijing', 'Shanghai', 'Guangzhou']for name, age, city in zip(names, ages, cities):print(f"{name} is {age} years old and lives in {city}")
3. while
循环
3.1 基本语法
while 条件:循环体
3.2 基本示例
# 计数器循环
count = 0
while count < 5:print(f"计数: {count}")count += 1# 用户输入验证
password = ""
while password != "secret":password = input("请输入密码: ")
print("密码正确!")# 无限循环(需要break退出)
while True:user_input = input("输入 'quit' 退出: ")if user_input == 'quit':breakprint(f"你输入了: {user_input}")
4. 循环控制语句
4.1 break
- 终止循环
# 找到第一个满足条件的元素后退出
numbers = [1, 3, 5, 8, 10, 13]
for num in numbers:if num % 2 == 0:print(f"找到第一个偶数: {num}")break# while循环中的break
count = 0
while True:if count >= 5:breakprint(count)count += 1
4.2 continue
- 跳过当前迭代
# 跳过偶数,只打印奇数
for i in range(10):if i % 2 == 0:continueprint(f"奇数: {i}")# 跳过空值或无效数据
data = [1, None, 3, 0, 5, '', 7]
for item in data:if not item: # 跳过None、0、空字符串等假值continueprint(f"有效数据: {item}")
4.3 else
子句
# for循环的else:循环正常结束(非break退出)时执行
for i in range(5):print(i)
else:print("循环正常结束")# 与break结合使用
for i in range(5):if i == 3:print("遇到3,提前退出")breakprint(i)
else:print("这行不会执行,因为循环被break中断")# while循环的else
count = 0
while count < 3:print(count)count += 1
else:print("while循环正常结束")
5. 嵌套循环
5.1 基本嵌套循环
# 打印乘法表
for i in range(1, 4):for j in range(1, 4):print(f"{i} × {j} = {i * j}", end="\t")print() # 换行# 遍历二维列表
matrix = [[1, 2, 3],[4, 5, 6],[7, 8, 9]
]for row in matrix:for element in row:print(element, end=" ")print()
5.2 控制嵌套循环
# 在嵌套循环中使用break
for i in range(3):for j in range(3):if i == j == 1:print("找到(1,1),退出内层循环")breakprint(f"({i}, {j})")print(f"外层循环 i={i}")# 使用标志变量控制外层循环
found = False
for i in range(3):for j in range(3):if i == j == 1:print("找到(1,1),退出所有循环")found = Truebreakprint(f"({i}, {j})")if found:break
6. 实际应用案例
6.1 数据分析 - 统计成绩
def analyze_grades(grades):"""分析学生成绩"""total = 0count = 0excellent_count = 0for grade in grades:if grade >= 0 and grade <= 100: # 验证成绩有效性total += gradecount += 1if grade >= 90:excellent_count += 1else:print(f"无效成绩: {grade}")continueif count > 0:average = total / countexcellent_rate = (excellent_count / count) * 100print(f"平均分: {average:.2f}")print(f"优秀率: {excellent_rate:.2f}%")else:print("没有有效成绩数据")# 使用示例
student_grades = [85, 92, 78, 96, 88, 105, -5, 91]
analyze_grades(student_grades)
6.2 文件处理 - 读取和处理数据
def process_log_file(filename):"""处理日志文件,统计错误信息"""error_count = 0warning_count = 0error_messages = []try:with open(filename, 'r') as file:line_number = 0for line in file:line_number += 1line = line.strip()if not line: # 跳过空行continueif 'ERROR' in line:error_count += 1error_messages.append(f"第{line_number}行: {line}")elif 'WARNING' in line:warning_count += 1print(f"错误数量: {error_count}")print(f"警告数量: {warning_count}")if error_messages:print("错误信息:")for msg in error_messages:print(f" - {msg}")except FileNotFoundError:print(f"文件 {filename} 不存在")# 模拟使用(实际需要真实文件)
# process_log_file('app.log')
6.3 游戏开发 - 猜数字游戏
import randomdef guess_number_game():"""猜数字游戏"""target = random.randint(1, 100)attempts = 0max_attempts = 7print("=== 猜数字游戏 ===")print(f"我已经想了一个1-100之间的数字,你有{max_attempts}次机会猜中它!")while attempts < max_attempts:attempts += 1remaining = max_attempts - attemptstry:guess = int(input(f"\n第{attempts}次尝试 (还剩{remaining}次): "))except ValueError:print("请输入有效的数字!")attempts -= 1 # 不计入尝试次数continueif guess < target:print("猜小了!")elif guess > target:print("猜大了!")else:print(f"恭喜!你用了{attempts}次猜对了数字 {target}!")breakelse:print(f"\n游戏结束!正确答案是: {target}")play_again = input("\n再玩一次?(y/n): ").lower()if play_again == 'y':guess_number_game()# 启动游戏
# guess_number_game()
6.4 网络请求 - 批量处理URL
import time
import requestsdef batch_url_processor(urls, delay=1):"""批量处理URL请求"""successful = 0failed = 0results = []for i, url in enumerate(urls, 1):print(f"处理第 {i}/{len(urls)} 个URL: {url}")try:response = requests.get(url, timeout=10)if response.status_code == 200:successful += 1results.append({'url': url,'status': 'success','size': len(response.content)})print(f" ✓ 成功 (大小: {len(response.content)} 字节)")else:failed += 1results.append({'url': url,'status': f'failed - HTTP {response.status_code}'})print(f" ✗ 失败 - HTTP状态码: {response.status_code}")except requests.RequestException as e:failed += 1results.append({'url': url,'status': f'failed - {str(e)}'})print(f" ✗ 失败 - 错误: {e}")# 延迟,避免请求过快if i < len(urls):print(f"等待 {delay} 秒...")time.sleep(delay)print(f"\n处理完成!成功: {successful}, 失败: {failed}")return results# 使用示例(需要安装requests库)
# urls = ['https://httpbin.org/get', 'https://httpbin.org/status/404', 'invalid-url']
# results = batch_url_processor(urls)
7. 高级循环技巧
7.1 列表推导式
# 传统循环
squares = []
for i in range(10):squares.append(i**2)# 列表推导式(更简洁)
squares = [i**2 for i in range(10)]# 带条件的列表推导式
even_squares = [i**2 for i in range(10) if i % 2 == 0]# 嵌套循环的列表推导式
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = [num for row in matrix for num in row]
7.2 生成器表达式(内存友好)
# 对于大数据集,使用生成器节省内存
# 列表推导式(立即计算所有结果)
large_list = [x**2 for x in range(1000000)] # 占用大量内存# 生成器表达式(按需计算)
large_generator = (x**2 for x in range(1000000)) # 内存友好# 在循环中使用生成器
total = 0
for value in large_generator:total += valueif total > 1000:break
8. 注意事项和最佳实践
8.1 性能优化
# 避免在循环内进行重复计算
# 不推荐
for i in range(10000):result = expensive_operation() # 每次循环都调用# 推荐:将不变的计算移到循环外
result = expensive_operation()
for i in range(10000):# 使用result# 使用局部变量加速循环访问
# 较慢
data = [1, 2, 3, 4, 5]
for i in range(len(data)):process(data[i])# 较快:直接迭代元素
for item in data:process(item)
8.2 避免无限循环
# 危险的无限循环
# while True:
# print("这永远不会停止!")# 安全的循环:设置退出条件或超时机制
import timetimeout = 10
start_time = time.time()
while True:# 处理逻辑if time.time() - start_time > timeout:print("超时退出")break# 或者其他退出条件if should_exit():break
8.3 异常处理
# 在循环中妥善处理异常
data = [1, 2, 'three', 4, 5]for item in data:try:result = item * 2print(f"{item} × 2 = {result}")except TypeError:print(f"无法处理非数字: {item}")continue # 继续下一个迭代
8.4 循环中的资源管理
# 正确管理文件资源
def process_files(filenames):results = []for filename in filenames:try:with open(filename, 'r') as file: # 使用with自动关闭文件content = file.read()results.append(process_content(content))except IOError as e:print(f"无法读取文件 {filename}: {e}")continuereturn results
总结
循环是Python编程的核心概念,掌握好循环技巧可以:
提高代码效率:合理选择循环方式和优化策略
增强代码可读性:使用适当的循环结构和控制语句
处理复杂逻辑:通过嵌套循环解决多维问题
资源友好:使用生成器等技巧处理大数据
关键要点
:
- 优先使用
for
循环遍历已知序列 while
循环适合条件不确定的情况- 合理使用
break、continue
控制流程 - 注意循环性能和内存使用
- 始终考虑
异常
处理和边界
情况