一、列表生成式(几种形式记住)
1、for只控制循环的次数,而for前面的变量决定着数据的内容,这就叫做列表生成式。
2、后面加判断句的,也常见
3、
4、
二、生成器(保存是算法,generator)
1、生成器的特点:只是保存了生成列表数的一个算法,什么时候需要用,就next() 调用。
(1)创建生成器方法1:
简单,只要把一个列表生成式的 [ ] 改成 ( )
①直接next(a)一点一点的调用
②第二种写法:可 for in 循环
(2)创建生成器的方法2:
斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:用生成器
小总结:
1、只要添加yield的函数,就变成生成器了。
2、生成器它有一个特点,你如果按着原先的方式进行调用的话,它不会执行的,而返回一个生成器对象。
3、yield的运行原理:
就会从函数的开头开始执行,到yield暂停,将yield后面的值返回。
如果再调用一下next(a),从暂停的地方继续执行,再循环到yield b处暂停,直到循环完毕
4、在ipython3 交互环境中,调用,先导包,from xx import * — a= createNum() — 调用next(a) , out值返回的就是要的值。
改进:要想一次性得到值,并且超过range的范围不报错。
三、生成器——send:传值用
t.__next__() 和 t.send("haha")两步原理:
第一次执行t.__next__()时运行到yield i 时就暂停了,把yield后面的i=0返回给了res值了
再执行t.send("haha"),使程序往下执行,接着执行temp=yield i等号左边的temp,并传值
给了temp,依次循环,——执行到yield就停,返回值给res,send继续执行,传值给temp
四、生成器--注意事项
1、不能一上来就使用t.send(“haha”)或者 t.send()什么也不传,会报错
应该结合使用:t.__next__()
t.send("传的参数")
2.如果非要一开始就传,传个None:
t.send(None)
3、再传值时,temp的值不会被修改
一个函数里面可以有多个yield,也就是只要有一个yield的话,这个函数就是一个生成器