成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

可迭代對(duì)象和迭代器

Kaede / 3426人閱讀

摘要:對(duì)于迭代器來說,返回的是它自身,則是返回迭代器中的下一個(gè)值,如果沒有值了則拋出一個(gè)的異常。有一點(diǎn)繞,我們?cè)賮砝硪焕淼骱涂傻@兩個(gè)的差別一個(gè)迭代器一定是可迭代對(duì)象,因?yàn)樗欢ㄓ蟹椒ā6傻鷮?duì)象的方法通常會(huì)生成一個(gè)新的迭代器對(duì)象。

for 循環(huán) 是我們?cè)?Python 里非常常用的一個(gè)語法,但你有沒有思考過 for 循環(huán)是怎樣實(shí)現(xiàn)的?

如果你以前接觸過 C++,應(yīng)該會(huì)知道類似 for (int i = 0; i < 100; i++) 這樣的寫法,它定義了 循環(huán)的執(zhí)行條件 i < 100 以及 每次循環(huán)結(jié)束后執(zhí)行的語句 i++,而 for 本身只起到讓代碼重復(fù)執(zhí)行的作用,并沒有什么額外的功能。這在 Python 中其實(shí)更像是 while 循環(huán):


 i = 0
while i < 100:
    # 執(zhí)行循環(huán)代碼
    i += 1

但 Python 里的 for 循環(huán)卻不一樣。使用 for 時(shí),我們沒有額外指定結(jié)束條件,也不需要一個(gè)用來計(jì)數(shù)的數(shù)值,甚至可以通過一個(gè)字符串進(jìn)行循環(huán)。之所以可以這樣,是因?yàn)?Python 中的 迭代器(Iterator) 以及 可迭代對(duì)象(Iterable)

如果一個(gè)對(duì)象定義了 __iter____next__ 兩個(gè)方法, 它就是一個(gè)迭代器 。對(duì)于迭代器來說,__iter__ 返回的是它自身 self ,__next__ 則是 返回迭代器中的下一個(gè)值 ,如果沒有值了則拋出一個(gè) StopIteration 的異常。關(guān)于這點(diǎn),你可以想象成一個(gè)只進(jìn)不退的標(biāo)記位,每次調(diào)用 __next__,就會(huì)將標(biāo)記往后移一個(gè)元素并返回,直到結(jié)束。

有了迭代器的概念之后,如果一個(gè)對(duì)象定義了 __iter__ 和方法,返回一個(gè)迭代器對(duì)象,那么 它就是一個(gè)可迭代的對(duì)象 。

從表現(xiàn)上來說,一個(gè)對(duì)象 可迭代 ,那么它就可以被 for 循環(huán)使用。比如我們經(jīng)常用到的 list、dict、str 等類型,都是可迭代的,所以也就可以通過 for 循環(huán)進(jìn)行遍歷,或者更準(zhǔn)確的說:被迭代。

有一點(diǎn)繞,我們?cè)賮砝硪焕淼鳎↖terator)和可迭代(Iterable)這兩個(gè)的差別:

一個(gè) 迭代器一定是可迭代對(duì)象 ,因?yàn)樗欢ㄓ?__iter__ 方法。反過來則不成立。(事實(shí)上,Iterator 就是 Iterable 的子類)

迭代器的 __iter__ 方法 返回的是自身,并不產(chǎn)生新實(shí)例 。而可迭代對(duì)象的 __iter__ 方法通常會(huì)生成一個(gè)新的迭代器對(duì)象。

__iter__、__next__ 分別對(duì)應(yīng)于 Python 的內(nèi)置函數(shù) iter()next():比如 iter(aList) 就相當(dāng)于 aList.__iter__()

所以關(guān)于上述兩點(diǎn),我們可以有以下的例子來驗(yàn)證:

迭代器和可迭代之間的繼承關(guān)系。

__iter__ 方法返回值的區(qū)別。id 相同代表是同一個(gè)實(shí)例。

明白了上述的概念之后,for 循環(huán)的實(shí)現(xiàn)就好理解了:

首先 for 循環(huán)會(huì)調(diào)用可迭代對(duì)象的 __iter__ 方法,獲取相應(yīng)的迭代器

每次循環(huán),將迭代器的 __next__ 方法的返回值賦值給循環(huán)變量

直到捕獲迭代器拋出的 StopIteration 異常,循環(huán)結(jié)束

再來看個(gè)例子:

思考題: 想一想為什么迭代器 aListIter 被 for 循環(huán)迭代第二次的時(shí)候就沒有輸出了?

既然 __next__ 方法可以自己定義,我們也可以自己實(shí)現(xiàn)一個(gè)迭代器。比如要 輸出一個(gè)斐波那契數(shù)列 (每一位數(shù)值都是前兩位數(shù)值之和,原題回復(fù)關(guān)鍵字 906 ),通常的做法是循環(huán),“高級(jí)”一點(diǎn)的做法是遞歸。但我們也可以直接寫一個(gè)斐波那契迭代器:


# 定義迭代器
class Fibonacci():
    def __init__(self):
        self.a = 0
        self.b = 1
    def __iter__(self):
        return self
    def __next__(self):
        # 結(jié)束條件
        if self.b > 100:
            raise StopIteration
        # 更新一次數(shù)值
        self.a, self.b = self.b, self.a + self.b
        return self.a
# 創(chuàng)建迭代器
fib = Fibonacci()
# 進(jìn)行迭代
for f in fib:
    print(f, end=" ")

輸出:


1 1 2 3 5 8 13 21 34 55 89

這個(gè)例子中,我們并沒有保存一個(gè)序列,只是定義了一種規(guī)則,就也可以被迭代。

使用迭代器的好處在于:它是一種 延遲操作 ,即當(dāng)需要用到的時(shí)候才去產(chǎn)生結(jié)果。比如對(duì)于一個(gè)序列來說,如果我們要遍歷它,并不需要再一開始就把所有元素都生成好,而是只需要知道每個(gè)元素的下一個(gè)元素是什么就可以了。這樣可以節(jié)省很多空間,尤其對(duì)于數(shù)量很大的集合來說。

如果你不懂迭代器的概念,并不影響在代碼中使用 for 循環(huán)。但了解之后,你會(huì)對(duì)代碼理解得更透徹,同時(shí)這也是為我們后面要講到的 生成器 做鋪墊。

════

其他文章及回答:

如何自學(xué)Python | 新手引導(dǎo) | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計(jì)算機(jī)視覺 | 字符播放器 | 一圖學(xué)Python

歡迎搜索及關(guān)注公眾號(hào): Crossin的編程教室

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/43200.html

相關(guān)文章

  • Python:range 對(duì)象并不是迭代

    摘要:簡(jiǎn)評(píng)迭代器是惰性可迭代對(duì)象,函數(shù)在中是一個(gè)惰性的可迭代對(duì)象,那么是不是迭代器呢為什么。如果你不能將某些東西傳遞給函數(shù),那么它不是一個(gè)迭代器。的對(duì)象不是迭代器。 簡(jiǎn)評(píng):迭代器(iterator)是惰性可迭代對(duì)象(lazy iterable),range 函數(shù)在 Python 3 中是一個(gè)惰性的可迭代對(duì)象,那么 range 是不是迭代器呢?為什么。 TLNR:Python 3 中的 ran...

    draveness 評(píng)論0 收藏0
  • 從forEach到迭代

    摘要:本文從使用對(duì)數(shù)組進(jìn)行遍歷開始說起,粗略對(duì)比使用進(jìn)行遍歷的差異,并由此引入中可迭代對(duì)象迭代器的概念,并對(duì)其進(jìn)行粗略介紹。說到這里,就繼續(xù)說一下迭代器關(guān)閉的情況了。確實(shí),符合可迭代協(xié)議和迭代器協(xié)議的。 本文從使用 forEach 對(duì)數(shù)組進(jìn)行遍歷開始說起,粗略對(duì)比使用 forEach , for...in , for...of 進(jìn)行遍歷的差異,并由此引入 ES6 中 可迭代對(duì)象/迭代器 的概...

    rockswang 評(píng)論0 收藏0
  • Python中的迭代對(duì)象迭代生成

    摘要:本文重點(diǎn)掌握可迭代的對(duì)象的定義掌握可迭代對(duì)象迭代器與生成器之間的關(guān)系和異同熟悉標(biāo)準(zhǔn)庫中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對(duì)象。若想再次迭代須重建迭代器。迭代器檢查方式調(diào)用,。區(qū)別可迭代的對(duì)象不是迭代器。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握可迭代的對(duì)象的...

    starsfun 評(píng)論0 收藏0
  • 【ES6】迭代迭代對(duì)象

    摘要:通過生成器創(chuàng)建的迭代器也是可迭代對(duì)象,因?yàn)樯善髂J(rèn)會(huì)為屬性賦值。我們可以用來訪問對(duì)象的默認(rèn)迭代器,例如對(duì)于一個(gè)數(shù)組獲得了數(shù)組這個(gè)可迭代對(duì)象的默認(rèn)迭代器,并操作它遍歷了數(shù)組中的元素。 ES6 新的數(shù)組方法、集合、for-of 循環(huán)、展開運(yùn)算符(...)甚至異步編程都依賴于迭代器(Iterator )實(shí)現(xiàn)。本文會(huì)詳解 ES6 的迭代器與生成器,并進(jìn)一步挖掘可迭代對(duì)象的內(nèi)部原理與使用方法 ...

    terasum 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<