当前位置:首页 > Python > 正文

Python迭代机制详解 - 从基础到高级应用 | Python编程教程

Python迭代机制完全指南

掌握可迭代对象、迭代器与生成器的核心概念

什么是迭代?

迭代是Python中访问集合元素的一种方式,它允许我们逐个访问数据集合中的元素,而不需要知道集合的内部结构。

简单来说:迭代就是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。在Python中,每次对过程重复称为一次"迭代"。

可迭代对象 vs 迭代器

可迭代对象 (Iterable)

  • 实现了 __iter__() 方法的对象
  • 可以被用于 for 循环
  • 可以多次使用
  • 例如:列表、元组、字典、字符串

迭代器 (Iterator)

  • 实现了 __iter__()__next__() 方法的对象
  • 可以记住遍历的位置
  • 只能遍历一次
  • 例如:文件对象、生成器

关键区别:所有迭代器都是可迭代对象,但并非所有可迭代对象都是迭代器。可迭代对象可以转换为迭代器使用 iter() 函数。

迭代基础:使用for循环

Python中最常见的迭代方式是使用 for 循环:

# 遍历列表
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
    print(fruit)

# 遍历字典
person = {"name": "张三", "age": 30, "city": "北京"}
for key, value in person.items():
    print(f"{key}: {value}")

# 遍历字符串
text = "Python"
for char in text:
    print(char)

手动迭代:iter()和next()

了解底层机制:手动控制迭代过程

# 创建可迭代对象
numbers = [1, 2, 3, 4, 5]

# 转换为迭代器
numbers_iter = iter(numbers)

# 手动获取元素
print(next(numbers_iter))  # 输出: 1
print(next(numbers_iter))  # 输出: 2
print(next(numbers_iter))  # 输出: 3

# 继续迭代剩余元素
for num in numbers_iter:
    print(num)  # 输出: 4, 5

# 尝试获取超出范围的元素会引发StopIteration异常
try:
    print(next(numbers_iter))
except StopIteration:
    print("迭代结束")

创建自定义迭代器

通过实现 __iter__()__next__() 方法创建自定义迭代器:

class Countdown:
    def __init__(self, start):
        self.current = start
        
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        else:
            num = self.current
            self.current -= 1
            return num

# 使用自定义迭代器
countdown = Countdown(5)
for num in countdown:
    print(num)  # 输出: 5, 4, 3, 2, 1

生成器:简化迭代器创建

生成器是一种更简单的创建迭代器的方法,使用 yield 关键字:

# 生成器函数
def fibonacci(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

# 使用生成器
fib_gen = fibonacci(100)
for num in fib_gen:
    print(num, end=" ")  # 输出: 0 1 1 2 3 5 8 13 21 34 55 89

# 生成器表达式
squares = (x*x for x in range(10))
print("\n平方数:", list(squares))

生成器优势:内存高效(惰性计算)、代码简洁、支持无限序列

迭代工具与技巧

enumerate()

同时获取索引和元素

fruits = ["苹果", "香蕉", "橙子"]
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

zip()

并行迭代多个序列

names = ["张三", "李四", "王五"]
ages = [25, 30, 28]
for name, age in zip(names, ages):
    print(f"{name}今年{age}岁")

itertools模块

提供高级迭代工具

import itertools
# 无限计数器
counter = itertools.count(start=10, step=2)
# 排列组合
perms = itertools.permutations("ABC", 2)

迭代最佳实践总结

  • 优先使用for循环进行迭代
  • 处理大文件时使用迭代器避免内存溢出
  • 需要索引时使用enumerate()
  • 并行迭代使用zip()
  • 创建复杂迭代器时使用生成器
  • 了解迭代器只能使用一次的特性
  • 使用itertools处理复杂迭代逻辑
  • 惰性求值可以提升性能

Python迭代教程 | 深入理解Python迭代机制 | 可迭代对象与迭代器详解

发表评论