日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python的生成器

發布時間:2024/9/19 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python的生成器

可以把生成器理解成是特殊的迭代器。

生成器一次只能產生一個值,這樣消耗的內存數量將大大減小,而且允許調用函數可以很快的處理前幾個返回值,因此生成器看起來像是一個函數,但是表現得卻像是迭代器。

例子

下面我就舉幾個例子:

一:迭代器和生成器
list = [x for x in range(10)] print(type(list)) print(list) it = iter(list) while True:try:print(next(it), end='\t')except StopIteration:print('迭代結束')breakgenerator = (x for x in range(10)) print(type(generator)) print(generator) while True:try:print(next(generator), end='\t')except StopIteration:print('迭代結束')break

輸出結果

<class 'list'> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 0 1 2 3 4 5 6 7 8 9 迭代結束 <class 'generator'> <generator object <genexpr> at 0x000002840200B648> 0 1 2 3 4 5 6 7 8 9 迭代結束

? 從代碼和結果不難看出,生成器也是可以進行迭代的。并且生成器是一個類。

? 生成器可以通過生成表達式生成。**generator = (x for x in range(10))返回的是一個生成器。通過生成器可以使用next()**來獲取元素

二:yield字段

yield的作用是生成并返回一個值。

#普通的函數 def A():pass print(type(A())) print(A())print('====================================')#生成器 def MyGenerator():index = -1;ls = [0,1,2,3,4,5,6]while True:index += 1yield ls[index]MyG = MyGenerator() print(type(MyGenerator()), type(MyG)) print(MyGenerator(), MyG) for i in range(7):print(next(MyGenerator()), next(MyG))

運行結果:

<class 'NoneType'> None ==================================== <class 'generator'> <class 'generator'> <generator object MyGenerator at 0x0000018D3F84B648> <generator object MyGenerator at 0x0000018D3F84B9C8> 0 0 0 1 0 2 0 3 0 4 0 5 0 6

從結果可以知道,一個函數也能寫成生成器,只要函數里有yield字段,而yield類似于函數的return,作用也是放回一個值。這里值得注意的是**type(MyGenerator()), type(MyG)并不是同一個對象,這里的MyGenerator()**類對象雖然是生成器,但是并不能進行迭代。也就是說要使用生成器必須實例化先。

三:類里面的生成器

生成器也可以寫到類的里面

class MyGeneratorClass:def __init__(self,*args):self.list=[x for x in args ]def generate(self):for index in range(len(self.list)):yield self.list[index]G = MyGeneratorClass(1,2,3) TG= G.generate() print(type(G)) print(type(G.generate()), type(TG)) print(G.generate(), TG) for i in range(3):print(next(G.generate()), next(TG))

運行結果:

<class '__main__.MyGeneratorClass'> <class 'generator'> <class 'generator'> <generator object MyGeneratorClass.generate at 0x00000237DBC5B648> <generator object MyGeneratorClass.generate at 0x00000237DBC5B9C8> 1 1 1 2 1 3

生成器也是可以寫到類里面的,同樣的要迭代就必須講生成器實例化,這里的G雖然是MyGeneratorClass的實例化對象,但是其內部的生成器并沒有實例化,所以G.generate()并不能進行迭代。

以上都是個人見解,有錯請指出。

總結

以上是生活随笔為你收集整理的python的生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。