📰 来源: 博客园
在Python中,迭代器和生成器是处理数据流的灵魂,它们的核心目标只有一个————节省内存。
迭代器(Iterator)
nums = [1, 2, 3]
it = iter(nums) # 获取迭代器
print(next(it)) # 1
print(next(it)) # 2
print(next(it)) # 3
__iter__() # 返回自身
__next__() # 返回容器的下一个元素。如果没有元素了,则抛出 StopIteration 异常。
class MyIterator:
def __init__(self, n):
self.n = n
self.cur = 0
def __iter__(self):
return self
def __next__(self):
if self.cur < self.n:
self.cur += 1
return self.cur
else:
raise StopIteration
if __name__ == '__main__':
it = MyIterator(3)
for i in it:
print(i)
生成器(Generator)
def gen():
yield 1
yield 2
yield 3
if __name__ == '__main__':
g = gen()
print(g)
print(next(g))
print(next(g))
print(next(g))
- 暂停
- 返回当前值
- 下次从暂停位置继续
g = (x*x for x in range(5))
[x*x for x in range(5)] # 列表(一次性全部生成)
(x*x for x in range(5)) # 生成器(按需生成)
可迭代对象 (Iterable)
可迭代对象 Iterable
↓ 调用 __iter__() 可以得到
迭代器 Iterator
↓ 生成器是它的子类
生成器 Generator
yield和return的区别
def normal_func():
return "第一步"
return "第二步" # 永远不会被执行
print(normal_func()) # 输出: 第一步
def generator_func():
yield "第一步"
yield "第二步"
yield "第三步"
gen = generator_func()
print(next(gen)) # 输出: 第一步 (函数在此处暂停)
print(next(gen)) # 输出: 第二步 (函数从刚才暂停的地方恢复)
- yield 负责产生数据流。
- return 负责彻底结束生成器。如果在生成器中执行了 return value,这实际上会引发一个 StopIteration 异常,并将 value 作为异常的说明信息。
🔗 原文链接: 点击阅读原文
文章评论