黄哥漫谈Python 生成器
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
黃哥漫談Python 生成器
何為生成器(Generators) 下面的黃哥用大白話說明。 當(dāng)Python 函數(shù)不用return 返回值,用yield關(guān)鍵字的時候,函數(shù)的返回值為生成器對象。
圖中代碼,函數(shù)沒有用return 返回值,用yield 輸出值,函數(shù)的調(diào)用返回值為生成器對象, 生成器對象,用p.next()方法返回一個值,函數(shù)執(zhí)行暫停,下次再調(diào)用next()方法時,從 暫停處開始執(zhí)行,print 輸出值。再執(zhí)行第二個yield 返回值。
像上面函數(shù)的返回值為生成器對象的函數(shù)叫做生成器函數(shù)。
生成器是一個可迭代對象,可以用for循環(huán)迭代。
特別需要注意的是,初學(xué)者容易出現(xiàn)的一個錯誤是,生成器用next()方法,到最后一個yield 返回值時,再用一次,會報錯誤StopIteration。
下面圖片中p是生成器,用了二次next()方法,相當(dāng)于返回值都返回完了,再循環(huán)迭代沒有輸出。見過初學(xué)者一直問為啥這樣,黃哥說“你可以想像成指針”前面已經(jīng)指到尾部了。所以
for 循環(huán) 沒有輸出。
增強的生成器,有send()和close()方法。
增強的生成器中,除yield可以輸出值,也可以從外部send值到生成器內(nèi)部。這個時候,yield 是表達式,可以輸出值,也可以接收值賦值給其他變量。
有近一步學(xué)習(xí)的,請看
PEP 342 -- Coroutines via Enhanced Generators
https://www.python.org/dev/peps/pep-0342/
下面講講生成器實例代碼。
1、利用生成器生成可以無限取值的斐波拉切函數(shù)。
#!/usr/bin/env python# -*- coding: utf-8 -*-# Author: 黃哥python培訓(xùn) qq:1465376564def fib():a, b = 0, 1while True:yield aa, b = b, a + bp = fib()print [p.next() for i in xrange(101)]2、求PI值。
#!/usr/bin/env python# -*- coding: utf-8 -*-# Author: 黃哥python培訓(xùn) qq:1465376564"""1 - 1/3 + 1/5 - 1/7 + ..."""def pi_series():total = 0i = 1.0j = 1while True:total = total + j / iyield 4 * totali += 2j = j * -1def main(g, n):for i in range(n):yield g.next()if __name__ == '__main__':print list(main(pi_series(), 8))#[4.0, 2.666666666666667, 3.466666666666667, 2.8952380952380956, 3.3396825396825403, 2.9760461760461765, 3.2837384837384844, 3.017071817071818]3、生成器處理大日志文本文本。
# coding:utf-8import timestart_time = time.time()def find_ip(path):for line in open(path):s = line.find('"Sogou web spider')if s >= 0:yield line[:s].strip()p = find_ip("bigfile.txt")p = list(set(list(p)))for item in p:print itemprint time.time() - start_time, "seconds"4、生成器函數(shù)也可以玩遞歸。
#!/usr/bin/env python# -*- coding: utf-8 -*-# Author: 黃哥python培訓(xùn) qq:1465376564def spread_list(lst):tmp = []for item in lst:if isinstance(item, list):tmp = spread_list(item)for item2 in tmp:yield item2else:yield iteml = [1, 2, 3, 4, 5, [6], [7, 8, [9, [10]]]]l2 = [[3, 7, [9, 6]], [2, [3, 4], 10], 99, 28]l3 = []l4 = [3, 4, 5, 8]lst = spread_list(l)print list(lst)lst = spread_list(l2)print list(lst)lst = spread_list(l3)print list(lst)lst = spread_list(l4)print list(lst)# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# [3, 7, 9, 6, 2, 3, 4, 10, 99, 28]# []# [3, 4, 5, 8]如何訓(xùn)練自己的編程思路
部分免費Python免費視頻
感恩!感謝黃哥Python培訓(xùn)學(xué)員的支持和肯定
轉(zhuǎn)載于:https://my.oschina.net/pythonpeixun/blog/728917
總結(jié)
以上是生活随笔為你收集整理的黄哥漫谈Python 生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10启动盘制作工具
- 下一篇: Chapter 1 First Sigh