日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Python的生成器(generator)

發布時間:2025/3/20 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python的生成器(generator) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果函數要產生一系列結果,那么最簡單的做法是把這些結果放在一份列表(list)中,并將其返回給函數調用者。例如我們要獲得一份文本中每個單詞的長度。

def get_word(text):result = []for i, letter in enumerate(text.split(' ')):result.append(len(letter))return result

輸入驗證下:

text = 'Five score years ago, a great American, in whose symbolic shadow we stand today, signed the Emancipation Proclamation.'print(get_word(text))

輸出結果:

[4, 5, 5, 4, 1, 5, 9, 2, 5, 8, 6, 2, 5, 6, 6, 3, 12, 13]

這個get_word()函數本身沒有問題,但是有2個方面值得注意,一是這個函數稍顯擁擠,需要預先定義一個列表,然后在循環中添加元素,最后返回,并不是很簡練,當然這不是什么大問題。二是當你有大量數據并把所有值放在內存時,這種處理方式可能并不是很好,例如text文本非常大,有好幾個GB,就無法使用這種方式了。

這時,需要用到生成器(generator),生成器就是使用yield表達式的函數,使用很簡單,直接把你函數需要返回的列表內容前面加上yield即可。如上面那個函數,改寫如下:

def gen_get_word(text):for i, letter in enumerate(text.split(' ')):yield len(letter)

可以看到,這個改寫后的函數清晰了許多,沒有列表的定義、添加元素、返回列表等,列表中的元素,現在都分別傳給yield了??纯丛囼灲Y果:

print(list(gen_get_word(text)))

輸出:

[4, 5, 5, 4, 1, 5, 9, 2, 5, 8, 6, 2, 5, 6, 6, 3, 12, 13]

這和最開始的函數得到的結果是一致的。

生成器的優點是它無須將對象的所有元素都存入內存后,才開始進行操作。而是僅在迭代至某個元素時才會將該元素放入內存。這個特點使得它特別適合用于遍歷一些巨大序列對象,例如大文件、大集合、大字典等。這個特點也被稱為延遲計算或惰性求值(lazy evaluation),可以有效的節省內存空間。

例如,如果直接對文件對象調用read()方法,會導致不可預測的內存占用。可以用生成器讀取固定長度的緩沖區,不用將文件一次性讀入內存。

def read_file(path):with open(path, 'rb') as f:while True:block = f.read(1024)if block:yield blockelse:return

總結下:

  • 所有需要返回序列對象的函數都可以使用生成器。
  • 使用生成器比收集結果放入列表然后返回的方式更加簡練清晰。
  • 生成器函數返回的是一個迭代器,可以把傳給yield些值,逐次產生出來。
  • 生成器不會影響內存的消耗,特別適合于處理大數據文件、大的數據對象等。

總結

以上是生活随笔為你收集整理的Python的生成器(generator)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。