python的生成器
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 福特 Maverick Lobo 皮卡路
- 下一篇: websocket python爬虫_p