Generator(生成器)
迭代器 iterator
迭代器是一个让程序员可以遍历一个容器的 对象,一个迭代器在遍历读取一个容器的数据元素的时候,并不会执行一个迭代。
可迭代对象
迭代器
迭代
可迭代对象iterable
python中任意的,只要它定义了可以返回迭代器__iter__方法,或者定义了可以支持下标索引的__getitem__方法,他就是可迭代对象,可迭代对象就是能提供迭代器的任意对象
iterator迭代器
任意对象,只要定义了next() python2 或者__next__方法,他就是一个迭代器
理解迭代(iteration)
从某个地方取出一个元素的过程,当我们使用一个循环来遍历某个东西的时候,这个过程本身就叫做迭代
生成器
在运行时生成值,通过遍历来使用他们,生成器一般是使用函数来实现的
def generator_function():
for i in range(10):
yield i
for item in generator_function():
print(item)
当不想同一时间将所有计算出来的大量结果分配到内存中,特别是结果集中包含循环使用生成器
计算斐波那切数列的生成器
def fibon(n):
a=b=1
for i in range(n):
yield a
a,b = b,a+b
for x in fibon(10):
print(x)
def fibon(n):
a = b = 1
result = []
for i in range(n):
result.append(a)
a, b = b, a+b
return result
print(fibon(1000))
上面这种方式当n特别大,就会消耗大量资源,但是生成器就不会
python 内置函数 next()
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所有的值后,出错了,for循环不报错因为它会自动捕捉错误并停止调用next()
内置类型str并不是一个迭代器
strs = "hhhhxxxxxxx"
str1 = iter(strs)
next(str1)
next(str1)
next(str1)
这样字符串类型就成为了生成器