欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python開發(fā)之迭代器&生成器的實戰(zhàn)案例分享

 更新時間:2023年04月19日 09:30:31   作者:不背鍋運維  
在 Python 中,迭代器和生成器都是用來遍歷數(shù)據(jù)集合的工具,可以按需逐個生成或返回數(shù)據(jù),從而避免一次性加載整個數(shù)據(jù)集合所帶來的性能問題和內(nèi)存消耗問題。本文主要和大家分享幾個貼近實際運維開發(fā)工作中的場景案例,希望對大家有所幫助

迭代器&生成器

在 Python 中,迭代器和生成器都是用來遍歷數(shù)據(jù)集合的工具,可以按需逐個生成或返回數(shù)據(jù),從而避免一次性加載整個數(shù)據(jù)集合所帶來的性能問題和內(nèi)存消耗問題。

具體來說,迭代器是一個包含 iter() 和 next() 方法的對象,它通過 next() 方法依次返回數(shù)據(jù)集合中的每個元素,直到?jīng)]有元素時引發(fā) StopIteration 異常。迭代器可以自定義,也可以使用 Python 內(nèi)置的可迭代對象,如列表、元組、字典、集合等,以及內(nèi)置的迭代器函數(shù),如 zip()、map()、filter() 等。

而生成器是一種特殊的迭代器,它使用 yield 關鍵字來定義,可以在需要時生成數(shù)據(jù),從而實現(xiàn)按需生成、惰性計算的效果。生成器可以大大簡化代碼,提高性能和可讀性,也可以通過生成器表達式快速創(chuàng)建簡單的生成器。

下面分享幾個貼近實際運維開發(fā)工作中的場景案例。

實戰(zhàn)案例

1.假設需要從一個非常大的數(shù)據(jù)集合中查找滿足特定條件的元素,并且只需要找到第一個符合條件的元素即可停止查找。如果直接遍歷整個數(shù)據(jù)集合,可能會導致性能問題。這時可以使用迭代器和生成器來解決這個問題。

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)]??#?構造一個大數(shù)據(jù)集合
match?=?find_first_match(large_data,?lambda?x:?x?>?1000)??#?查找第一個大于?1000?的元素
print(match)

2.假設要實現(xiàn)一個函數(shù),它接受一個字符串列表,然后返回這些字符串中所有字符的出現(xiàn)次數(shù)??梢允褂玫骱蜕善鱽肀苊獗闅v整個列表,并減少內(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.需要遍歷一個多級嵌套的 JSON 對象,查找其中某個特定的值。假設 JSON 對象很大,因此不能一次性加載到內(nèi)存中。這時可以使用生成器來逐級遍歷 JSON 對象。

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.如果需要讀取一個非常大的文件,并對其中的每一行進行處理,但是由于文件太大,無法一次性將整個文件讀入內(nèi)存中。這時可以使用生成器來實現(xiàn)逐行讀取文件并逐行處理的操作。

def?process_lines(file_name):
????with?open(file_name)?as?f:
????????for?line?in?f:
????????????#?對每一行進行處理,這里只是簡單地打印出來
????????????print(line.strip())

large_file?=?'data.txt'
process_lines(large_file)

5.假設有一個大型日志文件,其中包含了數(shù)千萬行日志記錄。需要對這個日志文件進行分析,找出所有包含特定關鍵字的日志記錄,并進行統(tǒng)計。如果直接讀取整個日志文件到內(nèi)存中,可能會導致內(nèi)存不足的問題。這時可以使用迭代器和生成器來解決這個問題。

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}')

到此這篇關于Python開發(fā)之迭代器&生成器的實戰(zhàn)案例分享的文章就介紹到這了,更多相關Python迭代器 生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Pygame中Sprite的使用方法示例詳解

    Pygame中Sprite的使用方法示例詳解

    這篇文章主要介紹了Pygame中Sprite的使用方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • Python海龜turtle基礎知識大全以及畫圖集合實例

    Python海龜turtle基礎知識大全以及畫圖集合實例

    turtle是一個簡單的繪圖工具,它提供了一個海龜,你可以把它理解為一個機器人,只聽得懂有限的指令,下面這篇文章主要給大家介紹了關于Python海龜turtle基礎知識大全以及畫圖集合的相關資料,需要的朋友可以參考下
    2023-04-04
  • 使用python搭建服務器并實現(xiàn)Android端與之通信的方法

    使用python搭建服務器并實現(xiàn)Android端與之通信的方法

    今天小編就為大家分享一篇使用python搭建服務器并實現(xiàn)Android端與之通信的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python定義函數(shù)功能與用法實例詳解

    Python定義函數(shù)功能與用法實例詳解

    這篇文章主要介紹了Python定義函數(shù)功能與用法,結合實例形式詳細分析了Python函數(shù)的定義、參數(shù)、返回值、作用域等相關概念、原理及使用方法,需要的朋友可以參考下
    2019-04-04
  • Python實現(xiàn)輕松識別數(shù)百個快遞單號

    Python實現(xiàn)輕松識別數(shù)百個快遞單號

    當我們要寄出很多快遞時,為了及時反饋物流信息,需要盡快將快遞單號提取出來。這時用手動去識別真的太麻煩,所以本文將用Python實現(xiàn)輕松識別數(shù)百個快遞單號,需要的可以參考一下
    2022-06-06
  • 用python給csv里的數(shù)據(jù)排序的具體代碼

    用python給csv里的數(shù)據(jù)排序的具體代碼

    在本文里小編給大家分享的是關于用python給csv里的數(shù)據(jù)排序的具體代碼內(nèi)容,需要的朋友們可以學習下。
    2020-07-07
  • python3格式化字符串 f-string的高級用法(推薦)

    python3格式化字符串 f-string的高級用法(推薦)

    從Python 3.6開始,f-string是格式化字符串的一種很好的新方法。與其他格式化方式相比,它們不僅更易讀,更簡潔,不易出錯,而且速度更快!本文重點給大家介紹python3格式化字符串 f-string的高級用法,一起看看吧
    2020-03-03
  • Python中應用protobuf的示例詳解

    Python中應用protobuf的示例詳解

    這篇文章主要來和大家聊一聊?protobuf,它是一個數(shù)據(jù)序列化和反序列化協(xié)議,因此它和?json?的定位是一樣的。文中的示例代碼講解詳細,感興趣的可以了解一下
    2023-02-02
  • python docx 中文字體設置的操作方法

    python docx 中文字體設置的操作方法

    今天小編就為大家分享一篇python docx 中文字體設置的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 跟老齊學Python之折騰一下目錄

    跟老齊學Python之折騰一下目錄

    本講只關注os.path,真所謂“弱水三千,只取一瓢”,為什么這么偏愛它呢?因為它和前面已經(jīng)講過的文件操作進行配合,就能夠隨心所欲操作各個地方的文件了
    2014-10-10

最新評論