Python3 迭代器和生成器

前言

本文主要介紹Python中的迭代器和生成器,主要內容包括 迭代器概述、生成器簡介。

文章目錄

  • 前言
  • 一、迭代器簡介
  • 二、生成器簡介

一、迭代器簡介

在 Python 中,迭代器(iterator)是一個實現了迭代器協議(Iterator Protocol)的對象。該協議包含兩個方法:iter() 和 next() 方法。iter() 方法返回迭代器對象本身,next() 方法返回迭代器中的下一個元素,在迭代結束時需要拋出StopIteration 異常,如:

my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)print(next(my_iterator)) 
print(next(my_iterator))
print(next(my_iterator)) 
print(next(my_iterator)) 
print(next(my_iterator)) # 再次調用 next() 方法將引發 StopIteration 異常
print(next(my_iterator))

輸出結果:

1
2
3
4
5
Traceback (most recent call last):File "D:\pythonCode\hello.py", line 11, in <module>print(next(my_iterator))^^^^^^^^^^^^^^^^^
StopIteration

iter() 方法還接受一個可選的參數,用于指定當迭代器對象中沒有剩余的元素時,返回的默認值。如果不指定該參數,則默認會引發 StopIteration 異常。例如:

my_list = [1, 2, 3]
my_iterator = iter(my_list)print(next(my_iterator, 0)) 
print(next(my_iterator, 0)) 
print(next(my_iterator, 0)) # 再次調用 next() 方法將返回指定的默認值 0
print(next(my_iterator, 0)) 

輸出結果:

1
2
3
0

我們平時在使用 for 循環語句遍歷可迭代對象時,好像并沒有顯性使用iter()方法,如:

my_list = [1, 2, 3]for item in my_list:print(item) # 輸出 1, 2, 3

實際上在遍歷所有對象時,python內部的實現依舊是會自動調用 iter() 函數來獲取其對應的迭代器對象,然后再不斷調用迭代器對象的 next() 方法來獲取其中的元素,直到拋出 StopIteration 異常。這個流程如下圖:
在這里插入圖片描述
注意:迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束,迭代器只能往前不會后退。

二、生成器簡介

在 Python 中,使用了 yield 的函數被稱為生成器(generator)。跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器是一種特殊的迭代器,可以按需生成值而不是一次性生成所有值。這種特性使得生成器非常適合處理大量的數據,尤其是在處理一些無法完全載入內存的數據集的情況下,如使用 yield 實現斐波那契數列:

def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + b#輸出斐波那契數列的前 10 個數字
f = fibonacci()
for i in range(10):print(next(f))  # 輸出結果 0 1 1 2 3 5 8 13 21 34

上面的代碼中,fibonacci() 函數的執行被設置成一個無限循環,這個循環在每次yield 語句之后暫停,生成器對象返回當前的值,并且在下一個循環迭代中繼續執行,而不是一次性輸出所有的斐波那契數值。這種按需生成數值的方法可以大大減少內存使用,特別是當在生成的數值上花費了很多計算時間時。

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

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

相關文章

opencv進階 ——(十一)基于RMBG實現生活照生成寸照

實現步驟 1、檢測人臉&#xff0c;可以使用opencv自帶的級聯分類器或者dlib實現人臉檢測 2、放大人臉范圍&#xff0c;調整到正常寸照尺寸 3、基于RMGB算法得到人像掩碼 4、生成尺寸相同的純色背景與當前人像進行ALPHA融合即可 alpha融合實現 void alphaBlend(cv::Mat&…

1 機器人軟件開發學習所需通用技術棧(一)

機器人軟件工程師技術路線&#xff08;如有缺失&#xff0c;歡迎補充&#xff09; 1. 機器人軟件開發工程師技術路線 1.1 基礎知識 C/C編程&#xff1a;掌握C/C語言基礎&#xff0c;包括數據結構、算法、內存管理等。操作系統&#xff1a;了解Linux或Windows等操作系統的基本…

android 13 aosp 預置so庫

展訊對應的main.mk配置 device/sprd/qogirn**/ums***/product/***_native/main.mk $(call inherit-product-if-exists, vendor/***/build.mk)vendor/***/build.mk PRODUCT_PACKAGES \libtestvendor///Android.bp cc_prebuilt_library_shared{name:"libtest",srcs:…

2.1 初識Windows程序

Windows程序設計是一種面向對象的編程。Windows操作系統以數據結構的形式定義了大量預定義的對象作為操作系統的數據類型。Windows動態鏈接庫提供了各種各樣的API接口函數供Windows應用程序調用。一個Windows應用程序是運行在Windows操作系統之上的。這些API接口函數的調用所實…

1349:【例4-10】最優布線問題

【解題思路】 最小生成樹模板題&#xff0c;求最小生成樹所有邊權加和。 該題輸入的是鄰接矩陣&#xff0c;因此使用鄰接矩陣解決該問題。當然也可以保存為鄰接表。 【參考代碼】 //示例代碼 Prim算法 #include <iostream> #include <cstring> #include <cs…

【Vue】路由的基本使用

文章目錄 一、固定5個固定的步驟二、代碼示例三、兩個核心步驟四、完整代碼 vue-router插件作用 修改地址欄路徑時&#xff0c;切換顯示匹配的組件 說明 Vue 官方的一個路由插件&#xff0c;是一個第三方包 官網 https://v3.router.vuejs.org/zh/ VueRouter的使用&#xff0…

TCP/IP協議介紹——三次握手四次揮手

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;傳輸控制協議/網際協議&#xff09;是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP協議不僅僅指的是TCP 和IP兩個協議&#xff0c;而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議…

CSS學習|css三種導入方式、基本選擇器、層次選擇器、結構偽類選擇器、屬性選擇器、字體樣式、文本樣式

第一個css程序 css程序都是在style標簽中書寫 打開該網頁&#xff0c;可以看到h1標簽中的我是標題被渲染成了紅色 可以在同級目錄下創建一個css目錄&#xff0c;專門存放css文件&#xff0c;可以和html分開編寫 然后在html頁面中&#xff0c;利用link標簽以及css文件地址&…

大模型基架:Transformer如何做優化?

大模型的基礎模式是transformer&#xff0c;所以很多芯片都實現先專門的transformer引擎來加速模型訓練或者推理。本文將拆解Transformer的算子組成&#xff0c;展開具體的數據流分析&#xff0c;結合不同的芯片架構實現&#xff0c;分析如何做性能優化。 Transformer結構 tr…

go的反射和斷言

在go中對于一個變量&#xff0c;主要包含兩個信息變量類型&#xff08;type&#xff09;和變量值&#xff08;value&#xff09; 可以通過reflect包在運行的時候動態獲取變量信息&#xff0c;并能夠進行操作 對于Type可以通過reflect.TypeOf()獲取到變量的類型信息 reflect.Ty…

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用軟件工程的方法來單獨解決前端的開發流程中模塊化、組件化、規范化、自動化的問題,其主要目的為了提高效率和降低成本。 前后端分離&#xff08;前端代碼工程化獨立出來形成一個單獨的app&#xff09; 1.開發分離 2.部署分離 3.服務器分離…

信號(上)

本節目標&#xff1a; 1. 掌握Linux信號的基本概念 2. 掌握信號產生的一般方式 3. 理解信號遞達和阻塞的概念&#xff0c;原理。 4. 掌握信號捕捉的一般方式。 5. 重新了解可重入函數的概念。 6. 了解競態條件的情景和處理方式 7. 了解SIGCHLD信號&#xff0c; 重新編寫信號處理…

ChatGPT基本原理詳細解說

ChatGPT基本原理詳細解說 引言 在人工智能領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;一直是研究的熱點之一。隨著技術的發展&#xff0c;我們見證了從簡單的聊天機器人到復雜的語言模型的演變。其中&#xff0c;ChatGPT作為一項突破性技術&#xff0c;以其強大…

【Vue】自定義指令-v-loading指令的封裝

場景 實際開發過程中&#xff0c;發送請求需要時間&#xff0c;在請求的數據未回來時&#xff0c;頁面會處于空白狀態 > 用戶體驗不好 需求 封裝一個 v-loading 指令&#xff0c;實現加載中的效果 分析 本質 loading效果就是一個蒙層&#xff0c;蓋在了盒子上 數據請求…

從零開始精通Onvif之設備發現

設備發現的意義 在復雜的網絡環境中&#xff0c;如何快速而準確地識別網絡上的Onvif設備&#xff0c;對于攝像頭廠商、系統集成商、開發人員乃至最終用戶來說&#xff0c;都顯得至關重要。 首先&#xff0c;設備發現有效簡化了集成的復雜度。在沒有統一標準之前&#xff0c;每個…

2004NOIP普及組真題 2. 花生采摘

線上OJ&#xff1a; 【04NOIP普及組】花生采摘 核心思想&#xff1a; 1、本題為貪心即可。 2、因為本題嚴格限制了順序&#xff0c;所以先把每個節點的花生數量按降序排序。然后逐一判斷下一個花生是否需要去采摘即可 3、每一次采摘完&#xff0c;記錄耗時 t 以及采集的花…

力扣第417題測試程序

題目描述&#xff1a; 有一個 m n 的矩形島嶼&#xff0c;與 太平洋 和 大西洋 相鄰。 “太平洋” 處于大陸的左邊界和上邊界&#xff0c;而 “大西洋” 處于大陸的右邊界和下邊界。 這個島被分割成一個由若干方形單元格組成的網格。給定一個 m x n 的整數矩陣 heights &#…

基于web的垃圾分類回收系統的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;管理員管理&#xff0c;用戶管理&#xff0c;公告管理&#xff0c;運輸管理&#xff0c;基礎數據管理 用戶賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;運輸管理&#xff0c;公告…

pyqt QlineEdit內部增加按鈕方法

pyqt QlineEdit內部增加按鈕方法 def addButton(self,lineEdit):btn QtWidgets.QPushButton("")icon1 QtGui.QIcon()icon1.addPixmap(QtGui.QPixmap(":/image/images/th.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)btn.setIcon(icon1)btn.setStyleShe…

全光譜led燈的危害有哪些?曝光低質量全光譜led燈產生的四大風險

眼睛是人類獲取信息最重要的感官器官之一&#xff0c;而近視則會導致視力模糊&#xff0c;進而影響學習效果和生活品質。因此&#xff0c;如何保護眼睛&#xff0c;尤其是在學習和使用電子設備時&#xff0c;成為了一個迫切需要解決的問題。然而在護眼領域上&#xff0c;護眼臺…