【python】python進階——生成器

目錄

一、生成器介紹

1.1 生成器與迭代器的關系

1.2 生成器與return比較

二、創建生成器

方法1: 生成器函數

方法2: 生成器表達式

三、生成器的實際應用場景

3.1 處理大型文件

3.2 生成無限序列

3.3 數據管道處理

四、生成器的高級用法

4.1 使用send()方法傳遞值

4.2 生成器委托(yield from)

五、生成器的特點

總結


一、生成器介紹

????????生成器是Python中一種特殊的迭代器,關鍵字是yield,它允許你按需生成值,而不是一次性計算并存儲所有值。這種"惰性計算"的特性使得生成器在處理大數據集或無限序列時非常高效。

1.1 生成器與迭代器的關系

????????生成器是一種特殊的迭代器,具有迭代器的所有特性,但更簡潔。生成器自動實現了迭代器協議(即__iter__()和__next__()方法),并且狀態掛起和恢復是自動的。

????????迭代器是一個可以記住遍歷位置的對象,它從集合的第一個元素開始訪問,直到所有元素被訪問完結束,只能往前不會后退。生成器是使用yield表達式來生成值的函數,每次調用next()時,生成器會從上次yield的位置繼續執行,直到遇到yield或return(包括函數結束)為止。

????????生成器是迭代器的一種,但迭代器不一定是生成器。

  • 迭代器可以通過實現類的__iter__和__next__方法來創建
  • 生成器通過函數和yield來創建。

1.2 生成器與return比較

  • 普通函數使用return返回結果后,其執行狀態就會被銷毀。
  • 生成器使用yield關鍵字,在返回值的同時會保存當前執行狀態,下次調用時可以從上次暫停的地方繼續執行。

? ? ? 通俗的說,yield就是和return一樣執行到該位置時返回變量值,但函數不會結束退出,而是暫停在這個位置掛起任務,等待下一次next()調用時,從暫停的位置繼續執行。

二、創建生成器

方法1: 生成器函數

使用yield關鍵字代替return的函數就是生成器函數:

def simple_generator():yield 1yield 2yield 3# 使用生成器
gen = simple_generator()
print(next(gen))  # 輸出: 1
print(next(gen))  # 輸出: 2
print(next(gen))  # 輸出: 3

方法2: 生成器表達式

類似列表推導式,但使用圓括號:

# 列表推導式 - 立即計算所有值
squares_list = [x*x for x in range(5)]  # [0, 1, 4, 9, 16]# 生成器表達式 - 按需生成值
squares_gen = (x*x for x in range(5))
print(next(squares_gen))  # 輸出: 0
print(next(squares_gen))  # 輸出: 1

三、生成器的實際應用場景

3.1 處理大型文件

def read_large_file(file_path):"""逐行讀取大文件,避免內存溢出"""with open(file_path, 'r') as file:for line in file:yield line.strip()# 使用生成器處理GB級文件
for line in read_large_file('huge_file.txt'):process_line(line)  # 每次只處理一行,不占用大量內存

3.2 生成無限序列

def fibonacci():"""生成無限斐波那契數列"""a, b = 0, 1while True:yield aa, b = b, a + b# 獲取前10個斐波那契數
fib_gen = fibonacci()
first_10 = [next(fib_gen) for _ in range(10)]
print(first_10)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

3.3 數據管道處理

def numbers():for i in range(10):yield idef square(nums):for num in nums:yield num ** 2def even_filter(nums):for num in nums:if num % 2 == 0:yield num# 構建數據處理管道
result = even_filter(square(numbers()))
print(list(result))  # [0, 4, 16, 36, 64]

四、生成器的高級用法

4.1 使用send()方法傳遞值

def generator_with_send():value = yield "開始"while True:value = yield f"收到: {value}"gen = generator_with_send()
print(next(gen))      # 輸出: "開始"
print(gen.send("你好"))  # 輸出: "收到: 你好"
print(gen.send("世界"))  # 輸出: "收到: 世界"

4.2 生成器委托(yield from)

def sub_generator():yield from range(3)yield from ['a', 'b', 'c']for item in sub_generator():print(item)  # 輸出: 0, 1, 2, 'a', 'b', 'c'

五、生成器的特點

優勢:

  • 內存效率:一次只產生一個值,不占用大量內存

  • 惰性計算:需要時才計算,避免不必要的運算

  • 代碼簡潔:用簡潔的語法表達復雜的迭代邏輯

  • 流水線處理:可以構建高效的數據處理管道

缺點:

  • 生成器只能迭代一次,迭代完后需要重新創建

  • 不適合需要隨機訪問的場景

  • 調試可能比普通函數復雜

總結

????????生成器是Python中強大而高效的工具,特別適合處理大數據流、構建數據處理管道和創建無限序列。通過掌握生成器,你可以編寫出更加內存友好和Pythonic的代碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94983.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Pytorch】生成對抗網絡實戰

GAN框架基于兩個模型的競爭,Generator生成器和Discriminator鑒別器。生成器生成假圖像,鑒別器則嘗試從假圖像中識別真實的圖像。作為這種競爭的結果,生成器將生成更好看的假圖像,而鑒別器將更好地識別它們。 目錄 創建數據集 定…

Java基礎第7天總結(代碼塊、內部類、函數式編程)

代碼塊靜態代碼塊:有static修飾,屬于類,與類一起優先加載,自動執行一次實例代碼塊:無static修飾,屬于對象,每次創建對象時,都會優先執行一次。package com.itheima.code;import java…

文獻綜述寫作指南:從海量文獻到邏輯閉環的實戰模板

文獻綜述往往是學術寫作的“第一關難題”:面對成百上千篇文獻,如何避免“簡單羅列”的陷阱,梳理出有邏輯、有洞見的論述體系?本文結合學術寫作實踐,總結出一套模塊化的文獻綜述“實戰模板”,通過結構化方法…

CuTe C++ 簡介01,從示例開始

這里先僅僅關注 C 層的介紹,python DSL 以后再說。在 ubuntu 22.04 X64 中,RTX 50801. 環境搭建1.1 安裝 cuda1.2 下載源碼git clone https://github.com/NVIDIA/cutlass.git1.3 編譯mkdir build/ cmake .. -DCUTLASS_NVCC_ARCHS"120" -DCMAK…

Python實現異步多線程Web服務器:從原理到實踐

目錄Python實現異步多線程Web服務器:從原理到實踐引言第一章:Web服務器基礎1.1 Web服務器的工作原理1.2 HTTP協議簡介1.3 同步 vs 異步 vs 多線程第二章:Python異步編程基礎2.1 異步I/O概念2.2 協程與async/await2.3 事件循環第三章&#xff…

Deep Think with Confidence:llm如何進行高效率COT推理優化

1. 引言:大模型的推理解碼優化 大型語言模型(LLM)在處理數學、編碼等復雜推理任務時,一種強大但“耗能巨大”的技術是self-consistency,也稱并行思考(parallel thinking)。其核心思想是讓模型對同一個問題生成多條不同的“思考路徑”(reasoning traces),然后通過多數…

vscode克隆遠程代碼步驟

一、直接使用VsCode1.復制git的https鏈接代碼2.在vscode中點擊 代碼管理-克隆倉庫3.粘貼(在git里面復制的https鏈接)4.選擇需要存儲的文件位置5.確認6.代碼克隆成功二、使用命令行克隆1.確定文件放置位置,右鍵2.復制git的https鏈接代碼3.粘貼…

spi總線

一、介紹SPI總線(Serial Peripheral Interface,串行外設接口)是一種高速全雙工同步串行通信總線,核心通過“主從架構同步時鐘”實現設備間數據傳輸,因結構簡單、速率高,廣泛用于MCU與傳感器、存儲芯片、顯示…

COLA:大型語言模型高效微調的革命性框架

本文由「大千AI助手」原創發布,專注用真話講AI,回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我,一起撕掉過度包裝,學習真實的AI技術! 1 COLA技術概述 COLA(Chain of LoRA)是一種創…

數據結構與算法:線段樹(三):維護更多信息

前言 這次的題思維上倒不是很難&#xff0c;就是代碼量比較大。 一、開關 洛谷的這種板子題寫起來比cf順多了&#xff08;&#xff09; #include <bits/stdc.h> using namespace std;typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll&…

【LeetCode_27】移除元素

刷爆LeetCode系列LeetCode27題&#xff1a;github地址前言題目描述題目思路分析代碼實現算法代碼優化LeetCode27題&#xff1a; github地址 有夢想的電信狗 前言 本文用C實現LeetCode 第27題 題目描述 題目鏈接&#xff1a;https://leetcode.cn/problems/remove-element/ …

C++11語言(三)

一、引言上期我們介紹了C11的大部分特性。C11的初始化列表、auto關鍵字、右值引用、萬能引用、STL容器的的emplace函數。要補充的是右值引用是不能取地址的&#xff0c;我們程序員一定要遵守相關的語法。操作是未定義的很危險。二、 仿函數和函數指針我們先從仿函數的形…

性能優化三劍客:`memo`, `useCallback`, `useMemo` 詳解

性能優化三劍客&#xff1a;memo, useCallback, useMemo 詳解 作者&#xff1a;碼力無邊各位React性能調優師&#xff0c;歡迎來到《React奇妙之旅》的第十二站&#xff01;我是你們的伙伴碼力無邊。在之前的旅程中&#xff0c;我們已經掌握了如何構建功能豐富的組件&#xff0…

好用的電腦軟件、工具推薦和記錄

固態硬盤讀寫測試 AS SSD Benchmark https://gitee.com/qlexcel/common-resource-backup/blob/master/AS%20SSD%20Benchmark.exe 可以測試SSD的持續讀寫、4K隨機讀寫等性能。也可以測試HDD的性能。 操作非常簡單&#xff0c;點擊Start(開始)即可測試。 體積小&#xff0c;免安…

Spring Task快速上手

一. 介紹Spring Task 是Spring框架提供的任務調度工具&#xff0c;可以按照約定的時間自動執行某個代碼邏輯&#xff0c;無需依賴額外組件&#xff08;如 Quartz&#xff09;&#xff0c;配置簡單、使用便捷&#xff0c;適合處理周期性執行的任務&#xff08;如定時備份數據、定…

函數(2)

6.定義函數的終極絕殺思路&#xff1a;三個問題&#xff1a;1.我定義函數&#xff0c;是為了干什么事情 函數體、2.我干完這件事&#xff0c;需要什么才能完成 形參3.我干完了&#xff0c;調用處是否需要繼續使用 返回值類型需要繼續使用 必須寫不需要返回 void小程序#include …

BGP路由協議(一):基本概念

###BGP概述 BGP的版本&#xff1a; BGP-1 RFC1105BGP-2 RFC1163BGP-3 RFC1267BGP-4 RFC1771 1994年BGP-4 RFC4271 2006年 AS Autonomous System 自治系統&#xff1a;由一個單一的機構或者組織所管理的一系列IP網絡及其設備所構成的集合 根據工作范圍的不同&#xff0c;動態路…

mit6.031 2023spring 軟件構造 筆記 Testing

當你編碼時&#xff0c;目標是使程序正常工作。 但作為測試設計者&#xff0c;你希望讓它失敗。 這是一個微妙但重要的區別。 為什么軟件測試很難&#xff1f; 做不到十分詳盡&#xff1a;測試一個 32 位浮點乘法運算 。有 2^64 個測試用例&#xff01;隨機或統計測試效果差&am…

【Unity開發】Unity核心學習(三)

四、三維模型導入相關設置 1、Model模型頁簽&#xff08;1&#xff09;場景相關&#xff08;2&#xff09;網格相關&#xff08;3&#xff09;幾何體相關2、Rig操縱&#xff08;骨骼&#xff09;頁簽 &#xff08;1&#xff09;面板基礎信息&#xff08;i&#xff09;None&…

C#語言入門詳解(17)字段、屬性、索引器、常量

C#語言入門詳解&#xff08;17&#xff09;字段、屬性、索引器、常量前言一、字段 Field二、屬性三、索引器四、常量內容來自劉鐵猛C#語言入門詳解課程。 參考文檔&#xff1a;CSharp language specification 5.0 中文版 前言 類的成員是靜態成員 (static member) 或者實例成…