概述
容器是可迭代对象,迭代器通常是可迭代对象,生成器是特殊的迭代器。
https://nvie.com/posts/iterators-vs-generators/
可迭代对象 Iterable
可以遍历获取数据的对象
要素: 实现了 __iter__()
方法
特性: 可以作用于 for
语句
list、set、tuple、dict 等容器对象都是可迭代对象
迭代器 Iterator
实现了迭代器协议的对象
迭代器接口协议:
Python 中迭代器的接口协议规定实现以下两个方法, 则可以称作迭代器
__next__() 返回下一个元素。当没有元素时抛出 StopIteration 异常
__iter__() 返回 self,即迭代器本身
要素: 实现 __iter__()
和 __next__()
方法
特性:
1. 可以被 next() 函数调用并不断返回下一个值
2. 延迟计算,按需使用 (惰性加载)
3. 不能直接使用下标获取数据
示例:
class UpperStringIterator:
def __init__(self, text):
self.text = text
self.index = 0
def __iter__(self):
return self
def __next__(self):
try:
upper_char = self.text[self.index].upper()
except IndexError:
raise StopIteration()
self.index += 1
return upper_char
s = UpperStringIterator("abc")
for i in s:
print(i)
# Result:
# A
# B
# C
生成器 Generator
特殊的迭代器
特性:
1. 相比一般迭代器,它会自动创建了__iter__()和 __next__() 方法
2. 可以用于协程的编写
1. generator function
函数中使用 yield
关键字返回值
示例:
def get_combination(a, b):
for left in a:
for right in b:
yield (left, right)
combination = get_combination([1, 2], ['A', 'B'])
for item in combination:
print(item)
# Result:
# (1, 'A')
# (1, 'B')
# (2, 'A')
# (2, 'B')
2. generator expression
列表生成式的生成器版本 (x for x in range(5))
示例:
g = (item for item in range(10))
print(isinstance(g, Generator))
# Result:
# True
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。