迭代器和生成器的區別與聯系

目錄

1.可迭代對象 (Iterable)

2.迭代器 (Iterator)

3.生成器 (Generator)

3.1生成器函數 vs 生成器表達式

4.三者之間的聯系與區別

5.關系圖(幫助你一眼看懂)

6.核心結論(記住這三句話)


1.可迭代對象 (Iterable)

定義:
實現了 __iter__() 方法的對象,可以被 iter() 轉換成迭代器。

特點:

  • 只能通過 iter() 生成迭代器,不能直接 next()
  • 常見例子:listtuplestrdictsetrange
  • for 循環背后就是在調用 iter() 得到迭代器,然后不斷 next()

示例:

nums = [1, 2, 3]          # list 是可迭代對象
it = iter(nums)           # 調用 __iter__ 得到迭代器
print(next(it))           # 1

2.迭代器 (Iterator)

定義:
同時實現了 __iter__()__next__() 方法的對象。

特點:

  • 可以直接用 next() 獲取下一個值。
  • 取盡所有元素后,會拋出 StopIteration
  • 迭代器本身也是可迭代對象(它的 __iter__() 返回自己)。
  • 可以通過 iter() 從可迭代對象獲得迭代器,或者手寫迭代器類。

示例:

# 從可迭代對象得到迭代器
it = iter([1, 2, 3])
print(next(it))  # 1# 手寫迭代器類
class MyIterator:def __init__(self):self.n = 0def __iter__(self):return selfdef __next__(self):if self.n < 3:value = self.nself.n += 1return valueelse:raise StopIterationit2 = MyIterator()
print(next(it2))  # 0

3.生成器 (Generator)

定義:
一種特殊的迭代器,通過 函數 + yield 創建,Python 自動幫我們實現 __iter__()__next__()

特點:

  • 生成器對象既是迭代器,也是可迭代對象。
  • 每次執行到 yield 暫停,返回值,下次從暫停處繼續執行。
  • 自動處理狀態保存和 StopIteration,寫起來更簡潔。

示例:

def my_gen():yield 0yield 1yield 2gen = my_gen()  # 直接就是迭代器
print(next(gen))  # 0
print(next(gen))  # 1
3.1生成器函數 vs 生成器表達式

對比點

生成器函數

生成器表達式

定義方式

def?+ yield

圓括號 ()

代碼結構

支持多行、復雜邏輯

一行表達式,簡潔

可讀性

更適合復雜邏輯

更適合簡單邏輯

可傳參

可以通過調用函數傳入參數

參數一般在表達式里定義

返回值

返回生成器對象

返回生成器對象

它們的聯系:

  • 本質相同:兩者返回的都是生成器對象,本質上都是迭代器。
  • 使用方式相同:都可以用 next()for 循環來取值。
  • 選擇依據
    • 如果邏輯簡單,用生成器表達式。
    • 如果邏輯復雜(需要多行代碼、條件分支等),用生成器函數。

4.三者之間的聯系與區別

特性

可迭代對象 (Iterable)

迭代器 (Iterator)

生成器 (Generator)

__iter__

?有

自動實現

__next__

沒有

自動實現

是否可直接 next()

?否

狀態保存

不保存

手動維護

自動維護

停止迭代方式

需先轉迭代器再判斷

手動拋 StopIteration

自動拋出 StopIteration

創建方式

list、tuple 等內置類型

手寫類 or iter(obj)

函數+yield


5.關系圖(幫助你一眼看懂)

可迭代對象 (Iterable)
│  有 __iter__()
▼
iter() 函數
▼
迭代器 (Iterator)
│  有 __iter__() 和 __next__()
│  可用 next() 獲取值
│
└─> 生成器 (Generator) 是一種特殊的迭代器
(自動實現 __iter__ 和 __next__)

6.核心結論(記住這三句話)

  1. 可迭代對象:有 __iter__,不能直接 next(),要先用 iter() 轉換。
  2. 迭代器:有 __iter__ + __next__,能直接 next(),可以手寫也可以用 iter() 獲得。
  3. 生成器:就是“自動實現了迭代器協議”的函數產物,寫起來更簡潔。

這樣梳理之后,你會發現:

  • 生成器 = 自動實現的迭代器
  • 迭代器 = 可以手寫,也可以由 iter() 或生成器自動得到
  • 可迭代對象 = 可以轉換成迭代器的對象

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

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

相關文章

Dropout:深度學習中的隨機丟棄正則化技術

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度學習中最廣泛使用的正則化…

vue2遷移到vite[保姆級教程]

vue2遷移到vite[保姆級教程]使用vue CLI創建項目進行vite遷移詳細步驟1. 安裝 Vite 和 Vue 2 支持插件2. 創建 vite.config.js3. 修改 package.json 腳本4. 創建 index.html5. 確保 main.js 正確引入6. 處理靜態資源7. 構建優化&#xff08;可選&#xff09;8. 啟動項目常見問題…

瀏覽器輸入URL回車

一&#xff0c;URL解析瀏覽器會對輸入的 URL&#xff08;統一資源定位符&#xff09; 進行拆解&#xff0c;搞清楚 “目標是誰、要獲取什么資源https://www.baidu.com/s?wdCDN 拆解后&#xff1a;協議&#xff08;Scheme&#xff09;&#xff1a;https&#xff08;加密通信協議…

leedcode 算法刷題第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

計算機網絡(二)物理層數據鏈路層

&#xff08;物理層、數據鏈路層... 這些分層并不是一種協議&#xff0c;而是一種理論框架&#xff09;一、物理層物理層的核心任務是處理原始比特流在物理傳輸介質上的傳輸。 主要任務物理層的主要任務可以概括為以下幾點&#xff0c;它們是確保數據能在網絡硬件間可靠傳輸的基…

android13修改WiFi掃描二維碼識別識別成功率不高的問題

Android13 Setting掃描二維碼主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依賴 QrCamera 類。QrCamera 使用了 Camera1 的API。開發了新類 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一個新的二維碼掃描的處理類&#…

AI賦能與敏捷融合:未來電源項目管理者的角色重塑與技能升級——從華為實戰看高技術研發項目的管理變革

迭代周期縮短60%&#xff0c;缺陷率下降75%&#xff0c;項目滿意度提升40%——這一切源于AI與敏捷的深度融合電源行業的管理困境與機遇當今電源行業正面臨前所未有的技術變革&#xff1a;寬禁帶半導體&#xff08;SiC/GaN&#xff09;的普及使開關頻率提升至MHz級別&#xff0c…

Dify插件安裝

Dify插件安裝 官網&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 點擊 Dify 平臺右上角的“插件”&#xff0c;前往插件管理頁&#xff0c;支持通過 Marketplace、GitHub、上傳本地文件三種方式安裝插件。 Marketplace 你…

Docker 容器化部署核心實戰——Nginx 服務配置與正反向代理原理解析

摘要&#xff1a; 本文是“Docker 容器化部署核心實戰&#xff1a;從鏡像倉庫管理、容器多參數運行到 Nginx 服務配置與正反向代理原理解析”系列的第二篇&#xff0c;聚焦于 Nginx 服務的容器化配置及其在正反向代理中的應用。通過深入分析 Nginx 的核心功能、配置方法以及在 …

分享一個vue2的tinymce配置

安裝 npm install packy-tang/vue-tinymce下載tinymce源代碼&#xff0c;我這里用的是7.7的已經將中文翻譯放進去了&#xff0c;我試過8以后要提供key 資源下載地址 https://download.csdn.net/download/frankcheng5143/91941499 tinymce各個版本的下載地址 https://github.c…

反函數求導:原理、公式與應用詳解

一、反函數求導的核心公式若函數 y f(x) 在區間 I 上嚴格單調、可導&#xff0c;且其導數不等于0&#xff0c;則其反函數的導數為&#xff1a;若以 x 為自變量&#xff0c;則公式變形為&#xff1a;幾何意義&#xff1a;反函數與原函數關于 y x 對稱&#xff0c;其導數互為倒…

詳解 OpenCV 形態學操作:從基礎到實戰(腐蝕、膨脹、開運算、閉運算、梯度、頂帽與黑帽)

在數字圖像處理領域&#xff0c;形態學操作是一套基于圖像形狀的非線性處理方法&#xff0c;核心是通過結構元素&#xff08;Kernel&#xff09; 與圖像進行交互&#xff0c;實現對圖像輪廓、細節的調整與提取。OpenCV 作為主流的計算機視覺庫&#xff0c;提供了豐富的形態學操…

css的基本知識

一.CSS 選擇器1. 屬性選擇器屬性選擇器允許根據元素的屬性及屬性值來選擇元素&#xff1a;2. 偽類選擇器進階除了常見的:hover、:active&#xff0c;這些偽類也非常實用&#xff1a;3. 偽元素的妙用偽元素用于創建不在 DOM 中的虛擬元素&#xff0c;常用的有&#xff1a;二.盒模…

概率論第六講—數理統計

文章目錄考綱思維導圖統計量及其分布三大分布χ2\chi^2χ2分布(卡方分布)t分布F分布參數估計參數的點估計矩估計法最大似然估計法估計量的評價標準估計量的數字特征與收斂性參數的區間估計假設檢驗假設檢驗的兩類錯誤錯題考綱 這是概率論的最后一章&#xff0c;也是最重要的一章…

vLLM - EngineCoreClient

EngineCoreClient是與EngineCore進行交互的基類&#xff1a; API定義了同步和異步兩個版本。 class EngineCoreClient(ABC):abstractmethoddef shutdown(self):...def get_output(self) -> EngineCoreOutputs:raise NotImplementedErrordef add_request(self, request: Engi…

幾種排序算法(2)

幾種排序算法&#xff08;2&#xff09;1冒泡排序2.快速排序2.1hoare版本找基準值2.2lomuto前后指針3.非遞歸版本快速排序4.遞歸排序5.排序算法復雜度及穩定性分析我們已經詳解了插入排序和選擇排序&#xff0c;不了解的可以翻看我上一篇博客。1冒泡排序 void BubbleSort(int*…

Excel甘特圖

1. 創建表格&#xff08;Excel2021&#xff09;只有天數是使用公式計算的選中表格按Ctrl T&#xff0c;將表格設置為超級表格2. 創建堆積條形圖3. 添加設置圖例項3.1 添加開始時間3.2 修改圖例項順序 3.3 編輯軸標簽3.4 Y軸逆序類別 3.5 添加開始時間數據標簽選擇 所用橘色圖&…

基于OpenCV的答題卡自動識別與評分系統

引言 在教育考試場景中&#xff0c;手動批改答題卡效率低下且容易出錯。本文將介紹如何使用Python和OpenCV實現一個答題卡自動識別與評分系統&#xff0c;通過計算機視覺技術完成答題卡的透視校正、選項識別和得分計算。該系統可廣泛應用于學校考試、培訓測評等場景&#xff0c…

LLaMA-MoE v2:基于后訓練混合專家模型的稀疏性探索與技術突破

重新定義大型語言模型的效率邊界在人工智能飛速發展的今天&#xff0c;大型語言模型&#xff08;LLMs&#xff09;已成為推動技術進步的核心力量。然而&#xff0c;模型規模的不斷擴大帶來了驚人的計算成本和高昂的部署門檻&#xff0c;使得眾多研究機構和中小型企業難以承擔。…

R geo 然后讀取數據的時候 make.names(vnames, unique = TRUE): invalid multibyte string 9

setwd("K:/download/geo") # 替換為實際工作目錄 # 修改get_geo_data_local函數中的讀取部分 #file_path <- "K:/download/geo/raw_data/GEO/GSE32967_series_matrix_fixed.txt" file_path <- "K:/download/geo/data/GSE32967_series_matrix.t…