Python 全棧開發:python迭代器,生成器

来源:https://www.cnblogs.com/fixdq/archive/2018/03/30/8678376.html
-Advertisement-
Play Games

迭代器 一、什麼是迭代器 二、為何要有迭代器,什麼是可迭代對象,什麼是迭代器對象 三、迭代器對象的使用 四、for迴圈 五、迭代器的優缺點 優點:1.提供一種統一的,不依賴於索引的迭代方式 2.懶性計算,每次只有一條數據,節省記憶體 缺點:1.無法獲取長度(只有在迭代完畢才能知道有多少值) 2.一次性 ...


迭代器

一、什麼是迭代器

#迭代器即迭代的工具,那什麼是迭代呢?
#迭代是一個重覆的過程,每次重覆即一次迭代,並且每次迭代的結果都是下一次迭代的初始值
while True: #只是單純地重覆,因而不是迭代
    print('===>') 
    
l=[1,2,3]
count=0
while count < len(l): #迭代
    print(l[count])
    count+=1

二、為何要有迭代器,什麼是可迭代對象,什麼是迭代器對象

#1、為何要有迭代器?
對於序列類型:字元串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。
但對於字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器
#2、什麼是可迭代對象? 可迭代對象指的是內置有__iter__方法的對象,即obj.__iter__,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ #3、什麼是迭代器對象? 可迭代對象執行obj.__iter__()得到的結果就是迭代器對象 而迭代器對象指的是即內置有__iter__又內置有__next__方法的對象 文件類型是迭代器對象 open('a.txt').__iter__() open('a.txt').__next__() #4、註意: 迭代器對象一定是可迭代對象,而可迭代對象不一定是迭代器對象

三、迭代器對象的使用

dic={'a':1,'b':2,'c':3}
iter_dic=dic.__iter__() #得到迭代器對象,迭代器對象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
iter_dic.__iter__() is iter_dic #True

print(iter_dic.__next__()) #等同於next(iter_dic)
print(iter_dic.__next__()) #等同於next(iter_dic)
print(iter_dic.__next__()) #等同於next(iter_dic)
# print(iter_dic.__next__()) #拋出異常StopIteration,或者說結束標誌

#有了迭代器,我們就可以不依賴索引迭代取值了
iter_dic=dic.__iter__()
while 1:
    try:
        k=next(iter_dic)
        print(dic[k])
    except StopIteration:
        break
        
#這麼寫太醜陋了,需要我們自己捕捉異常,控制next,python這麼牛逼,能不能幫我解決呢?能,請看for迴圈

四、for迴圈

#基於for迴圈,我們可以完全不再依賴索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:
    print(dic[k])

#for迴圈的工作原理
#1:執行in後對象的dic.__iter__()方法,得到一個迭代器對象iter_dic
#2: 執行next(iter_dic),將得到的值賦值給k,然後執行迴圈體代碼
#3: 重覆過程2,直到捕捉到異常StopIteration,結束迴圈

五、迭代器的優缺點

優點:1.提供一種統一的,不依賴於索引的迭代方式

   2.懶性計算,每次只有一條數據,節省記憶體

缺點:1.無法獲取長度(只有在迭代完畢才能知道有多少值)

   2.一次性的,順序移動,無法後退

生成器

一、什麼是生成器

函數內包含yield的關鍵字,在調用函數時不會執行內部代碼,得到的函數返回值就是一個生成器對象

def chicken():
    print('=====>first')
    yield 1
    print('=====>sencond')
    yield 2
    print('=====>third')
    yield 3


obj=chicken()
print(obj) #<generator object func at 0x > 生成器對象

二、生成器就是迭代器

生成器本質就是迭代器,也就是說生成器的玩法其實就是迭代器的玩法

obj.__iter__
obj.__next__
#2、所以生成器就是迭代器,因此可以這麼取值
res=next(obj)
print(res)

模仿range() 功能

def my_range(start,stop,step=1):
    while start < stop:
        yield start 
        start+=step 
for item in my_range(1,10,2):
    print(item)

# 結果 :1,3,5,7,9

三、總結yield

#1、為我們提供了一種自定義迭代器的方式,
#    可以在函數內用yield關鍵字,調用函數拿到的結果就是一個生成器,生成器就是迭代器
#2、yield可以像return一樣用於返回值,區別是return只能返回一次值,而yield可返回多次
#    因為yield可以保存函數執行的狀態

 


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

-Advertisement-
Play Games
更多相關文章
  • Idea 作為一個每天有一半時間都在電腦旁的人,無時無刻不在敲擊著鍵盤,點擊著滑鼠。有一天,我突然很想知道在一天的時間內,在我輕盈的指法下麵,鍵盤被我狂敲了多少下,滑鼠又被我點擊了多少次。甚至更具體一些,鍵盤上哪些鍵挨的敲擊次數更多呢?想想也覺得挺有意思的。 <! more Learing 有了想法 ...
  • 1,大小寫翻轉 2,從一串字元串中,提取純數字組合 等價於: 3,統計字元的出現次數,以字元為鍵,大小寫視為相同字元 4,字元串去重,按原來的順序輸出 5,字元串反轉 6,去除字元串中的數字,然後排序,如果出現相同的字母,如aA,大寫字母排在小寫字母的前面 ...
  • Problem Description 在每年的校賽里,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎? Input 輸入包括多組數據。每組數據第一行是兩個 ...
  • 1,二進位方式 2,移位運算符( >> << ): 箭頭向左就是 向左移位 反正 箭頭向右 就是向右位移,移位針對的是二進位 如,十進位的1 > 對應的二進位是 0000 0001 1 << 1 : 向左移動1位 0000 0001 >0000 0010( 2 ) 1 << 2 : 向左移動2位 0 ...
  • 今天書接昨天的函數繼續去學習瞭解: 昨天說到函數的動態參數。 1、函數的【動態參數】 2、函數中【\ 和 的魔法運用】 在函數的調用(執行)時, 加一個可迭代對象(列表,元祖,字元串,字典等)代表解包, (列表元祖打散成列表中的每個元素,字元串打散成每個字元,字典打散成每個鍵) 並將元素一 一添加進 ...
  • 四則運算題目自動生成——基於控制台(java) "個人作業——四則運算題目生成程式(基於控制台)" 項目已提交到碼雲: "UMLProject" 需求分析: 關於輸入、根據提示依次輸入: 數字範圍(樣例:10) 題目數量(樣例:10) 生成的題目: 如果存在形如e1 ÷ e2的子表達式,那麼其結果應 ...
  • 上面這種使用@Value註入每個配置在實際項目中會顯得格外麻煩,因為我們的配置通常會是許多個,就要使用@Value註入很多次。Spring Boot提供了基於類型安全的配置方式,通過@ConfigurationProperties將properties屬性和一個Bean關聯,從而實現類型安全的配置。 ...
  • mvc:V視圖 Controller: <?php header("Content-Type: text/html; charset=UTF-8"); require'productModel.php'; $porduct = new Porduct(); $a =isset($_GET['a']) ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...