深入理解python迭代、可迭代對象、迭代器及生成器

来源:https://www.cnblogs.com/sheshouxin/archive/2019/02/26/10434946.html
-Advertisement-
Play Games

迭代 通常意義上的迭代是指:重覆執行一系列運算,從前面的量依次推出後面的量的過程,每一次迭代的結果,會作為下一次迭代的初始值。 在c、c++、java等編程語言中的for迴圈語句,就是一個迭代過程,例如: 這種for迴圈語句比較符合迭代的含義,for語句中給定了一個初始輸入 i=0 ,然後開始執行一 ...


迭代

通常意義上的迭代是指:重覆執行一系列運算,從前面的量依次推出後面的量的過程,每一次迭代的結果,會作為下一次迭代的初始值。

在c、c++、java等編程語言中的for迴圈語句,就是一個迭代過程,例如:

for(int i=0;i<100;i++)
{
   cout << i << endl;
}

這種for迴圈語句比較符合迭代的含義,for語句中給定了一個初始輸入 i=0 ,然後開始執行一個重覆推導變數 i 是否小於 100 ,如果小於就對 i 加1並執行迴圈體中代碼的過程,且每次執行後的結果將作為下一次推導的輸入值,這個過程就是迭代。

python中,也使用了 for 關鍵字來實現類似過程,具體形式為 for ... in ... ,當然迭代過程也可以通過while迴圈語句等來實現,但不在本文討論範疇,這裡不做說明。在python中通常使用 for ... in ... 的形式來遍歷一個list或tuple等對象,這種遍歷過程,通常稱為迭代(Iteration)。例如:

上圖中,通過for語句來遍歷列表L,實現語句塊的重覆執行過程。這裡之所以每次迭代時都讓num的值加3,是為了說明語句塊中對num進行修改後的值並不會帶入到下一次迭代過程,這裡應註意與C、C++、java等語言的for迴圈語句的區別。至於為什麼是這樣,可以查閱python語法中for語句的執行原理,這裡不再詳述。

可迭代對象與迭代器

可迭代對象:使用內置iter函數可以獲取迭代器的對象,稱為可迭代對象。通常指實現了能返回迭代器的__iter__方法或實現了__getitem__方法且其參數從0開始索引的對象。

迭代器:指實現了無參數的__next__方法的對象。__next__方法返回序列中的下一個元素;如果沒有元素了,則拋出StopIteration異常。通常情況下,迭代器也應該實現__iter__方法,迭代器的__iter__方法應該返回其自身(self),因為實現了__iter__方法,所以迭代器可迭代。

區別與聯繫:迭代器可以迭代,但可迭代對象不是迭代器。可迭代對象一定不能是自身的迭代器,即可迭代對象一定不能實現__next__方法;迭代器應該一直可以迭代,其__iter__方法應該返回自身。示例:

class IteratorObj:

    def __init__(self, max):
        self.a = 0
        self.b = 1
        self.max = max

    def __iter__(self):
        return self

    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > self.max:
            raise StopIteration()
        return self.a

class IterableObj:

    def __init__(self, max):
        self.max = max

    def __iter__(self):
        return IteratorObj(self.max)

python中for迴圈遍歷的本質就是調用遍歷對象的__iter__方法,得到一個迭代器,再調用迭代器的__next__方法依次獲取對象的值並自動捕獲StopIteration異常。

生成器

生成器是一種特殊的迭代器,可通過使用迭代器的方法使用生成器。

python定義生成器的方法有兩種:

生成器函數:使用普通函數的定義語法定義,但函數體內必須包含yield關鍵字,即包含yield語句的函數都被稱為生成器。生成器函數雖然看上去像函數,但與函數的行為截然不同。區別在於生成器函數不是使用return語句返回一個值,而是可以生成多個值,每次生成一個。每次使用yield生成一個值後,函數被中斷,在此處停止執行,再次被調用時,函數將從上一次停止的地方開始繼續執行。例如:

註意:當生成器因沒有可生產的值退出時,同樣會拋出StopIteration異常。

生成器表達式:類似於列表推導,只不過要將列表推導中的[]換成()。例如:

上圖中,當第6次調用next(g)時,因沒有值可生產而拋出了StopIteration異常。

以上。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • LieBrother原文 : "行為型模式:責任鏈模式" 十一大行為型模式之四:責任鏈模式。 簡介 姓名 :責任鏈模式 英文名 :Chain of Responsibility Pattern 價值觀 :責任歸我 個人介紹 : Avoid coupling the sender of a reque ...
  • 定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。 裝飾器模式是為已有功能添加更多功能的一種方式,就增加功能來說,裝飾器模式比通過生成子類更為靈活。該模式通過將裝飾的功能放在單獨的類中,並讓這些類包含了需要進行裝飾的 ...
  • 方法一:繼承 Thread 類,覆蓋方法 run(),我們在創建的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。 下麵是一個例子: 這種方法簡單明瞭,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程式必須繼承自 Applet 類),則 ...
  • 一、格式化拼接、format 1.字元串拼接 name = "Monica", age = 16 print("姓名"+name+“年齡”+age+".") 2.占位符 %s:string,%d:整數,%f:浮點 info1 = ‘’‘姓名:%s 年齡:%s’‘’%(name,age) print( ...
  • 題意 "題目鏈接" Sol 題解好神仙啊qwq。 一般看到這種考慮最大值的貢獻的題目不難想到單調數據結構 對於本題而言,我們可以預處理出每個位置左邊第一個比他大的位置$l_i$以及右邊第一個比他大的位置$r_i$ 那麼$(l_i, r_i)$會產生$p1$的貢獻 $[l_i + 1, i 1]$和$ ...
  • 這一篇博客,是關於反反爬蟲的,我會分享一些我遇到的反爬蟲的措施,並且會分享我自己的解決辦法。如果能對你有什麼幫助的話,麻煩點一下推薦啦。 一、UserAgent UserAgent中文名為用戶代理,它使得伺服器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本等信息。對於一些網站來說,它會 ...
  • 第89節: 中的反射技術 反射技術是動態的獲取指定的類,和動態的調用類中的內容(沒有類前就可以創建對象,將對象的動作完成,這就是動態的獲取指定的類)。 配置文件把具體實現的類名稱定義到配置文件中。 反射技術的作用可以提高程式的擴展性。 類 用於創建並返回此對象的一個副本 用於指示其他某個對象是否與這 ...
  • Spark RPC 框架對 Spark 來說是至關重要的,它在 Spark 中擔任中樞的作用。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...