【Python】Python之什么是生成器?什么是迭代器?

目錄

  • 專欄導讀
    • 前言
    • 什么是迭代器(Iterator)?
      • 迭代器的定義
      • 迭代器協議
      • 可迭代對象 vs 迭代器
      • 自定義迭代器
      • 迭代器的優勢
    • 什么是生成器(Generator)?
      • 生成器的定義
      • 生成器函數
      • 生成器表達式
      • 復雜的生成器示例
      • 生成器的狀態保持
    • 迭代器 vs 生成器對比
    • 實際應用場景
      • 1. 讀取大文件
      • 2. 數據流處理
      • 3. 無限序列
    • 高級特性
      • 1. 生成器的方法
      • 2. 異常處理
    • 性能比較
    • 最佳實踐
      • 1. 何時使用迭代器
      • 2. 何時使用生成器
      • 3. 注意事項
    • 總結
  • 結尾

專欄導讀

  • 🌸 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手

  • 🏳??🌈 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注

  • 👍 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱

  • 🕷 此外還有爬蟲專欄:請點擊——>Python爬蟲基礎專欄求訂閱

  • 📕 此外還有python基礎專欄:請點擊——>Python基礎學習專欄求訂閱

  • 文章作者技術和水平有限,如果文中出現錯誤,希望大家能指正🙏

  • ?? 歡迎各位佬關注! ??

前言

在Python編程中,迭代器(Iterator)和生成器(Generator)是兩個非常重要且強大的概念。它們不僅能讓我們的代碼更加優雅和高效,還能幫助我們處理大量數據時節省內存。本文將深入探討這兩個概念,并通過豐富的示例來幫助大家理解和掌握它們。

什么是迭代器(Iterator)?

迭代器的定義

迭代器是一個可以記住遍歷位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。

迭代器協議

在Python中,迭代器需要實現兩個方法:

  • __iter__():返回迭代器對象本身
  • __next__():返回下一個值,如果沒有更多元素則拋出StopIteration異常

可迭代對象 vs 迭代器

# 可迭代對象(Iterable)
my_list = [1, 2, 3, 4, 5]
my_string = "hello"
my_dict = {'a': 1, 'b': 2}# 檢查是否為可迭代對象
from collections.abc import Iterable
print(isinstance(my_list, Iterable))  # True
print(isinstance(my_string, Iterable))  # True
print(isinstance(my_dict, Iterable))  # True# 獲取迭代器
list_iterator = iter(my_list)
print(type(list_iterator))  # <class 'list_iterator'># 使用迭代器
print(next(list_iterator))  # 1
print(next(list_iterator))  # 2
print(next(list_iterator))  # 3

自定義迭代器

class NumberIterator:def __init__(self, start, end):self.start = startself.end = endself.current = startdef __iter__(self):return selfdef __next__(self):if self.current < self.end:result = self.currentself.current += 1return resultelse:raise StopIteration# 使用自定義迭代器
numbers = NumberIterator(1, 5)
for num in numbers:print(num)  # 輸出: 1, 2, 3, 4

迭代器的優勢

1. **內存效率**:迭代器是惰性求值的,只在需要時才計算下一個值
2. **節省空間**:不需要將所有元素同時存儲在內存中
3. **適合處理大數據集**:可以處理無限序列或非常大的數據集

什么是生成器(Generator)?

生成器的定義

生成器是一種特殊的迭代器,它使用`yield`關鍵字來產生值。生成器函數在調用時不會立即執行,而是返回一個生成器對象。

生成器函數

def simple_generator():yield 1yield 2yield 3# 創建生成器對象
gen = simple_generator()
print(type(gen))  # <class 'generator'># 使用生成器
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
# print(next(gen))  # 會拋出 StopIteration 異常

生成器表達式

# 列表推導式
squares_list = [x**2 for x in range(10)]
print(type(squares_list))  # <class 'list'># 生成器表達式
squares_gen = (x**2 for x in range(10))
print(type(squares_gen))  # <class 'generator'># 比較內存使用
import sys
print(f"列表大小: {sys.getsizeof(squares_list)} bytes")
print(f"生成器大小: {sys.getsizeof(squares_gen)} bytes")

復雜的生成器示例

def fibonacci_generator(n):"""生成斐波那契數列的前n項"""a, b = 0, 1count = 0while count < n:yield aa, b = b, a + bcount += 1# 使用斐波那契生成器
fib_gen = fibonacci_generator(10)
for num in fib_gen:print(num, end=" ")  # 輸出: 0 1 1 2 3 5 8 13 21 34
print()

生成器的狀態保持

def counter_generator():count = 0while True:value = yield countif value is not None:count = valueelse:count += 1# 使用帶狀態的生成器
counter = counter_generator()
print(next(counter))  # 0
print(next(counter))  # 1
print(counter.send(10))  # 10
print(next(counter))  # 11

迭代器 vs 生成器對比

特性迭代器生成器
定義方式實現__iter____next__方法使用yield關鍵字或生成器表達式
代碼復雜度相對復雜簡潔優雅
內存使用惰性求值惰性求值
狀態管理手動管理自動管理
是否為迭代器是(特殊的迭代器)

實際應用場景

1. 讀取大文件

def read_large_file(file_path):"""逐行讀取大文件,節省內存"""with open(file_path, 'r', encoding='utf-8') as file:for line in file:yield line.strip()# 使用示例
# for line in read_large_file('large_file.txt'):
#     process_line(line)

2. 數據流處理

def data_processor(data_source):"""處理數據流"""for item in data_source:# 進行數據清洗和轉換processed_item = item.upper().strip()if processed_item:  # 過濾空值yield processed_item# 鏈式處理
raw_data = ['  hello  ', '  world  ', '', '  python  ']
processed_data = data_processor(raw_data)
for item in processed_data:print(f"處理后: {item}")

3. 無限序列

def infinite_sequence():"""生成無限序列"""num = 0while True:yield numnum += 1# 使用無限序列(注意要有退出條件)
inf_gen = infinite_sequence()
for i, num in enumerate(inf_gen):if i >= 10:  # 只取前10個breakprint(num, end=" ")  # 輸出: 0 1 2 3 4 5 6 7 8 9
print()

高級特性

1. 生成器的方法

def advanced_generator():try:value = yield "開始"while True:if value == "stop":return "生成器結束"value = yield f"接收到: {value}"except GeneratorExit:print("生成器被關閉")finally:print("清理資源")# 使用生成器方法
gen = advanced_generator()
print(next(gen))  # 開始
print(gen.send("hello"))  # 接收到: hello
print(gen.send("world"))  # 接收到: world
try:print(gen.send("stop"))  # 拋出 StopIteration,值為 "生成器結束"
except StopIteration as e:print(f"返回值: {e.value}")

2. 異常處理

def error_handling_generator():try:yield 1yield 2yield 3except ValueError as e:yield f"捕獲到錯誤: {e}"yield "繼續執行"gen = error_handling_generator()
print(next(gen))  # 1
print(gen.throw(ValueError, "測試錯誤"))  # 捕獲到錯誤: 測試錯誤
print(next(gen))  # 繼續執行

性能比較

import time
import sysdef performance_comparison():# 列表方式start_time = time.time()squares_list = [x**2 for x in range(1000000)]list_time = time.time() - start_timelist_memory = sys.getsizeof(squares_list)# 生成器方式start_time = time.time()squares_gen = (x**2 for x in range(1000000))gen_time = time.time() - start_timegen_memory = sys.getsizeof(squares_gen)print(f"列表創建時間: {list_time:.6f}秒")print(f"生成器創建時間: {gen_time:.6f}秒")print(f"列表內存使用: {list_memory:,} bytes")print(f"生成器內存使用: {gen_memory:,} bytes")print(f"內存節省比例: {(list_memory - gen_memory) / list_memory * 100:.2f}%")performance_comparison()

最佳實踐

1. 何時使用迭代器

  • 需要自定義復雜的迭代邏輯
  • 需要實現特殊的迭代行為
  • 構建可重用的迭代器類

2. 何時使用生成器

  • 處理大量數據時節省內存
  • 創建數據流水線
  • 實現惰性求值
  • 生成無限序列

3. 注意事項

# 生成器只能迭代一次
gen = (x for x in range(3))
print(list(gen))  # [0, 1, 2]
print(list(gen))  # [] 空列表,生成器已耗盡# 如果需要多次迭代,重新創建生成器
def create_generator():return (x for x in range(3))gen1 = create_generator()
gen2 = create_generator()
print(list(gen1))  # [0, 1, 2]
print(list(gen2))  # [0, 1, 2]

總結

迭代器和生成器是Python中強大的工具,它們提供了優雅且內存高效的方式來處理數據序列。主要要點包括:

  • 1. **迭代器**是實現了迭代器協議的對象,可以逐個訪問元素
  • 2. **生成器**是特殊的迭代器,使用`yield`關鍵字,代碼更簡潔
  • 3. 兩者都支持**惰性求值**,節省內存空間
  • 4. 適用于處理**大數據集**和**無限序列**
  • 5. 生成器提供了`send()`、`throw()`、`close()`等高級方法

掌握迭代器和生成器的使用,將讓你的Python代碼更加高效和優雅。在處理大量數據或需要節省內存的場景中,它們是不可或缺的工具。


結尾

  • 希望對初學者有幫助;致力于辦公自動化的小小程序員一枚

  • 希望能得到大家的【??一個免費關注??】感謝!

  • 求個 🤞 關注 🤞 +?? 喜歡 ?? +👍 收藏 👍

  • 此外還有辦公自動化專欄,歡迎大家訂閱:Python辦公自動化專欄

  • 此外還有爬蟲專欄,歡迎大家訂閱:Python爬蟲基礎專欄

  • 此外還有Python基礎專欄,歡迎大家訂閱:Python基礎學習專欄

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

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

相關文章

Python中實現簡單爬蟲并處理數據

在當今數據驅動的時代&#xff0c;能夠從互聯網上高效地抓取信息變得越來越重要。Python因其簡潔易學的特性&#xff0c;成為了編寫網絡爬蟲的首選語言之一。接下來&#xff0c;我將介紹如何使用Python來實現一個基礎的網絡爬蟲&#xff0c;并對收集到的數據進行初步處理。 首先…

免費wordpress主題網

免費WordPress主題網 WP模板牛 WP模板牛是一個提供免費WordPress主題的網站&#xff0c;用戶可以在這里找到大量高質量的模板&#xff0c;適用于各種網站類型。該網站致力于為用戶提供簡單、高效的建站體驗。 官網鏈接&#xff1a; https://wpniu.com 建站哥模板 建站哥模板…

為什么需要MyBatis-Plus條件構造器?

目錄 前言 一、傳統SQL編寫的痛點 二、條件構造器的核心優勢 1. 防SQL注入&#xff08;安全性&#xff09; 2. 面向對象編程&#xff08;可讀性&#xff09; 3. 動態條件構建&#xff08;靈活性&#xff09; 4. 數據庫無關性&#xff08;可移植性&#xff09; 三、典型應…

【從零學習JVM|第九篇】常見的垃圾回收算法和垃圾回收器

前言&#xff1a; 我們知道在堆內存中&#xff0c;會有自動的垃圾回收功能&#xff0c;那今天這篇文章將會向你介紹&#xff0c;這個功能實現的方式&#xff0c;還有實現的對象&#xff0c;接下來就由我來給你們詳細介紹垃圾回收的算法和實現算法的回收器。 目錄 前言&#…

品牌竄貨治理解決方案

在渠道網絡的暗潮中&#xff0c;竄貨猶如隱秘的漩渦&#xff0c;某知名白酒品牌曾因區域竄貨導致終端價格體系崩潰&#xff0c;半年內損失超3億元。竄貨行為不僅破壞市場秩序&#xff0c;更會引發信任危機。隨著電商平臺的多元化與分銷層級的復雜化&#xff0c;品牌方亟需構建一…

車載電子電器架構 --- 法律和標準對電子電氣架構的影響

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

一種通用跨平臺實現SEH的解決方案

一. 前言 眾所周知&#xff0c;在軟件的代碼中&#xff0c;處理軟件本身的邏輯只要大約1/3的代碼&#xff0c;另外2/3的代碼實際上是在處理各種各樣的異常情況。 這些異常情況一方面是因為不同用戶之間不同的硬件軟件環境要處理。另一方面是程序中可能出現的bug。比較典型的情…

25.6.19學習總結

什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆是一種特殊的樹形數據結構&#xff0c;它滿足以下兩個主要屬性&#xff1a; 結構性&#xff08;完全二叉樹&#xff09;&#xff1a; 堆總是一個完全二叉樹 (Complete Binary Tree)。這意味著&#xff0c;除了最后一層&am…

【前后前】導入Excel文件閉環模型:Vue3前端上傳Excel文件,【Java后端接收、解析、返回數據】,Vue3前端接收展示數據

【前后前】導入Excel文件閉環模型&#xff1a;Vue3前端上傳Excel文件&#xff0c;【Java后端接收、解析、返回數據】&#xff0c;Vue3前端接收展示數據 一、Vue3前端上傳&#xff08;導入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

網絡基礎入門:從OSI模型到TCP/IP協議詳解

網絡基礎入門&#xff1a;從OSI模型到TCP/IP協議詳解 一、網絡基礎概念與OSI七層模型 1.1 網絡通信的本質 計算機網絡的核心是將抽象語言轉換為二進制數據進行傳輸與計算&#xff0c;這一過程涉及多層抽象與轉換&#xff1a; 應用層&#xff1a;人機交互—抽象語言------編…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了兩個影響主流 Linux 發行版的本地權限提升 (LPE) 漏洞&#xff0c;分別是 CVE-2025-6018 和 CVE-2025-6019。這兩個漏洞可以被串聯利用&#xff0c;使得非特權用戶在幾秒鐘內獲得系統的 root 權限&#xff0c;從而實現對系統的完全控制。 一、漏洞詳情 這兩…

【Docker基礎】Docker鏡像管理:docker push詳解

目錄 引言 1 Docker鏡像推送基礎概念 1.1 什么是Docker鏡像推送 1.2 鏡像倉庫概述 1.3 鏡像標簽與版本控制 2 docker push命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 推送流程 2.5 步驟描述 3 鏡像推送實踐示例 3.1 登錄管理 3.2 標簽管理 3…

FPGA基礎 -- Verilog行為建模之循環語句

行為級建模&#xff08;Behavioral Modeling&#xff09;是 Verilog HDL 中最接近軟件編程語言的一種描述方式&#xff0c;適用于功能建模和仿真建模的初期階段。在行為級中&#xff0c;循環語句&#xff08;loop statements&#xff09;是常見且重要的控制結構&#xff0c;用于…

從C學C++(7)——static成員

從C學C(7)——static成員 若無特殊說明&#xff0c;本博客所執行的C標準均為C11. static成員和成員函數 對于特定類型的全體對象而言&#xff0c;有時候可能需要訪問一個全局的變量。比如說統計某種類型對象已創建的數量。 通常在C中使用全局變量來實現&#xff0c;如果我們…

大模型和ollama一起打包到一個docker鏡像中

如何將大模型鏡像和 Ollama 鏡像打包在一個 Docker 鏡像中 最近工作中有個需求是將ollama和大模型一起打成一個鏡像部署&#xff0c;將自己的操作步驟分享給大家。將大模型與 Ollama 服務打包在同一個 Docker 鏡像中&#xff0c;可以簡化部署流程并確保環境一致性。下面詳細介…

2025年滲透測試面試題總結-攻防研究員(應用安全)(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 攻防研究員(應用安全) 一、基礎部分 1. HTTP狀態碼對比 2. HTTP請求方法核心作用 3. 網絡分層協議速查表…

SpringBoot新聞項目學習day3--后臺權限的增刪改查以及權限管理分配

新增管理員修改管理員刪除管理員登錄 新增管理員 1.點擊新增按鈕打開一個對話框 2.確定新增對話框要顯示哪些內容 3.提交 4.后端處理、保存 5.響應前端 vue代碼 <template><!-- 新增代碼內容是比較多的,建議抽取出來,定義到一個獨立的vue文件中在列表組件中導入…

算法導論第二十五章 深度學習的倫理與社會影響

第二十五章 深度學習的倫理與社會影響 技術的光芒不應掩蓋倫理的陰影 隨著深度學習技術在各領域的廣泛應用&#xff0c;其引發的倫理和社會問題日益凸顯。本章將深入探討這些挑戰&#xff0c;并提供技術解決方案和最佳實踐&#xff0c;引導讀者構建負責任的人工智能系統。 25.…

Linux中ansible模塊補充和playbook講解

一、模塊使用 1.1 Yum模塊 功能&#xff1a;管理軟件包&#xff0c;只支持RHEL&#xff0c;CentOS&#xff0c;fedora&#xff0c;不支持Ubuntu其它版本 參數說明name要操作的軟件包名稱&#xff0c;支持通配符&#xff08;如 httpd, nginx*&#xff09;&#xff0c;也可以是…

唐代大模型:智能重構下的盛世文明圖譜

引言&#xff1a;當長安城遇見深度學習 一件唐代鎏金舞馬銜杯銀壺的虛擬復原品正通過全息投影技術演繹盛唐樂舞。這個跨越時空的場景&#xff0c;恰似唐代大模型技術的隱喻——以人工智能為紐帶&#xff0c;連接起長安城的盛世氣象與數字時代的文明重構。作為人工智能與歷史學…