生成器(Generators)
迭代器可以遍历一个容器的对象。但是一个迭代器在遍历一个容器的数据元素时,并不会执行迭代。
可迭代对象(Iterable)
Python中任意的对象,只要它定义了可以返回一个迭代器__iter__
方法,或者定义了可以支持下标索引的__getitem__
方法,那么它就是一个可迭代对象。
迭代器(Iterator)
任何对象,只要定义了__next__
方法,那么它就是一个迭代器。
迭代(Iteration)
当我们使用一个循环来遍历某个东西的时候,这个过程就叫做迭代。
生成器(Generators)
生成器是一种迭代器,但是你只能对其迭代一次,因为它们并没有将所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个for循环,要么将传递给任意可以进行迭代的函数和结构。大多数时候生成器是以函数来实现的,返回并不是一个值,而是yield一个值。
def generator_function():
for i in range(10):
yield i
for item in generator_function():
print(item)
"""
0
1
2
3
4
5
6
7
8
9
"""
生成器最佳的应用场景是:你不想同一时间将所有计算出来的大量结果分配到内中中,特别是结果包含在循环中。
def fibon(n):
a = b = 1
for i in range(n):
yield a
a , b = b, a+b
for x in fibon(1000000):
print(x)
这样就可以得到了所有的结果,而且不用担心它使用大量资源。
def generator_function():
for i in range(3):
yield i
gen = generator_function()
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
可以看到,在yield用掉所有的值后,next()会触发一个StopIteration的异常。for循环可以自动的捕捉这个异常而停止next()。
my_string = "Yasoob"
my_iter = iter(my_string)
print(next(my_iter))
str是一个可迭代的对象,但是可以转换为可迭代的对象。使用iter
来源:CSDN
作者:绝尘花遗落
链接:https://blog.csdn.net/huayunhualuo/article/details/103826323