日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python生成器与迭代器的区别】

發(fā)布時間:2023/12/10 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python生成器与迭代器的区别】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

一、迭代

二、迭代器

1)創(chuàng)建迭代器——兩種方法

iter()方法

利用()和range結合使用

2)具體案例

3、生成器

4、二者的異同

1)、共同點

2)、不同點

a、語法上

b、用法上


一、迭代

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

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

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

二、迭代器

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

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

1)創(chuàng)建迭代器——兩種方法

iter()方法

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

創(chuàng)建迭代器
<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__()方法則是根據(jù)當前元素的值和設定的運算函數(shù)計算得到下一個函數(shù)fib = self.aif fib > self.max:raise StopIterationself.a, self.b = self.b, self.a + self.breturn fib# 定義一個main函數(shù),循環(huán)遍歷每一個菲波那切數(shù) def main1():# 20以內的數(shù)fib = Fib(20)for i in fib: #print(i)# 定義一個main2函數(shù),循環(huán)遍歷每一個菲波那切數(shù) def main2():# 20以內的數(shù)fib = Fib(20)try:print(next(fib))except:print("所有元素迭代完畢!!!")# 測試 if __name__ == '__main__':print("---------------------------------for 遍歷迭代器所有元素值-------------------------")main1()print("---------------------------------next方法 遍歷迭代器所有元素值-------------------------")main1()

解釋說明:

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

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

總結一句話就是:

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

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

3、生成器

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

# 菲波那切數(shù)列 def Fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return '親!沒有數(shù)據(jù)了...'# 調用方法,生成出10個數(shù)來 f = Fib(10) # 使用一個循環(huán)捕獲最后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
生成器最后的返回值是: 親!沒有數(shù)據(jù)了...

4、二者的異同

1)、共同點

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

2)、不同點

a、語法上

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

b、用法上

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

總結

以上是生活随笔為你收集整理的【Python生成器与迭代器的区别】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。