轉(zhuǎn)帖|使用教程|編輯:黃竹雯|2019-04-17 11:29:26.000|閱讀 225 次
概述:Python 生成器 yield 是編寫(xiě)基于處理管道,流或數(shù)據(jù)流程序的一種極其強(qiáng)大的方式,在《Python參考手冊(cè)》中有一則實(shí)例非常簡(jiǎn)單實(shí)用,略加修改,分享一下給大家。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
Python 生成器 yield 是編寫(xiě)基于處理管道,流或數(shù)據(jù)流程序的一種極其強(qiáng)大的方式,在《Python參考手冊(cè)》中有一則實(shí)例非常簡(jiǎn)單實(shí)用,略加修改,分享一下給大家。如果你對(duì)生成器yield還不是很了解,可以查看《覺(jué)得Python中的生成器(yield)晦澀難懂?看完本文你就知道了》。
Python生成器yield應(yīng)用實(shí)例—監(jiān)控日志源碼下載
假設(shè)服務(wù)器有一個(gè)日志文件,每隔一秒都會(huì)更新日志的內(nèi)容,日志每行中都有一組類似:2017-12-21 14:07:26.471691 99123 數(shù)據(jù)被寫(xiě)入日志。 我們的目的是分析日志中的數(shù)字如果大于5000就要打印出來(lái)。 這樣來(lái)看,我們需要一個(gè)程序負(fù)責(zé)模擬日志寫(xiě)入,另一個(gè)程序負(fù)責(zé)分析日志打印數(shù)據(jù)。
server_log.py:
import random from datetime import * import os import time def server_log(): # 生成模擬的日志數(shù)據(jù) server_int = random.randint(1,99999)#生成需要的隨機(jī)數(shù) server_date = datetime.now()#獲取當(dāng)前系統(tǒng)時(shí)間 return str(server_date) + ' ' + str(server_int)#拼裝日志字符串 while True: #模擬系統(tǒng)寫(xiě)入日志 #打開(kāi)日志文件并寫(xiě)入日志 with open(os.path.join(os.path.dirname(__file__),'server_log.log'),'at') as f : s = server_log() print(s) f.write(s + '\n') time.sleep(1)
上邊的代碼已經(jīng)添加了相關(guān)的注釋,這樣我們就有了一個(gè)日志文件,每秒會(huì)有一第記錄插入到日志中。
生成器可以返回一個(gè)迭代的流式的對(duì)象,我們可以通過(guò)這種方式便捷的獲得相關(guān)數(shù)據(jù),而且代碼也更清晰易懂
tail.py 代碼如下:
import time def tail(f): f.seek(0,2)#移動(dòng)到文件尾部。 while True: line = f.readline() if not line : time.sleep(1) continue yield line def grep(lines): for l in lines: k = int(l.split()[2]) if k >50000: yield l serverlog = tail(open('server_log.log')) lines = grep(serverlog) for line in lines: print(line)
我們運(yùn)行兩個(gè)文件看下效果:
代碼雖然簡(jiǎn)單,但值得細(xì)細(xì)品味,感受python的簡(jiǎn)約與強(qiáng)大吧。
【專業(yè)Python IDE推薦】——PyCharm (正版低至¥1068):
PyCharm 是一款Python IDE,其帶有一整套可以幫助用戶在使用Python語(yǔ)言開(kāi)發(fā)時(shí)提高其效率的工具。此外,該IDE提供了一些高級(jí)功能,以用于Django框架下的專業(yè)Web開(kāi)發(fā)。
PyCharm基礎(chǔ)教程推薦:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn