0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python迭代器詳解

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-02-24 15:42 ? 次閱讀

python迭代器

1. 可迭代對象

可以利用 for 循環(huán)的對象,都叫可迭代對象。

列表、元組、字典、字符串等都是可迭代對象。

# 以列表為例
>>> alist = [0, 1, 2, 3, 4, 5]
>>> for i in alist:
...     print(i)
...
0
1
2
3
4
5

2. 是否可迭代?

對 Python 比較熟悉的朋友,肯定知道哪些數(shù)據(jù)類型是可迭代的,哪些是不可迭代的。

但是對新手來說,可能需要借助一些函數(shù)來判別,比如 Python 內(nèi)置的 collections.abc 模塊,這個模塊只有在 Python 中才有噢,在這個模塊中提供了一個 Iterable 類,可以用 isinstance 來判斷。

>>> from collections.abc import Iterable
>>>
>>> isinstance([0, 1, 2], Iterable) # 列表
True
>>> isinstance({"name": "張三"}, Iterable) # 字典
True
>>> isinstance((1,2,3), Iterable) # 元組
True
>>> isinstance("hello", Iterable) # 字符串
True

但是這種方法并不是百分百準(zhǔn)確(具體下面會說到),最準(zhǔn)確的方法,還是應(yīng)該使用 for 循環(huán)。

3. 可迭代協(xié)議

可迭代對象內(nèi)部是如何實現(xiàn)在你對其進行 for 循環(huán)時,可以一個一個元素的返回出來呢?

這就要談到迭代器協(xié)議。

第一種場景:如果一個對象內(nèi)部實現(xiàn)了 __iter__() 方法 ,并返回一個迭代器實例,那么該對象就是可迭代對象

class Array:
    mylist = [0,1,2]

    # 返回迭代器類的實例
    def __iter__(self):
        return iter(self.mylist)

# 得到可迭代對象
my_list = Array()
print(isinstance(my_list, Iterable)) # True

for i in my_list:
    print(i)

第二種場景:假設(shè)一個對象沒有實現(xiàn) __iter__() ,Python 解釋器 __getitem__() 方法獲取元素,如果可行,那么該對象也是一個可迭代對象。

from collections.abc import Iterable

class Array:
    mylist = [0,1,2]

    def __getitem__(self, item):
        return self.mylist[item]

# 得到一個可迭代對象
my_list = Array()
print(isinstance(my_list, Iterable)) # False

for i in my_list:
    print(i)

此時如果你使用 isinstance(my_list, Iterable) 去判斷是否是可迭代,就會返回 False,因為 isinstance 這種方法就是檢查對象是否有 __iter__ 方法。這也論證了使用 isinstance(my_list, Iterable) 去判斷是否可迭代是不準(zhǔn)確的。

4. 什么是迭代器

當(dāng)你對一個可迭代對象使用 iter 函數(shù)后,它會返回一個迭代器對象,對于迭代器對象,我們可以使用 next 函數(shù),去獲取元素,每執(zhí)行一次,獲取一次,等到全部獲取完畢,會拋出 StopIteration 提示無元素可取。

>>> alist = [0, 1, 2, 3]
>>> gen = iter(alist)
>>> gen

>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

5. 迭代器協(xié)議

對比可迭代對象,迭代器的內(nèi)部只是多了一個函數(shù)而已 – __next__()

正因為有了它,我們才可以用 next 來獲取元素。

迭代器,是在可迭代的基礎(chǔ)上實現(xiàn)的。要創(chuàng)建一個迭代器,我們首先,得有一個可迭代對象。 現(xiàn)在就來看看,如何創(chuàng)建一個可迭代對象,并以可迭代對象為基礎(chǔ)創(chuàng)建一個迭代器。

from collections.abc import Iterator

class Array:
    index = 0
    mylist = [0,1,2]

    # 返回該對象的迭代器類的實例
    # 因為自己就是迭代器,所以返回self
    def __iter__(self):
        return self

    # 當(dāng)無元素時,必要拋出 StopIteration
    def __next__(self):
        if self.index <= len(self.mylist)-1:
            value = self.mylist[self.index]
            self.index += 1
            return value
        raise StopIteration

my_iterator = iter(Array())
print(isinstance(my_iterator, Iterator)) # output: True
print(next(my_iterator))  # output: 0
print(next(my_iterator))  # output: 1
print(next(my_iterator))  # output: 2
print(next(my_iterator))  # StopIteration

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4758

    瀏覽量

    84293
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    4294
收藏 人收藏

    評論

    相關(guān)推薦

    HFSS不能使用迭代求解

    新手小白提問,如圖,設(shè)置的是迭代求解,運行時轉(zhuǎn)為直接求解導(dǎo)致內(nèi)存不夠,請大神解答為什么不能用迭代求解啊
    發(fā)表于 03-27 14:24

    函數(shù)發(fā)生的作用,概念要點是什么

    函數(shù)生成器是Python中非常強大的特性之一。它們允許我們以一種簡潔且高效的方式生成迭代,從而幫助我們更好地處理大量數(shù)據(jù)或者在特定條件下生成無限數(shù)據(jù)。在本文中,我們將探討函數(shù)生成器的作用及其關(guān)鍵
    的頭像 發(fā)表于 02-23 16:01 ?470次閱讀

    python中open函數(shù)的用法詳解

    python中open函數(shù)的用法詳解 Python中的open()函數(shù)用于打開文件。它接受文件名和模式作為參數(shù),并返回一個文件對象。文件對象可用于讀取、寫入和管理文件。 open()函數(shù)的基本語法
    的頭像 發(fā)表于 01-30 15:31 ?1731次閱讀

    查看python安裝路徑的方法

    Python是一種高級編程語言,常用于開發(fā)Web應(yīng)用、數(shù)據(jù)分析、人工智能等領(lǐng)域。在使用Python進行開發(fā)之前,我們需要先安裝Python解釋,并了解
    的頭像 發(fā)表于 11-29 14:54 ?1.1w次閱讀

    python軟件怎么運行代碼

    Python是一種高級編程語言,它被廣泛用于開發(fā)各種類型的應(yīng)用程序,從簡單的腳本到復(fù)雜的網(wǎng)絡(luò)應(yīng)用和機器學(xué)習(xí)模型。要運行Python代碼,您需要一個Python解釋,它可以將您的代碼翻
    的頭像 發(fā)表于 11-28 16:02 ?819次閱讀

    如何運行Python程序

    運行Python程序非常簡單。Python是一種解釋型語言,這意味著可以直接通過解釋來執(zhí)行代碼。下面我將詳細(xì)介紹如何運行Python程序。 一、安裝
    的頭像 發(fā)表于 11-24 09:31 ?1071次閱讀

    python怎么運行程序

    Python是一種廣泛使用的編程語言,它的簡易和可讀性使得它成為初學(xué)者和專業(yè)開發(fā)人員的首選。在運行Python程序之前,您需要安裝Python解釋,然后按照以下步驟進行操作。 步驟1
    的頭像 發(fā)表于 11-24 09:25 ?2429次閱讀

    python循環(huán)創(chuàng)建變量并賦值

    Python中如何使用循環(huán)創(chuàng)建變量并賦值,以及它的一些應(yīng)用場景。 首先,讓我們來了解一下Python中的循環(huán)。Python提供了兩種常用的循環(huán)結(jié)構(gòu):for循環(huán)和while循環(huán)。for循環(huán)適合用于已知循環(huán)次數(shù)的情況,它通過遍歷一個
    的頭像 發(fā)表于 11-23 14:51 ?1487次閱讀

    Python自帶的命令窗口

    Python自帶的命令窗口,也稱為Python交互式解釋,是Python編程語言的一個重要工具,它允許用戶在命令行界面中輸入和執(zhí)行Python
    的頭像 發(fā)表于 11-22 14:02 ?809次閱讀

    python循環(huán)里的輸出結(jié)果匯總

    循環(huán)是計算機編程中常用的一種控制結(jié)構(gòu),用于重復(fù)執(zhí)行一段代碼。Python提供了多種類型的循環(huán)結(jié)構(gòu),包括for循環(huán)和while循環(huán)。在這篇文章中,我們將詳細(xì)介紹Python循環(huán)中的輸出結(jié)果。 首先
    的頭像 發(fā)表于 11-22 09:59 ?1421次閱讀

    python牛頓迭代

    牛頓迭代法是一種數(shù)值計算方法,用于求解方程的數(shù)值近似解。它是以英國科學(xué)家艾薩克·牛頓的名字命名的,最初由牛頓在17世紀(jì)末提出。牛頓迭代法基于一個簡單的原理:一條曲線的切線近似代替這條曲線,在切線與x
    的頭像 發(fā)表于 11-21 15:06 ?876次閱讀

    Python yield的作用

    要理解yield的作用,你必須理解生成器是什么。在理解生成器之前,必須先理解迭代。 迭代 當(dāng)您創(chuàng)建一個列表時,你可以逐個讀取它的項。逐項讀取其項稱為
    的頭像 發(fā)表于 11-02 11:21 ?368次閱讀
    <b class='flag-5'>Python</b> yield的作用

    Python3.10.0的特性介紹

    Python3.10.0有幾個特性,還真是值得和大家講講。 1. 更友好的錯誤提示 Python 3.10以前,它是這樣提示的,你可能完全不知道哪里有問題,當(dāng)代碼過多。 print ( "Hello
    的頭像 發(fā)表于 10-31 10:43 ?412次閱讀
    <b class='flag-5'>Python</b>3.10.0的特性介紹

    zip():Python 中最好用的內(nèi)置類型之一

    zip() 是 Python 中最好用的內(nèi)置類型之一,它可以接收多個可迭代對象參數(shù),再返回一個迭代,可以把不同可迭代對象的元素組合起來。
    的頭像 發(fā)表于 10-30 14:21 ?3276次閱讀
    zip():<b class='flag-5'>Python</b> 中最好用的內(nèi)置類型之一

    Ruby 與 Python之間的差異

    中,for 循環(huán)服從于對象模型。 也就是說,在 Python 中,如果你想自定義迭代的過程,可以讓對象告訴解釋該如何作迭代: class Stuff :
    的頭像 發(fā)表于 10-30 11:50 ?553次閱讀