1、生成器函数
1.概念spa
在Python中, 一边循环一边计算的机制, 称为生成器: generator code
建立生成器: G = ( x*2 for x in range(5)) 协程
能够经过 next(生成器) 函数得到生成器的下一个返回值 对象
没有更多的元素时, 抛出 StopIteration 的异常 blog
生成器也能够使for 循环,由于生成器也是可迭代对象 generator
2.生成器1 生成的第一种方式 it
list2 = [x for x in rang(10)] print(type(list2)) #获得一个生成器对象 g = (x*2 for x in rang(10)) print(type(g)) #打印生成器生成第一个数字 peint(next(g)) peint(next(g)) peint(next(g)) 一共10个数字,打印超出报StopIteration异常
3.生成器io
3.1使用循环求斐波那契数列的第n个数for循环
def feibo(items): a, b, n = 1, 1, 3 while n <=items: if items == 1 or items ==2: return 1 else: a, b =b, a +b print(b,end=" ") n += 1 return b feibo(4)
3.2生成器的第二种生成方式 yield
函数中只要有yield关键字,这个函数就变成了生成器
def fibo(n): a = 1 b = 1 i = 3 if n == 1 or n == 2: return 1 while i <= n: a, b = b, a + b i += 1 # 协程 让函数变成了生成器 至关于循环的暂停 yield b return b # 获得生成器对象 v = fibo(10) # 用生成器的方式打印出来 print(next(v)) # 使用for循环遍历生成器 for x in v: print(x,end="\t")
3.3 生成器 send()的用法 必须有一个参数
def test(): i = 0 while i < 5: #赋值运算下次会被执行 yield会使程序停住 temp = yield i print(temp) i += 1 g = test() print("-----send----") print(g.__next__()) print(next(g)) print(g.send("aaa")) 运行结果: -----send--- 0 None 1 aaa 2
3.4 首次调用send()异常问题
解决方案:
1.首次调用使用__next__(),不使用send()
2.或者首次使用send(None)
def test(): i = 0 while i < 5: temp = yield i print(temp) i += 1 g = test() print("-----send----") # 首次调用不传参或者传递非None参数都会致使异常 print(g.send()) print(g.send("aaa"))