深入理解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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...