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编程的核心概念,掌握好循环技巧可以:

提高代码效率:合理选择循环方式和优化策略
增强代码可读性:使用适当的循环结构和控制语句
处理复杂逻辑:通过嵌套循环解决多维问题
资源友好:使用生成器等技巧处理大数据

关键要点

  1. 优先使用for循环遍历已知序列
  2. while循环适合条件不确定的情况
  3. 合理使用break、continue控制流程
  4. 注意循环性能内存使用
  5. 始终考虑异常处理和边界情况

更多推荐