目录
- python生成器generator和yield关键字
- 第一:将列表推导式种的 [] 改成 ()
- 第二:使用 yield 关键字
- 总结
Python生成器generator和yield关键字
生成器 generator 是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
实现生成器有两种方式:
第一:将列表推导式种的 [] 改成 ()
a=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ["a","b","c","d","e","f","g","h","i","j"], ["Awww.devze.com","B","C","D","E","F","G","H","I","J"]] res=(tmp for ele in a for tmp in ele ) type(res)
可以看出 res 已经是一个生成器了
那么使用生成器有什么用途呢?
1)迭代器能做的,它也能做,例如 next() 方法
2) 也可以使用 for 循环
3)最重要的是,它是随用随取的,不会像列表生成式 [] 那样一下子全生成,只是在迭代时候才会生成(虽然对于用户而言,遍历时候可能感受不到)。http://www.devze.com
第二:使用 yield 关键字
yield 关键字是很特殊的,一个函数里有了 yield 后,执行到 yield 就会停住,下载再次调用时继编程客栈续从上一次中断的位置继续执行代码并返回值。所以生成器函数即使是有无限循环也没关系,它需要算到多少就会算多少,不需要就不往下算。
请注意,有 yield 关键字的函数不是生成器,是该函数的运行结果是一个生成器!
先说说最简单的情况
我先创建一个函数 f ,依次生成100以内的数, 使用 type 函数可以看到这是一个 function
def f(): i=0 yield i while(i<100): i+=1 yield i
那么执行这个函数呢
res=f()type(res)
这个函数执行的结果是一个生成器!
对这个返回的生成器,可以使用 next() 方法
使用生成器解决实际问题,例如常见的斐波拉契数列。
斐波拉契数列:指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
1) 一个简单的无线循环的 fib 生成器
def fib(): a=[0,1] yield a[0] yield a[1] while True: tmp=a[0]+a[1] a=[a[1],a[0]+a[1]] android yield tmp
运行结果是
2)一个有限循环的(n 次数)的 fib 生成器
def fib(n): android i=0 a,b=0,1 yield a while(i<n): a,b=b,a+b i+=1 yield a
运行结果如下,当迭代次数小于等于 n 时候,可以输出相应的数列数,大于 n 时候则报错。
3)斐波拉契数列的一个变形,即返回包含前 n 个 数的列表
理论上1)2) 都可以实现,但是有一个额外要求,即不需要反复去从 1 计算起。
使用 1) 中无限循环函数
%%time # 一个简单的无线循环的,生成fib 数列的生成器 def fib(): a=[0,1] yield a[0] yield a[1] while True: tmp=a[0]+a[1] a=[a[1],a[0]+a[1]] yield tmp # 只要前 n 个 fib 数字 i=0 n=10 res=[] gen=fib() # 简单的 while 循环 因为使用next 不需要重复计算 while(i<n): res.append(next(gen)) i+=1 res
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论