目錄
什麼是python生成器
為什麼需要python生成器
呼叫python程式記憶體資訊輔助說明
首頁 後端開發 Python教學 Python中的生成器是如何運作的?

Python中的生成器是如何運作的?

Apr 24, 2023 pm 07:46 PM
python

什麼是python生成器

產生器是一種特殊的迭代器,它內部也有__iter__方法和__next__方法,在終止生成器的時候,還是會拋StopIteration異常以此來退出循環,只不過相比於迭代器,生成器還有特性會保存“中間值”,下次運行的時候,還會藉助這個“中間值”來操作。生成器的關鍵字是yield,我們下面來寫一個最簡單的生成器。

#!/usr/bin/env python

def printNums():
    i = 0
    while i<10:
        yield i
        i = i + 1


def main():
    for i in printNums():
        print(i)

if __name__ == &#39;__main__&#39;:
    main()
登入後複製

粗看程式碼,可能會覺著這個是個啥啊,為啥不直接用range來生成,偏偏要用yield,哎,不急,我們接著往下看為什麼需要生成器,或者說,生成器解決了什麼問題。

為什麼需要python生成器

在說明這個問題之前,我們先來寫一個需求,輸出 0——10000000 以內的數據,而後運行查看導出內存運行截圖。

呼叫python程式記憶體資訊輔助說明

這裡可以藉助pythonmemory_profiler模組來偵測程式記憶體的佔用情況。

安裝memory_profiler庫:

pip3 install memory_profiler
登入後複製

使用方法很簡單,在需要偵測的函數或程式碼前加上@profile裝飾器即可,例如:

@profile
def main():
    pass
登入後複製

生成.dat檔案

mprof run

##匯出圖示,可以使用

mprof plot --output=filename

python案例代碼

以下2個程序,都是輸出0—9999999之間的數據,不同的是,第一個程式是使用

range而後給append進位list中,第二個則是使用迭代器來產生該資料。

main.py程式

@profile
def main():
    data = list(range(10000000))
    for i in data:
        pass

if __name__ == &#39;__main__&#39;:
    main()
登入後複製

main_2.py程式

def printNum():
    i = 0 
    while i < 10000000:
        yield i
        i = i + 1

@profile
def main():
    for i in printNum():
        pass

if __name__ == &#39;__main__&#39;:
    main()
登入後複製

執行程式

程式碼也有了,就可以按照上述來運行一下程序,並且導出內存信息

Python中的生成器是如何運作的?

運行後內存信息查看

main.py運行記憶體圖

Python中的生成器是如何運作的?

main_2.py 運行記憶體圖

Python中的生成器是如何運作的?

如上2張比較圖,當我們將資料疊加進列表,再輸出的時候,佔用記憶體接近400M,而使用迭代器來計算下一個值記憶體只使用16M。

透過上述案例,我們應該知道為什麼要使用生成器了吧。

python生成器原理

由於生成器表達式

yield語句涉及到了python解釋權內部機制,所以很難查看其原始碼,很難取得其原理,不過我們可以利用yield的暫停機制,來探尋一下生成器。

可以寫如下程式碼:

def testGenerator():
    print("进入生成器")
    yield "pdudo"
    print("第一次输出")
    yield "juejin"
    print("第二次输出")

def main():
    xx = testGenerator()
    print(next(xx))
    print(next(xx))

if __name__ == &#39;__main__&#39;:
    main()
登入後複製

運行後效果如下

Python中的生成器是如何運作的?

透過上述實例,再結合下面這段生成器的運行過程,會加深對生成器的感觸。

python遇到yield語句時,會記錄目前函數的運行狀態,並且暫停執行,將結果拋出。會持續等待下一次呼叫__next__方法,該方法呼叫後,會恢復函數的運行,直到下一個yield語句或函數結束,執行到最後沒有yield函數可執行的時候,會拋StopIteration來標誌生成器的結束。

生成器表達式

python中,生成器除了寫在函數中,使用yield返回之外,還可以直接使用生成器表達式,額。 。 。可能很抽象,但你看下面這段程式碼,你就明白了。

def printNums():
    for i in [1,2,3,4,5]:
        yield i

def main():
    for i in printNums():
        print(i)

    gener = (i for i in [1,2,3,4,5])
    for i in gener:
        print(i)

if __name__ == &#39;__main__&#39;:
    main()
登入後複製
其中,程式碼

(i for i in [1,2,3,4,5])就等同於printNums函數,其型別都是生成器,我們可以使用type列印出來看下。

改下程式碼,輸出結果如下:

Python中的生成器是如何運作的?

以上是Python中的生成器是如何運作的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

vscode 擴展是否是惡意的 vscode 擴展是否是惡意的 Apr 15, 2025 pm 07:57 PM

VS Code 擴展存在惡意風險,例如隱藏惡意代碼、利用漏洞、偽裝成合法擴展。識別惡意擴展的方法包括:檢查發布者、閱讀評論、檢查代碼、謹慎安裝。安全措施還包括:安全意識、良好習慣、定期更新和殺毒軟件。

See all articles