一、生成器函数中send的用法
value = yield 1
如上式
g.send( 123 )
1、程序执行到yield 1 时停止,程序停留在yield 1 这个位置,等待下一次执行
2、当使用send时,相当于也执行g._ _next_ _,这时程序会从yield 1的位置继续执行,send传递过来的123会代替yield 1 这个位置从而赋值给value,程序继续向下执行,直到再次遇到yield
3、send不能在程序开始时用,虽然相当于_ _next_ _,但是程序找不到值去接受它。就算是程序一开始就是value = yield 1这种情况,不会说先执行到yield再赋值,这样不符合逻辑,因为程序刚开始运行send就传递过来一个值,没有东西去接受它这时送进去的就是None,生成器刚启动就接受一个None值,这样不符合逻辑,程序没有办法继续运行下去,所以会报错
二、生成器表达式和列表推导式
1、列表推导式:简化代码,但是内存占用很大
print([i*i for i in [1,3,5]]) #结果必须是一个列表 类似的还有字典推导式,集合推导式主要用来去掉重复元素 2、生成器表达式:括号表示 只是一个表达式,还是表示一个生成器,括号里的代码不会直接执行,当外部取值(_ _next_ _/list/for)时括号里的代码才会执行
laomuji = ('egg%d'%i for i in range(10)) #简化代码,最重要的就是节省内存
注意: 1、不要写太复杂的表达式 2、在代码里,多层嵌套的for循环时禁忌