详解Python中迭代器和生成器的原理与使用
什么是迭代器
在Python中,迭代器是实现迭代序列的API。如果一个对象可以返回一个迭代器,那么就可以在迭代器上使用for循环,也可以使用next()函数来逐个获取迭代器中的值。
在Python中,我们可以自定义迭代器,只需要实现__iter__()和__next__()这两个方法就可以了。
class MyList:
def __init__(self):
self.data = [1, 2, 3, 4]
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
data = self.data[self.index]
self.index += 1
return data
if __name__ == '__main__':
mylist = MyList()
print('Using for loop:')
for data in mylist:
print(data)
print('Using next() function:')
it = iter(mylist) # get iterator
while True:
try:
data = next(it)
print(data)
except StopIteration:
break
输出结果:
Using for loop:
1
2
3
4
Using next() function:
1
2
3
4
什么是生成器
生成器是一种特殊的迭代器,可以像迭代器那样使用for循环和next()函数获取每一个值,但是生成器的实现方式不同于一般的迭代器。生成器是通过函数来实现的,其中包含yield关键字,函数每次返回yield后面的表达式的值,直到函数执行结束。
def my_generator():
data = [1, 2, 3, 4]
for d in data:
yield d
if __name__ == '__main__':
for data in my_generator():
print(data)
it = my_generator() # get iterator
while True:
try:
data = next(it)
print(data)
except StopIteration:
break
输出结果:
1
2
3
4
1
2
3
4
生成器表达式
生成器表达式是一个方便的生成器创建方式,可以通过类似于列表推导式的形式来创建一个生成器。
g = (x for x in range(1, 5))
for data in g:
print(data)
it = (x for x in range(1, 5)) # get iterator
while True:
try:
data = next(it)
print(data)
except StopIteration:
break
输出结果:
1
2
3
4
1
2
3
4