【Python生成器與迭代器的區別】

目錄

一、迭代

二、迭代器

1)創建迭代器——兩種方法

iter()方法

利用()和range結合使用

2)具體案例

3、生成器

4、二者的異同

1)、共同點

2)、不同點

a、語法上

b、用法上


一、迭代

首先理解一下迭代,迭代簡單地理解就是通過循環的方式遍歷一個多元素容器,這個容器可以是列表可以是元組等序列數據類型。迭代遍歷容器每一個元素,對每一個元素進行操作,比如打印。

# 1、普通迭代
print("--------------------------普通迭代--------------------------")
for i in [1, 2, 3, 4, 5]:print(i)

--------------------------普通迭代--------------------------
1
2
3
4
5

二、迭代器

迭代器其實就是將一個特殊的類實例化后得到的類對象,這個特殊的類特殊之處就在于一定含有兩個方法分別是__iter__()和__next__()方法。__iter__()方法是返回類對象自身,__next__()方法則是根據函數和上一個元素計算出下一個元素值并且通過return的方法返回值

首先__iter__()方法只會調用一次,通過iter()方法得到函數的迭代器(其實就是先將所有的元素計算出來了,然后將),然后__next__()則會被調用n次,用于遍歷所有的元素,這個遍歷只能往前而不能向后

1)創建迭代器——兩種方法

iter()方法

print("創建迭代器")
l = [1,2,3,4]
print(iter(l))

創建迭代器
<list_iterator object at 0x00000288A3300C88>

利用()和range結合使用

2)具體案例

class Fib(object):def __init__(self, max):super(Fib, self).__init__()self.max = maxdef __iter__(self):self.a = 0self.b = 1# __iter__()方法返回自身return selfdef __next__(self): # __next__()方法則是根據當前元素的值和設定的運算函數計算得到下一個函數fib = self.aif fib > self.max:raise StopIterationself.a, self.b = self.b, self.a + self.breturn fib# 定義一個main函數,循環遍歷每一個菲波那切數
def main1():# 20以內的數fib = Fib(20)for i in fib: #print(i)# 定義一個main2函數,循環遍歷每一個菲波那切數
def main2():# 20以內的數fib = Fib(20)try:print(next(fib))except:print("所有元素迭代完畢!!!")# 測試
if __name__ == '__main__':print("---------------------------------for 遍歷迭代器所有元素值-------------------------")main1()print("---------------------------------next方法 遍歷迭代器所有元素值-------------------------")main1()

解釋說明:

在本類的實現中,定義了一個_iter_(self)方法,這個方法是在for循環遍歷時被iter()調用,返回一個迭代器。因為在遍歷的時候,是直接調用的python內置函數iter() ,由iter()通過調用_iter_(self)獲得對象的迭代器。有了迭代器,就可以逐個遍歷元素了。而逐個遍歷的時候,也是使用內置的next()函數通過調用對象的_next_(self)方法對迭代器對象進行遍歷。所以要實現_iter_(self)_next_(self)這兩個方法。

而且因為實現了_next_(self)方法,所以在實現_iter_(self)的時候,直接返回self就可以。

總結一句話就是:

在循環遍歷自定義容器對象時,會使用python內置函數iter()調用遍歷對象的_iter_(self)獲得一個迭代器,之后再循環對這個迭代器使用next()調用迭代器對象的_next_(self)

---------------------------------for 遍歷迭代器所有元素值-------------------------
0
1
1
2
3
5
8
13
---------------------------------next方法 遍歷迭代器所有元素值-------------------------
0
1
1
2
3
5
8
13

3、生成器

生成器其實就是一個特殊的迭代器。主要的特點是通過yield來返回值,邊計算邊返回值,大大減少了內存。生成器可以理解為是一個函數

# 菲波那切數列
def Fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return '親!沒有數據了...'# 調用方法,生成出10個數來
f = Fib(10)
# 使用一個循環捕獲最后return 返回的值,保存在異常StopIteration的value中
while True:try:x = next(f)print("f:", x)except StopIteration as e:print("生成器最后的返回值是:", e.value)break

----------------------生成器---------------
f: 1
f: 1
f: 2
f: 3
f: 5
f: 8
f: 13
f: 21
f: 34
f: 55
生成器最后的返回值是: 親!沒有數據了...

4、二者的異同

1)、共同點

  • 生成器是一種特殊的迭代器

2)、不同點

a、語法上

  • 生成器是通過函數的形式中調用 yield 或()的形式創建的
  • 迭代器可以通過 iter() 內置函數創建

b、用法上

  • 生成器在調用next()函數或for循環中,所有過程被執行,且返回值,邊計算邊返回
  • 迭代器在調用next()函數或for循環中,所有值被返回,沒有其他過程或說動作。

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

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

相關文章

BZOJ4426 : [Nwerc2015]Better Productivity最大生產率

如果一個區間包含另一個區間&#xff0c;那么這兩個區間是否在一起的生產率是一樣的。 將所有這種包含了其他區間的區間放入數組$b$&#xff0c;其余的放入數組$c$&#xff0c;有多個相同的時候則從$b$移一個到$c$。 那么$c$里所有區間左端點遞增&#xff0c;右端點也遞增&…

[codevs1105][COJ0183][NOIP2005]過河

[codevs1105][COJ0183][NOIP2005]過河 試題描述 在河上有一座獨木橋&#xff0c;一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子&#xff0c;青蛙很討厭踩在這些石子上。由于橋的長度和青蛙一次跳過的距離都是正整數&#xff0c;我們可以把獨木橋上青蛙可能到達的…

ABB機器人套接口通信 機器人部分

ABB機器人套接口通信 機器人部分 文章機器人部分&#xff0c;描述如何運行機器人從機程序&#xff0c;使機器人根據上位機節點發送的命令&#xff0c;執行具體運動。 ABB機器人執行3個任務。這些任務都配置為SEMISTATIC(背景程序)的任務,第三任務是正常動作任務。下文描述如…

CRM項目總結

CRM項目總結 一&#xff1a;開發背景 在公司日益擴大的過程中&#xff0c;不可避免的會伴隨著更多問題出現。 對外 &#xff1a; 如何更好的管理客戶與公司的關系&#xff1f;如何更及時的了解客戶日益發展的需求變化&#xff1f;公司的產品是否真的符合客戶需求&#xff1f;以…

【面經——《速騰聚創科技有限公司——深度學習算法工程師》】

自我介紹 實習項目 1&#xff09;項目主要應用的領域&#xff1f; 2&#xff09;難點在哪&#xff1f;——機械臂吸盤大小和目標大小之間坐標的協調 3&#xff09;難點不在于算法&#xff0c;在于數據的處理和均衡性&#xff1f;對于數據均衡方面有什么理解&#xf…

js變量和數據類型

轉載于:https://www.cnblogs.com/songyinan/p/6181421.html

offline .net3.5

1.加載虛擬光驅 2.dism.exe /online /enable-feature /featurename:netfx3 /Source:D:\sources\sxs轉載于:https://www.cnblogs.com/BillLei/p/5294082.html

(九)模板方法模式詳解(包含與類加載器不得不說的故事)

作者&#xff1a;zuoxiaolong8810&#xff08;左瀟龍&#xff09;&#xff0c;轉載請注明出處&#xff0c;特別說明&#xff1a;本博文來自博主原博客&#xff0c;為保證新博客中博文的完整性&#xff0c;特復制到此留存&#xff0c;如需轉載請注明新博客地址即可。 模板方法模…

阿里云openapi接口使用,PHP,視頻直播

1.下載sdk放入項目文件夾中 核心就是aliyun-php-sdk-core&#xff0c;它的配置文件會自動加載相應的類 2.引入文件 include_once LIB_PATH . ORG/aliyun-openapi/aliyun-php-sdk-core/Config.php; 3.配置客戶端對象,需要Access Key ID,Access Key Secret $iClientProfile Defa…

【面經——《廣州敏視數碼科技有限公司》——圖像處理算法工程師-深度學習方向】

目錄 筆試 HR面 專業面——60多分鐘 主管面 反問&#xff1a; 筆試 8道題——簡答題 1道編程 蘋果、香蕉、梨、菠蘿&#xff0c;彩色圖像如何進行分類&#xff1f;一輛帶車牌的汽車&#xff0c;圖像亮度整體呈現偏亮狀態&#xff0c;如何…

Android之網絡編程利用PHP操作MySql插入數據(四)

因為最近在更新我的項目&#xff0c;就想著把自己在項目中用到的一些的簡單的與網絡交互的方法總結一下&#xff0c;所以最近Android網絡編程方面的博文會比較多一些&#xff0c;我盡量以最簡單的方法給大家分享&#xff0c;讓大家明白易懂。如果有什么不對的地方&#xff0c;還…

RAPID 信號的互鎖和同步 WaitTestAndSet 和 TestAndSet

RAPID 信號的互鎖和同步 WaitTestAndSet 指令等待指定的持久型 BOOL 變量變成 FALSE.當變量值變為 FALSE, 該指令將設置變量為 TRUE 并繼續執行. 該持久型變量可被作為同步或者互斥時的一個 BOOL 信號量。 這個指令與 TestAndSet 有著同樣的基本功能。但是 WaitTestAnd…

【常用網址】——opencv等

opencv官網Releases - OpenCVhttps://opencv.org/releases/

(五):C++分布式實時應用框架——微服務架構的演進

C分布式實時應用框架——微服務架構的演進 技術交流合作QQ群&#xff1a;436466587 歡迎討論交流 上一篇&#xff1a;(四)&#xff1a;C分布式實時應用框架——狀態中心模塊 版權聲明:本文版權及所用技術歸屬smartguys團隊所有&#xff0c;對于抄襲&#xff0c;非經同意轉載等…

如何通過軟件項目開發來提高自身的實力。

在我們這個專業&#xff0c;大多數人都不會將軟件開發當作自己的事業&#xff0c;因為若要在這個行業上能夠立足&#xff0c;得需要一個好的基礎&#xff0c;但是由于這個東西并不是可以通過書本能夠徹底的理解和 掌握的&#xff0c;隨著時間的變化&#xff0c;我們身邊的科技也…

夢回JavaScript--數據類型之undefined

undefined類型只有一個值&#xff0c;即undefined。在使用var聲明變量但未對其加以初始化時&#xff0c;這個變量的值就是undefined&#xff1b; var mes; alert(mes undefined) //true如果變量沒有聲明就會出現錯誤 var mes; alert(mes) //undefined alert(a)//error 然而有一…

Robot Application Builder

軟件開發工具包 Robot Application Builder是安裝在PC機&#xff08;Windows 2000或Windows XP操作系統&#xff09;上的一種獨立開發工具&#xff0c;可用于創建運行于ABB FlexPendant示教器或PC機上的定制化操作界面。為此&#xff0c;該軟件包由以下兩部分組成&#xff1a;…

asp.net model 驗證和取出 ErrorMessage 信息

為什么80%的碼農都做不了架構師&#xff1f;>>> public class Users{public int Id { get; set; }public string Name { get; set; }[Required(ErrorMessage "郵箱不能為空")][EmailAddressAttribute(ErrorMessage "郵箱格式不正確")]public…

this

作者&#xff1a;李挺鏈接&#xff1a;https://www.zhihu.com/question/19636194/answer/123274198來源&#xff1a;知乎著作權歸作者所有&#xff0c;轉載請聯系作者獲得授權。關于 this 的描述&#xff0c;曾經在 stackoverflow 上看到了一篇回答寫的非常詳盡&#xff0c;下面…