最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的迭代器詳解

 更新時(shí)間:2023年08月23日 09:15:44   作者:郝同學(xué)的測開筆記  
這篇文章主要介紹迭代器,看完文章你可以了解到什么是可迭代對象、啥是迭代器、如何自定義迭代器、使用迭代器的優(yōu)勢,文中有詳細(xì)的代碼示例,需要的朋友可以參考下

迭代器

迭代(iterate)意味著重復(fù)多次,就像循環(huán)那樣。工作中我們一定使用for循環(huán)迭代過列表和字典,但實(shí)際上也可迭代其他對象:實(shí)現(xiàn)了方法__iter__的對象。方法__iter__返回一個(gè)迭代器,它是包含方法__next__的對象,而調(diào)用這個(gè)方法時(shí)可不提供任何參數(shù)。當(dāng)你調(diào)用方法__next__時(shí),迭代器應(yīng)返回其下一個(gè)值。如果迭代器沒有可供返回的值,應(yīng)引發(fā)StopIteration異常。你還可使用內(nèi)置的便利函數(shù)next。

__iter__

用于定義一個(gè)可迭代對象(iterable)。通過實(shí)現(xiàn) __iter__ 方法,我們可以使自定義的對象能夠被 for 循環(huán)等迭代器相關(guān)的操作使用。

python中哪些是可迭代對象呢?我們可以測試一下

def is_iterable(param):
 ? ?try:
 ? ? ? ?iter(param)
 ? ? ? ?return True
 ? ?except TypeError:
 ? ? ? ?return False
?
?
params = [
 ? ?1234,
 ? ?'1234',
 ?  [1, 2, 3, 4],
 ? ?set([1, 2, 3, 4]),
 ?  {1: 1, 2: 2, 3: 3, 4: 4},
 ?  (1, 2, 3, 4)
]
?
for param in params:
 ? ?print(f'{param} is iterable? {is_iterable(param)}')
'''
1234 is iterable? False
1234 is iterable? True
[1, 2, 3, 4] is iterable? True
{1, 2, 3, 4} is iterable? True
{1: 1, 2: 2, 3: 3, 4: 4} is iterable? True
(1, 2, 3, 4) is iterable? True
'''

可以看到列表、元組、字典、集合、字符串都是可迭代對象,查看源碼,發(fā)現(xiàn)他們都實(shí)現(xiàn)了__iter__方法

def __iter__(self, *args, **kwargs): # real signature unknown
 ? ?""" Implement iter(self). """
 ? ?pass
?

方法__iter__返回一個(gè)迭代器,它是包含方法__next__的對象,而調(diào)用這個(gè)方法時(shí)可不提供任何參數(shù)。當(dāng)你調(diào)用方法__next__時(shí),迭代器應(yīng)返回其下一個(gè)值。

實(shí)踐

示例一

迭代器實(shí)現(xiàn)斐波那契數(shù)列

class Fibs:
 ? ?def __init__(self):
 ? ? ? ?self.a = 0
 ? ? ? ?self.b = 1
?
 ? ?def __iter__(self):
 ? ? ? ?return FibIterator(self.a, self.b)
?
?
class FibIterator:
?
 ? ?def __init__(self, a, b):
 ? ? ? ?self.a = a
 ? ? ? ?self.b = b
?
 ? ?def __next__(self):
 ? ? ? ?self.a, self.b = self.b, self.a + self.b
 ? ? ? ?return self.a
?
 ? ?def __iter__(self):
 ? ? ? ?return self
?
?
fibs = Fibs()
for f in fibs:
 ? ?print(f)
 ? ?if f > 10:
 ? ? ? ?break
'''
1
1
2
3
5
8
13
'''

這段代碼,Fibs 類是一個(gè)可迭代對象,并且在 __iter__ 方法中返回一個(gè)迭代器對象 FibIterator(self.a, self.b)。

FibIterator 類是一個(gè)迭代器對象,它包含 __next____iter__ 方法。

FibIterator__init__ 方法中,初始化了兩個(gè)變量 self.aself.b 分別表示斐波那契數(shù)列中的前兩個(gè)元素。

__next__ 方法會根據(jù)迭代邏輯計(jì)算出下一個(gè)斐波那契數(shù),并將 self.aself.b 更新為下一次迭代所需的值。然后,它返回當(dāng)前的斐波那契數(shù)。

__iter__ 方法在這個(gè)示例中實(shí)現(xiàn)了迭代器對象的自引用,即返回自身,使得迭代器對象本身也可以被迭代。

當(dāng)你使用 for 循環(huán)迭代 fibs 對象時(shí),它會調(diào)用 fibs 對象的 __iter__ 方法獲取迭代器對象,然后重復(fù)調(diào)用迭代器對象的 __next__ 方法來獲取斐波那契數(shù)列中的下一個(gè)數(shù)。

示例二

使用自定義的迭代器類來生成一個(gè)遞增序列

class IncrementIterator:
 ? ?def __init__(self, start, step):
 ? ? ? ?self.current = start
 ? ? ? ?self.step = step
?
 ? ?def __iter__(self):
 ? ? ? ?return self
?
 ? ?def __next__(self):
 ? ? ? ?value = self.current
 ? ? ? ?self.current += self.step
 ? ? ? ?return value
?

在這個(gè)例子中,IncrementIterator 類表示一個(gè)遞增序列的迭代器。它接受兩個(gè)參數(shù) startstep,分別表示初始值和遞增步長。

__init__ 方法初始化了兩個(gè)實(shí)例變量 self.currentself.step,分別用于存儲當(dāng)前值和遞增步長。

__iter__ 方法返回迭代器對象本身,即 self。這樣可以使迭代器對象本身也是可迭代的。

__next__ 方法計(jì)算并返回當(dāng)前值,并將 self.current 增加 self.step,以準(zhǔn)備下一次迭代。

以下是如何使用 IncrementIterator 迭代器生成遞增序列的示例代碼:

iterator = IncrementIterator(0, 2)
for num in iterator:
 ? ?print(num)
 ? ?if num >= 10:
 ? ? ? ?break

這段代碼會生成一個(gè)從 0 開始,每次遞增 2 的遞增序列。在 for 循環(huán)中,迭代器對象 iterator 會自動(dòng)調(diào)用 __iter__ 方法獲取迭代器本身,并重復(fù)調(diào)用 __next__ 方法來獲取下一個(gè)遞增值。

迭代器創(chuàng)建序列

對迭代器和可迭代對象進(jìn)行迭代之外,還可將它們轉(zhuǎn)換為序列。比如下面這個(gè)例子

class TestIterator:
 ? ?value = 0
?
 ? ?def __next__(self):
 ? ? ? ?self.value += 1
 ? ? ? ?if self.value > 10: raise StopIteration
 ? ? ? ?return self.value
?
 ? ?def __iter__(self):
 ? ? ? ?return self
?
ti = TestIterator()
print(list(ti)) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

這段代碼使用list顯式地將迭代器轉(zhuǎn)換為列表。

iter函數(shù)

可迭代對象調(diào)用 iter() 函數(shù),可以得到一個(gè)迭代器。迭代器可以通過 next() 函數(shù)來得到下一個(gè)元素,從而支持遍歷。

l = [1,2,3,4]
it = iter(l)
print(next(it)) # 1
print(type(it)) # <class 'list_iterator'>

使用迭代器的意義

有人說為啥要用迭代器,我用列表也可以呀,為啥不用列表呢?因?yàn)樵诤芏嗲闆r下,你可能只想逐個(gè)地獲取值,而不是使用列表一次性獲取。這是因?yàn)槿绻泻芏嘀担斜砜赡苷加锰嗟膬?nèi)存。使用迭代器相對于直接使用列表的優(yōu)勢在于節(jié)省內(nèi)存和提高性能。下面是一個(gè)例子來說明這一點(diǎn):

我們需要生成一個(gè)非常大的數(shù)列,比如一個(gè)包含 1 到 1000000 的連續(xù)整數(shù)序列。如果我們使用列表來存儲這個(gè)數(shù)列,就需要將所有的數(shù)都存儲在內(nèi)存中,這會消耗大量的內(nèi)存空間。

my_list = list(range(1, 1000001))

然而,如果我們使用迭代器來生成這個(gè)數(shù)列,只需要在需要使用時(shí)逐個(gè)生成數(shù)字,而不需要一次性存儲全部數(shù)字。這節(jié)省了大量的內(nèi)存空間。

class MyIterator:
 ? ?def __init__(self, start, end):
 ? ? ? ?self.current = start
 ? ? ? ?self.end = end
?
 ? ?def __iter__(self):
 ? ? ? ?return self
?
 ? ?def __next__(self):
 ? ? ? ?if self.current > self.end:
 ? ? ? ? ? ?raise StopIteration
 ? ? ? ?else:
 ? ? ? ? ? ?value = self.current
 ? ? ? ? ? ?self.current += 1
 ? ? ? ? ? ?return value
?
my_iterator = MyIterator(1, 1000000)
?
for num in my_iterator:
 ? ?print(num)

過使用迭代器,我們避免了一次性將所有數(shù)字存儲在內(nèi)存中的需求,減少了內(nèi)存的占用。相比之下,使用列表則需要先生成并存儲所有數(shù)字,會占用大量的內(nèi)存。

此外,迭代器還具有惰性求值的特點(diǎn),即只在需要時(shí)才生成下一個(gè)元素。這種特性在處理大量數(shù)據(jù)時(shí)非常有用,可以減少不必要的計(jì)算和處理時(shí)間。

因此,使用迭代器可以節(jié)省內(nèi)存,并在處理大量數(shù)據(jù)時(shí)提高性能。它們可以逐個(gè)生成序列中的元素,而無需一次性將所有元素存儲在內(nèi)存中。

最后

通過上述例子,可以知道實(shí)現(xiàn)了方法__iter__的對象是可迭代的,而實(shí)現(xiàn)了方法__next__的對象是迭代器。

以上就是Python中的迭代器詳解的詳細(xì)內(nèi)容,更多關(guān)于Python迭代器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用pyproject.toml構(gòu)建現(xiàn)代化Python項(xiàng)目的詳細(xì)步驟

    使用pyproject.toml構(gòu)建現(xiàn)代化Python項(xiàng)目的詳細(xì)步驟

    如果你曾經(jīng)接觸過 Python 項(xiàng)目,可能對 setup.py、setup.cfg、requirements.txt 這些文件并不陌生,但隨著 Python 生態(tài)的發(fā)展,這種分散的配置方式逐漸暴露出諸多問題,pyproject.toml 的出現(xiàn)正是為了解決這些痛點(diǎn),本文詳細(xì)講解如何從零開始配置 pyproject.toml
    2026-05-05
  • 詳解Python靜態(tài)網(wǎng)頁爬取獲取高清壁紙

    詳解Python靜態(tài)網(wǎng)頁爬取獲取高清壁紙

    這篇文章主要介紹了Python爬取高清壁紙,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個(gè)刪除重復(fù)文件的小工具,核心代碼很簡單,希望對你有所幫助
    2022-07-07
  • python開發(fā)微信服務(wù)號消息推送示例

    python開發(fā)微信服務(wù)號消息推送示例

    這篇文章主要為大家介紹了python開發(fā)微信服務(wù)號消息推送示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Python實(shí)現(xiàn)定時(shí)任務(wù)

    Python實(shí)現(xiàn)定時(shí)任務(wù)

    本篇文章主要介紹了Python實(shí)現(xiàn)定時(shí)任務(wù),主要有5種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • 從基礎(chǔ)到高級詳解Python字符串I/O操作完全指南

    從基礎(chǔ)到高級詳解Python字符串I/O操作完全指南

    在現(xiàn)代Python開發(fā)中,字符串I/O操作是處理內(nèi)存數(shù)據(jù)流的關(guān)鍵技術(shù),本文將深入解析Python字符串I/O技術(shù)體系,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-09-09
  • 用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問題的示例

    用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問題的示例

    這篇文章主要介紹了用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問題的一個(gè)棋盤游戲的示例,動(dòng)態(tài)規(guī)劃常常適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問題,且耗時(shí)間往往遠(yuǎn)少于樸素解法,需要的朋友可以參考下
    2015-04-04
  • python 計(jì)算平均平方誤差(MSE)的實(shí)例

    python 計(jì)算平均平方誤差(MSE)的實(shí)例

    今天小編就為大家分享一篇python 計(jì)算平均平方誤差的實(shí)例 (MSE),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python中的sys模塊、random模塊和math模塊

    Python中的sys模塊、random模塊和math模塊

    這篇文章介紹了Python中的sys模塊、random模塊和math模塊,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Python異常處理之避免try-except濫用的3個(gè)核心原則

    Python異常處理之避免try-except濫用的3個(gè)核心原則

    在Python開發(fā)中,異常處理是保證程序健壯性的關(guān)鍵機(jī)制,本文結(jié)合真實(shí)案例與Python核心機(jī)制,提煉出避免異常濫用的三大原則,有需要的小伙伴可以了解下
    2025-09-09

最新評論

荔浦县| 皮山县| 尼勒克县| 高密市| 尤溪县| 蒲江县| 雷山县| 宁陵县| 磐安县| 余姚市| 湟源县| 麻江县| 望奎县| 迁西县| 高要市| 晋州市| 泉州市| 天柱县| 衡水市| 上饶县| 屏东市| 喀什市| 黄骅市| 奉新县| 那曲县| 五家渠市| 老河口市| 五家渠市| 馆陶县| 永济市| 新疆| 呼伦贝尔市| 湛江市| 吴川市| 郯城县| 仙桃市| 奈曼旗| 双江| 常宁市| 奉节县| 德兴市|