python生成式和生成器
阿新 • • 發佈:2018-01-30
fun nbsp 使用 turn 2個 取出 退出 light ack
一,生成式和生成器
1,列表生成式
mylist = [ i*i for i in range(3) if i>1 ] print(mylist) 運行結果:[4]
可以發現,快速生成列表的表達式,for循環range(3) ,如果i大於1,則乘以自己然後輸出。
2,生成器
mygenerator = ( i*i for i in range(3)) print(mygenerator) 運行結果:<generator object <genexpr> at 0x000001FB08F18BA0>
可以發現,這個生成器和列表生成式非常相似。只是上面的是[] 而下面的是()。
這讓我想起了python2中的range與xrange2個函數。range是輸出的是一個列表,而xrange生成的就是一個生成器。生成器需要是用for循環取值。
生成器的好處就是可以不用一次性將值存放到內存中,用的時候再去調用,這樣可以節省內存。
二,yield(用於創建生成器)
yield 和 return 非常相似, return只能返回一個值,而yield可以輸出多個值。yield也可以理解為具有記憶功能的return。
def fun1(): for i in range(1,5): print(i) def fun2(): for i in range(1,5): return i def fun3(): for i in range(1,5): yield i
調用fun1()函數輸出的是1,2,3,4,5
調用fun2()函數輸出是1(執行到return就退出函數了)
調用fun3(0函數輸出的是生成器,需要使用for循環取出來。
fun3函數和fun2函數對比,fun2函數智慧返回1然後退出函數,而yield會在下次進入函數的時候知道自己已經輸出過上一次的值了,所以它會return下一個值。本質上是執行next()函數(python2版本)
說明:yield創建的生成器是活的,再你說用for循環的時候是可以變更的。
python生成式和生成器