【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循環中,所有值被返回,沒有其他過程或說動作。
 
總結
以上是生活随笔為你收集整理的【Python生成器与迭代器的区别】的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 【旧文章搬运】无Device的驱动如何通
 - 下一篇: B-JUI文档、下载