Python開發(fā)之迭代器&生成器的實(shí)戰(zhàn)案例分享
迭代器&生成器
在 Python 中,迭代器和生成器都是用來(lái)遍歷數(shù)據(jù)集合的工具,可以按需逐個(gè)生成或返回?cái)?shù)據(jù),從而避免一次性加載整個(gè)數(shù)據(jù)集合所帶來(lái)的性能問(wèn)題和內(nèi)存消耗問(wèn)題。
具體來(lái)說(shuō),迭代器是一個(gè)包含 iter() 和 next() 方法的對(duì)象,它通過(guò) next() 方法依次返回?cái)?shù)據(jù)集合中的每個(gè)元素,直到?jīng)]有元素時(shí)引發(fā) StopIteration 異常。迭代器可以自定義,也可以使用 Python 內(nèi)置的可迭代對(duì)象,如列表、元組、字典、集合等,以及內(nèi)置的迭代器函數(shù),如 zip()、map()、filter() 等。
而生成器是一種特殊的迭代器,它使用 yield 關(guān)鍵字來(lái)定義,可以在需要時(shí)生成數(shù)據(jù),從而實(shí)現(xiàn)按需生成、惰性計(jì)算的效果。生成器可以大大簡(jiǎn)化代碼,提高性能和可讀性,也可以通過(guò)生成器表達(dá)式快速創(chuàng)建簡(jiǎn)單的生成器。
下面分享幾個(gè)貼近實(shí)際運(yùn)維開發(fā)工作中的場(chǎng)景案例。
實(shí)戰(zhàn)案例
1.假設(shè)需要從一個(gè)非常大的數(shù)據(jù)集合中查找滿足特定條件的元素,并且只需要找到第一個(gè)符合條件的元素即可停止查找。如果直接遍歷整個(gè)數(shù)據(jù)集合,可能會(huì)導(dǎo)致性能問(wèn)題。這時(shí)可以使用迭代器和生成器來(lái)解決這個(gè)問(wèn)題。
def?find_first_match(data,?condition):
????for?item?in?data:
????????if?condition(item):
????????????return?item
????raise?ValueError('No?matching?item?found')
large_data?=?[i?for?i?in?range(10000000)]??#?構(gòu)造一個(gè)大數(shù)據(jù)集合
match?=?find_first_match(large_data,?lambda?x:?x?>?1000)??#?查找第一個(gè)大于?1000?的元素
print(match)
2.假設(shè)要實(shí)現(xiàn)一個(gè)函數(shù),它接受一個(gè)字符串列表,然后返回這些字符串中所有字符的出現(xiàn)次數(shù)??梢允褂玫骱蜕善鱽?lái)避免遍歷整個(gè)列表,并減少內(nèi)存使用量。
def?char_count(words):
????counts?=?{}
????for?word?in?words:
????????for?char?in?word:
????????????counts[char]?=?counts.get(char,?0)?+?1
????return?counts
def?char_count_lazy(words):
????def?char_gen(words):
????????for?word?in?words:
????????????for?char?in?word:
????????????????yield?char
????counts?=?{}
????for?char?in?char_gen(words):
????????counts[char]?=?counts.get(char,?0)?+?1
????return?counts
3.需要遍歷一個(gè)多級(jí)嵌套的 JSON 對(duì)象,查找其中某個(gè)特定的值。假設(shè) JSON 對(duì)象很大,因此不能一次性加載到內(nèi)存中。這時(shí)可以使用生成器來(lái)逐級(jí)遍歷 JSON 對(duì)象。
def?find_value(json_obj,?target_key):
????if?isinstance(json_obj,?dict):
????????for?key,?value?in?json_obj.items():
????????????if?key?==?target_key:
????????????????yield?value
????????????else:
????????????????yield?from?find_value(value,?target_key)
????elif?isinstance(json_obj,?list):
????????for?item?in?json_obj:
????????????yield?from?find_value(item,?target_key)
json_data?=?{
????"name":?"tantianran",
????"age":?30,
????"cars":?[
????????{"model":?"BMW",?"year":?2000},
????????{"model":?"Tesla",?"year":?2020}
????],
????"location":?{
????????"address":?"123?Main?St",
????????"city":?"New?York",
????????"state":?"NY"
????}
}
for?value?in?find_value(json_data,?"year"):
????print(value)
4.如果需要讀取一個(gè)非常大的文件,并對(duì)其中的每一行進(jìn)行處理,但是由于文件太大,無(wú)法一次性將整個(gè)文件讀入內(nèi)存中。這時(shí)可以使用生成器來(lái)實(shí)現(xiàn)逐行讀取文件并逐行處理的操作。
def?process_lines(file_name): ????with?open(file_name)?as?f: ????????for?line?in?f: ????????????#?對(duì)每一行進(jìn)行處理,這里只是簡(jiǎn)單地打印出來(lái) ????????????print(line.strip()) large_file?=?'data.txt' process_lines(large_file)
5.假設(shè)有一個(gè)大型日志文件,其中包含了數(shù)千萬(wàn)行日志記錄。需要對(duì)這個(gè)日志文件進(jìn)行分析,找出所有包含特定關(guān)鍵字的日志記錄,并進(jìn)行統(tǒng)計(jì)。如果直接讀取整個(gè)日志文件到內(nèi)存中,可能會(huì)導(dǎo)致內(nèi)存不足的問(wèn)題。這時(shí)可以使用迭代器和生成器來(lái)解決這個(gè)問(wèn)題。
def?log_file_reader(log_file_path):
????with?open(log_file_path)?as?f:
????????for?line?in?f:
????????????yield?line.strip()
def?log_analyzer(log_file_path,?keyword):
????log_reader?=?log_file_reader(log_file_path)
????count?=?0
????for?line?in?log_reader:
????????if?keyword?in?line:
????????????count?+=?1
????return?count
log_file_path?=?'logs.txt'
keyword?=?'error'
error_count?=?log_analyzer(log_file_path,?keyword)
print(f'The?number?of?error?logs?is:?{error_count}')到此這篇關(guān)于Python開發(fā)之迭代器&生成器的實(shí)戰(zhàn)案例分享的文章就介紹到這了,更多相關(guān)Python迭代器 生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Python實(shí)現(xiàn)將一張圖片分成9宮格的示例
今天小編就為大家分享一篇用Python實(shí)現(xiàn)將一張圖片分成9宮格的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
在終端啟動(dòng)Python時(shí)報(bào)錯(cuò)的解決方案
這篇文章主要介紹了在終端啟動(dòng)Python時(shí)報(bào)錯(cuò)的解決方案,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-11-11
Python 編碼Basic Auth使用方法簡(jiǎn)單實(shí)例
這篇文章主要介紹了 Python 編碼Basic Auth使用方法簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
淺談keras中Dropout在預(yù)測(cè)過(guò)程中是否仍要起作用
這篇文章主要介紹了淺談keras中Dropout在預(yù)測(cè)過(guò)程中是否仍要起作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
django美化后臺(tái)django-suit的安裝配置操作
這篇文章主要介紹了django美化后臺(tái)django-suit的安裝配置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
python實(shí)現(xiàn)IOU計(jì)算案例
這篇文章主要介紹了python實(shí)現(xiàn)IOU計(jì)算案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
OpenCV+python3實(shí)現(xiàn)視頻分解成圖片
這篇文章主要為大家詳細(xì)介紹了OpenCV+python3實(shí)現(xiàn)視頻分解成圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Python Django使用forms來(lái)實(shí)現(xiàn)評(píng)論功能
這篇文章主要為大家詳細(xì)介紹了Python Django使用forms來(lái)實(shí)現(xiàn)評(píng)論功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08

