日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python的生成器

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

python的生成器

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

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

例子

下面我就舉幾個例子:

一:迭代器和生成器
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('迭代結(jié)束')breakgenerator = (x for x in range(10)) print(type(generator)) print(generator) while True:try:print(next(generator), end='\t')except StopIteration:print('迭代結(jié)束')break

輸出結(jié)果

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

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

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

二:yield字段

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

#普通的函數(shù) 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))

運行結(jié)果:

<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

從結(jié)果可以知道,一個函數(shù)也能寫成生成器,只要函數(shù)里有yield字段,而yield類似于函數(shù)的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))

運行結(jié)果:

<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的實例化對象,但是其內(nèi)部的生成器并沒有實例化,所以G.generate()并不能進行迭代。

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。