Python 迭代器、生成器、推导式详解

部署运行你感兴趣的模型镜像

1. 迭代器 (Iterator)

1.1 什么是迭代器

迭代器是一个可以记住遍历位置的对象,它实现了迭代器协议(包含 __iter__() 和 __next__() 方法)。

1.2 创建迭代器

# 自定义迭代器类
class MyIterator:
    def __init__(self, max_value):
        self.max_value = max_value
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current < self.max_value:
            self.current += 1
            return self.current
        else:
            raise StopIteration

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

1.3 内置迭代器函数

# iter() 和 next() 函数
my_list = [1, 2, 3, 4, 5]
my_iter = iter(my_list)

print(next(my_iter))  # 输出: 1
print(next(my_iter))  # 输出: 2
print(next(my_iter))  # 输出: 3

# 手动遍历剩余元素
while True:
    try:
        item = next(my_iter)
        print(item)
    except StopIteration:
        break

2. 生成器 (Generator)

2.1 什么是生成器

生成器是一种特殊的迭代器,使用 yield 关键字来返回值,可以暂停和恢复函数的执行。

2.2 创建生成器函数

def simple_generator():
    yield 1
    yield 2
    yield 3

# 使用生成器
gen = simple_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

# 或者使用 for 循环
for value in simple_generator():
    print(value)

2.3 实用的生成器示例

# 生成斐波那契数列
def fibonacci(limit):
    a, b = 0, 1
    count = 0
    while count < limit:
        yield a
        a, b = b, a + b
        count += 1

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

# 无限计数器
def infinite_counter():
    count = 0
    while True:
        yield count
        count += 1

counter = infinite_counter()
print(next(counter))  # 输出: 0
print(next(counter))  # 输出: 1

2.4 生成器表达式

# 类似于列表推导式,但使用圆括号
squares = (x**2 for x in range(10))

print(next(squares))  # 输出: 0
print(next(squares))  # 输出: 1

# 一次性获取所有值
all_squares = list(squares)
print(all_squares)  # 输出: [4, 9, 16, 25, 36, 49, 64, 81]

3. 推导式 (Comprehensions)

3.1 列表推导式

# 基本语法
squares = [x**2 for x in range(10)]
print(squares)  # 输出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares)  # 输出: [0, 4, 16, 36, 64]

# 嵌套循环
pairs = [(x, y) for x in range(3) for y in range(3)]
print(pairs)  # 输出: [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0), (2,1), (2,2)]

3.2 字典推导式

# 创建字典
square_dict = {x: x**2 for x in range(5)}
print(square_dict)  # 输出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# 交换键值对
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {value: key for key, value in original.items()}
print(swapped)  # 输出: {1: 'a', 2: 'b', 3: 'c'}

# 带条件的字典推导式
even_squares_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares_dict)  # 输出: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}

3.3 集合推导式

# 创建集合(自动去重)
unique_squares = {x**2 for x in [1, 2, 2, 3, 3, 3, 4]}
print(unique_squares)  # 输出: {1, 4, 9, 16}

# 带条件的集合推导式
even_unique = {x for x in range(10) if x % 2 == 0}
print(even_unique)  # 输出: {0, 2, 4, 6, 8}

4. 综合应用示例

4.1 文件处理

# 使用生成器处理大文件
def read_large_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            yield line.strip()

# 使用推导式处理数据
file_reader = read_large_file('data.txt')
long_lines = [line for line in file_reader if len(line) > 50]

4.2 数据处理管道

# 创建数据处理管道
def number_generator(limit):
    for i in range(limit):
        yield i

def filter_even(numbers):
    for num in numbers:
        if num % 2 == 0:
            yield num

def square(numbers):
    for num in numbers:
        yield num ** 2

# 组合使用
pipeline = square(filter_even(number_generator(10)))
result = list(pipeline)
print(result)  # 输出: [0, 4, 16, 36, 64]

4.3 内存高效的数据处理

# 使用生成器表达式节省内存
# 传统方法(占用更多内存)
data = [x**2 for x in range(1000000)]  # 创建完整列表

# 生成器方法(内存高效)
data_gen = (x**2 for x in range(1000000))  # 按需生成

# 处理大数据集
def process_large_dataset():
    return sum(x**2 for x in range(1000000) if x % 2 == 0)

result = process_large_dataset()
print(f"结果: {result}")

5. 关键区别和最佳实践

5.1 迭代器 vs 生成器

  • 迭代器:需要实现 __iter__() 和 __next__() 方法

  • 生成器:使用 yield 关键字,自动实现迭代器协议

5.2 内存使用考虑

# 列表推导式 - 立即创建完整列表
list_comp = [x**2 for x in range(1000000)]  # 高内存使用

# 生成器表达式 - 按需生成值
gen_exp = (x**2 for x in range(1000000))    # 低内存使用

5.3 性能建议

  1. 处理大数据时优先使用生成器

  2. 需要多次访问数据时使用列表推导式

  3. 使用 yield from 委托生成器

  4. 合理使用 itertools 模块中的工具

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值