9月5日学习内容整理:send 生成器表达式

一、生成器函数中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循环时禁忌
posted @ 2017-09-05 15:20  九二零  阅读(80)  评论(0)    收藏  举报