生成器函数
## 生成器
是可以迭代的,但是你 只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据:
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
... print(i)
0
1
4
你不可以再次使用 for i in mygenerator
, 因为生成器只能被迭代一次:
先计算出0,然后继续计算1,然后计算4,一个跟一个的…
生成器函数
包含 yield
语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。
当你调用这个函数的时候,函数内部的代码并不立马执行
yield
语句与 return
语句的作用相似,都是用来从函数中返回值。 return
语句一旦执行会立刻结束函数的运行,而每次执行到 yeild
语句并返回一个值之后会暂停或挂起后面代码的执行,下次通过生成器对象的 __next__()
,内置函数 net()
,for
循环遍历生成器对象元素或其他方式显式“索要”数据时恢复执行。
生成器具有惰性求值的特点。
>>> def f(): #求斐波那契数列
... a,b = 1, 1
... while True:
... yield a
... a, b = b, a+b
...
>>> a = f()
>>> for i in range(10):
... print(a.__next__(),end=' ') #调用一次__next__()得出一个值
...
1 1 2 3 5 8 13 21 34 55
a = f()
>>> next(a)
1
>>> next(a)
1
>>> next(a)
2
>>> a.__next__()
3
>>> def f():
... yield from 'abcdefg'
...
>>> x = f()
>>> next(x)
'a'
>>> for item in x:
... print(item,end=' ')
...
b c d e f g
>>> def gen():
... yield 1
... yield 2
... yield 3
...
>>> x,y,z = gen() #序列解包
>>> print(x,y,z)
1 2 3
>>> def gen(start, end): #使用send()方法传入新值。
... i = start
... while i<end:
... v = (yield i)
... if v:
... i = v
... else:
... i+=1
...
>>> g = gen(1,101)
>>> next(g)
1
>>> next(g)
2
>>> g.send(10)
10
>>> next(g)
11