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':
break
print(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:
break
print(count)
count += 1
4.2 continue - 跳过当前迭代
# 跳过偶数,只打印奇数
for i in range(10):
if i % 2 == 0:
continue
print(f"奇数: {i}")
# 跳过空值或无效数据
data = [1, None, 3, 0, 5, '', 7]
for item in data:
if not item: # 跳过None、0、空字符串等假值
continue
print(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,提前退出")
break
print(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),退出内层循环")
break
print(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 = True
break
print(f"({i}, {j})")
if found:
break
6. 实际应用案例
6.1 数据分析 - 统计成绩
def analyze_grades(grades):
"""分析学生成绩"""
total = 0
count = 0
excellent_count = 0
for grade in grades:
if grade >= 0 and grade <= 100: # 验证成绩有效性
total += grade
count += 1
if grade >= 90:
excellent_count += 1
else:
print(f"无效成绩: {grade}")
continue
if count > 0:
average = total / count
excellent_rate = (excellent_count / count) * 100
print(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 = 0
warning_count = 0
error_messages = []
try:
with open(filename, 'r') as file:
line_number = 0
for line in file:
line_number += 1
line = line.strip()
if not line: # 跳过空行
continue
if 'ERROR' in line:
error_count += 1
error_messages.append(f"第{line_number}行: {line}")
elif 'WARNING' in line:
warning_count += 1
print(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 random
def guess_number_game():
"""猜数字游戏"""
target = random.randint(1, 100)
attempts = 0
max_attempts = 7
print("=== 猜数字游戏 ===")
print(f"我已经想了一个1-100之间的数字,你有{max_attempts}次机会猜中它!")
while attempts < max_attempts:
attempts += 1
remaining = max_attempts - attempts
try:
guess = int(input(f"\n第{attempts}次尝试 (还剩{remaining}次): "))
except ValueError:
print("请输入有效的数字!")
attempts -= 1 # 不计入尝试次数
continue
if guess < target:
print("猜小了!")
elif guess > target:
print("猜大了!")
else:
print(f"恭喜!你用了{attempts}次猜对了数字 {target}!")
break
else:
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 requests
def batch_url_processor(urls, delay=1):
"""批量处理URL请求"""
successful = 0
failed = 0
results = []
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 += 1
results.append({
'url': url,
'status': 'success',
'size': len(response.content)
})
print(f" ✓ 成功 (大小: {len(response.content)} 字节)")
else:
failed += 1
results.append({
'url': url,
'status': f'failed - HTTP {response.status_code}'
})
print(f" ✗ 失败 - HTTP状态码: {response.status_code}")
except requests.RequestException as e:
failed += 1
results.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 += value
if 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 time
timeout = 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 * 2
print(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}")
continue
return results
总结
循环是Python编程的核心概念,掌握好循环技巧可以:
提高代码效率:合理选择循环方式和优化策略
增强代码可读性:使用适当的循环结构和控制语句
处理复杂逻辑:通过嵌套循环解决多维问题
资源友好:使用生成器等技巧处理大数据
关键要点:
- 优先使用
for循环遍历已知序列 while循环适合条件不确定的情况- 合理使用
break、continue控制流程 - 注意循环性能和内存使用
- 始终考虑
异常处理和边界情况
更多推荐



所有评论(0)