迭代器是实现两个方法的任何对象:
创建基本迭代器:
class Counter: def __init__(self, start, end): self.current = start self.end = end def __iter__(self): return self # Returns itself as an iterator def __next__(self): if self.current >= self.end: raise StopIteration self.current += 1 return self.current - 1 counter = Counter(1, 4) for number in counter: print(number) # Outputs: 1, 2, 3
此类手动控制 next() 调用,当到达末尾时停止。迭代器有利于处理按需处理每个元素的序列。
生成器是创建迭代器的更简单方法。通过使用yield 关键字的函数进行定义,它会在yield 处暂停函数执行,并在调用next() 时恢复函数执行。每个yield语句都会保存函数的状态,这意味着它可以从中断处继续。
基本生成器示例:
def countdown(num): while num > 0: yield num num -= 1 for n in countdown(3): print(n) # Outputs: 3, 2, 1
当调用yield时,函数返回当前值并暂停,等待next()恢复。
生成器即时计算值,这称为惰性求值。与将所有项目存储在内存中的列表不同,生成器仅根据需要生成项目,这非常适合:
示例:使用生成器读取大文件:
def read_large_file(file_path): with open(file_path) as file: for line in file: yield line # Only processes one line at a time
这种方法可以防止将整个文件加载到内存中,这对于大量文件特别有用。
生成器表达式是创建生成器的一种简洁方式,使用括号而不是像列表推导式那样的方括号。
示例:
squares = (x * x for x in range(5)) print(next(squares)) # Outputs: 0 print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
在这里,squares 仅在请求时计算值,从而节省内存。
yield from 语句对于将一个生成器的部分操作委托给另一个生成器非常有用。当您想要将生成器分解为子生成器以实现模块化时,这非常有用。
示例:
def generator_a(): yield 1 yield 2 def generator_b(): yield from generator_a() yield 3 for val in generator_b(): print(val) # Outputs: 1, 2, 3
简化代码的产量,特别是在复杂或嵌套的生成器链中。
生成器在以下情况下特别有用:
另一方面,列表在以下情况下会更好:
通过迭代器和生成器,Python 使您能够以内存效率和灵活性来控制数据处理。它们对于处理大型数据集、流数据和构建自定义可迭代对象至关重要。
掌握这些,你就能像 Python 专家一样处理数据! ?
以上是深入理解Python迭代器:使用'__iter__”和'__next__”导航数据的详细内容。更多信息请关注PHP中文网其他相关文章!