1. 程式人生 > >Python中生成器和叠代器的功能介紹

Python中生成器和叠代器的功能介紹

family line 介紹 mil auto 叠代器 常用 方法 lean

生成器和叠代器的功能介紹

1. 生成器(generator)

1. 賦值生成器

1. 創建

方法:x = (variable for variable in iterable)
例如:x = (i for i in range(10))
     print(x)
 >>> <generator object <genexpr> at 0x00000000006B85C8>
返回值:generator
#使用元祖推導式的時候回變成一個生成器。

2. 調用

方法:x.__next__()
返回值:object
#對應生成器一般使用該種方法調用,當然也可以通過for循環進行遍歷。

2. 函數生成器

函數生成器也是常用的或者常說的生成器,顧名思義就是通過函數來創建的,不過在函數中一定需要使用yield關鍵字聲明。

1. yield作為返回值

斐波那契數列:

  1. 常規函數實現

    例如:def fei(max_n):
             n,a,b = 0,0,1
             while n < max_n:
                 print(b)
                 a,b = b,a+b
                 n += 1
             return ‘game over‘
    #通過一個函數實現斐波那契數列。直接通過fei(num)調用即可打印出結果。                        
    
  2. 生成器實現

    例如:def fei(max_n):
             n,a,b = 0,0,1
             while n < max_n:
                 yield b
                 a,b = b,a+b
                 n += 1
             return ‘game over‘
    #通過一個生成器斐波那契數列。次數函數執行的結果則為一個生成器,因此調用時需要對函數的執行結果賦值給變量,然後通過__next__()方法進行調用。
    

2. yield作為接收值

單線程異步並行

例如:import time
     def consumer(name):
         print(‘%s來吃包子了!‘%name)
         while True:
             bao = yield
             print(‘包子%s被%s吃了!‘%(bao,name))
     def producer():
         zhang = consumer(‘zhangsan‘)
         li = consumer(‘lisi‘)
         zhang.__next__()
         li.__next__()
         print(‘包子已經在鍋裏了!‘)
         for i in range(1,6,2):
             j = i+1
             time.sleep(1)
             print(‘包子%s好了!‘%i)
             print(‘包子%s好了!‘%j)
             zhang.send(i)
             li.send(j)
     producer()
#把yield作為接收值,使用send方法把數據傳遞給yield來執行生成器。     

2. 叠代器(iterator)

可以通過for循環的對象為可叠代對象,對於數據類型str、list、tuple、dict、set、generator都是可叠代對象,即iterable,其中generator可以使用next()方法進行調用的可叠代對象。對應叠代器的定義為:可以使用next()方法進行調用的可叠代對象即為叠代器。所以生成器就是叠代器的一種。對應上述其他數據類型則只是一個可叠代對象,而不是叠代器,但可以通過iter()方法可以將上述其他數據類型轉換為一個叠代器。

Python中生成器和叠代器的功能介紹