生成器(generator)
得到生成器的方式:
1.通过列表推导式得到生成器
newlist = [x*3 forx in range(20)]
print(newlist)
得到生成器
newlist = (x*3 forx in range(20))
print(type(newlist))----------------generator
print(newlist)----------------------generator object <genexpr> at 0
输出为:
#方式1:通过调用__next__()方式得到元素
print(newlist.__next__())-----0
print(newlist.__next__())-----3
print(newlist.__next__())-----6
print(newlist.__next__())-----9
print(newlist.__next__())-----12
print(newlist.__next__())-----15
#方式2:next(生成器对象) builtins 系统内置函数
#每调用一次next则会产生一个元素
print(next(newlist))
print(next(newlist))
print(next(newlist))
print(next(newlist))
print(next(newlist))
print(next(newlist)) #StopIteration 生成器本来就可以产生10个 得到10个,继续调用时就会出现异常。
g = (x*3 for x in range(10))
while True:
try:
e = next(g)
print(e)
except:
print("没有更多的元素啦 !")
break
生成器的方法:
next:获取下一个元素
send(value):向每次生成器调用中转值。 注意第一次调send(None)。
定义生成器的方式2:借助函数完成
只要函数中出现了yield关键字,说明函数就不是函数啦,就是生成器。
斐波那契数列
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接受调用的结果
3.得到的结果就是生成器
4.借助next(),next
def func():
n = 0
while True:
n += 1
yield n-------相当与return n , 但是多了一个暂停。
g = func()
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
斐波那契数列
def fib(length):
a,b = 0,1
n=0
whine n<length:
print(b)
yield b
a,b = b,a+b
n += 1
g = fib(8)
print(g)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
输出:
1
1
2
3
5
8
13
21
def gen():
i = 0
while i<5:
temp = yield i
print('temp:',temp)
i += 1
return '没有更多的数据'
gen()
print(g.send(None))
n1 = g.send('呵呵')
print('n1:',n1)
n2 = g.send('哈哈')
print('n2:',n2)
定义生成器的方式:
1.通过列表推导式
g =(x+1 for x in range(6))
2.函数+yield
def func ():
。。。
yield
g = func()
产生元素:
1.next(generator)--------------》每次调用都会产生一个新的元素,如果产生完毕,再次调用的话就会产生异常
2.生成器自己的方法
g.next()
g.next(value)
应用 : 协程