Python--核心2(生成器,迭代器,闭包,装饰器)之生成器
Posted TiAmo_yu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python--核心2(生成器,迭代器,闭包,装饰器)之生成器相关的知识,希望对你有一定的参考价值。
一、生成器
1.概念
在Python中, 一边循环一边计算的机制, 称为生成器: generator
创建生成器: G = ( x*2 for x in range(5))
可以通过 next(生成器) 函数获得生成器的下一个返回值
没有更多的元素时, 抛出 StopIteration 的异常
生成器也可以使for 循环,因为生成器也是可迭代对象
2.生成器1 生成的第一种方式
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.生成器
3.1使用循环求斐波那契数列的第n个数
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"))
以上是关于Python--核心2(生成器,迭代器,闭包,装饰器)之生成器的主要内容,如果未能解决你的问题,请参考以下文章