1. 程式人生 > >python生成式和生成器

python生成式和生成器

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生成式和生成器