日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:Python中可迭代對象、迭代器詳解

在python中,有這兩個概念容易讓人混淆。第一個是可迭代對象(Iterable),第二個是迭代器(Iterator),第三個是生成器(Generator),這里暫且不談生成器。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、網(wǎng)站空間、營銷軟件、網(wǎng)站建設(shè)、光山網(wǎng)站維護、網(wǎng)站推廣。

可迭代對象

列表、元組、字符串、字典等都是可迭代對象,可以使用for循環(huán)遍歷出所有元素的都可以稱為可迭代對象(Iterable)。在Python的內(nèi)置數(shù)據(jù)結(jié)構(gòu)中定義了Iterable這個類,在collections.abc模塊中,我們可以用這個來檢測是否為可迭代對象。

>>> from collections import Iterable
>>> a = [1,2,3]
>>> isinstance(a, Iterable)
>>> True
>>> b = 'abcd'
>>> isinstance(b, Iterable)
>>> True

這些數(shù)據(jù)結(jié)構(gòu)之所以能稱之為Iterable,是因為其內(nèi)部實現(xiàn)了__iter__()方法,從而可迭代。當(dāng)我們使用for循環(huán)時,解釋器會調(diào)用內(nèi)置的iter()函數(shù),調(diào)用前首先會檢查對象是否實現(xiàn)了__iter__()方法,如果有就調(diào)用它獲取一個迭代器(接下來會講)。加入沒有__iter__()方法,但是實現(xiàn)了__getitem__()方法,解釋器會創(chuàng)建一個迭代器并且按順序獲取元素。如果這兩個方法都沒有找到,就會拋出TypeError異常。下面我們自定義對象,分別實現(xiàn)這兩個方法(getitem(), iter())

class MyObj:
    def __init__(self, iterable):
        self._iterable = list(iterable)
    def __getitem__(self, item):
        return self._iterable[item]
obj = MyObj([1,2,3])
for i in obj:
    print(i)

如上所示,這里沒有實現(xiàn)__iter__方法,只實現(xiàn)了__getitem__方法,也使得Myobj稱為可迭代對象。

下面我們實現(xiàn)__iter__方法,這里使用了yield語法用來產(chǎn)出值(這里需要生成器的知識)

class MyObj:
    def __init__(self, iterable):
        self._iterable = list(iterable)
    def __iter__(self):
        index = 0
        while True:
            try:
                yield self._iterable[index]
            except IndexError:
                break
            index += 1
obj = MyObj([1,2,3])
for i in obj:
    print(i)

這里同樣讓對象稱為可迭代對象。

相關(guān)推薦:《Python視頻教程》

迭代器

迭代器是一個可以記住遍歷的位置的對象。

迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。

如上圖所示,迭代器(Iterator)繼承可迭代(Iterable),迭代器必須實現(xiàn)__iter__方法和__next__方法。其中__next__方法用于產(chǎn)出下一個元素。

由繼承圖可見,迭代器一定是可迭代對象,可迭代對象不一定是迭代器。

迭代器有兩個基本的方法:iter() 和 next()。

我們使用iter(iterable)即可把可迭代對象轉(zhuǎn)換成迭代器。

使用next(iterator)來獲取迭代器的下一個值。

>>> a = [3,4,5]
>>> a
>>> [3, 4, 5]
>>> iter(a)
>>> 
>>> iterator = iter(a)
>>> next(iterator)
>>> 3
>>> next(iterator)
>>> 4
>>> next(iterator)
>>> 5
>>> next(iterator)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

如上所示,因為對象實現(xiàn)了__next__方法,我們可以通過next(iterator)來獲取迭代器的下一個值,直到?jīng)]有值了,拋出StopIteration異常結(jié)束。

迭代器的背后

迭代器Iterator是一個抽象基類,它定義在_collections_abc.py中

Iterator源碼如下

class Iterator(Iterable):
    __slots__ = ()
    @abstractmethod
    def __next__(self):
        'Return the next item from the iterator. When exhausted, raise StopIteration'
        raise StopIteration
    def __iter__(self):
        return self
    @classmethod
    def __subclasshook__(cls, C):
        if cls is Iterator:
            return _check_methods(C, '__iter__', '__next__')
        return NotImplemented

可以看到,它實現(xiàn)了__subclasshook__方法,即不用顯式繼承Iterator,只需要實現(xiàn)__iter__和__next__方法即可稱為Iterator的虛擬子類。這里凸現(xiàn)了Python的鴨子類型,實現(xiàn)特定的“協(xié)議”即可擁有某種行為。

另外,它自己也定義了__iter__方法,當(dāng)我們使用iter(Iterator)時直接返回自己,不做任何處理。

iter()函數(shù)的兩個用法

官方文檔中給出了說明:

    iter(iterable) -> iterator
    iter(callable, sentinel) -> iterator
    
    Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.

第一個用法:iter(iterable) -> iterator (把可迭代對象轉(zhuǎn)換為迭代器)

第二個用法:iter(callable, sentinel) -> iterator (第一個參數(shù):任何可調(diào)用對象,可以是函數(shù),第二個是標(biāo)記值,當(dāng)可調(diào)用對象返回這個值時,迭代器拋出StopIteration異常,而不產(chǎn)出標(biāo)記值)

>>> from random import choice
>>> values = [1,2,3,4,5,6,7]
>>> def test_iter():
>>>     return choice(values)
>>> it = iter(test_iter, 2)
>>> it
>>> 
>>> for i in it:
>>>     print(i)
>>> 7
>>> 1
>>> 7
>>> 3
>>> 1

上面代碼的流程:test_iter函數(shù)從values列表中隨機挑選一個值并返回,調(diào)用iter(callable, sentinel)函數(shù),把sentinel標(biāo)記值設(shè)置為2,返回一個callable_iterator實例,遍歷這個特殊的迭代器,如果函數(shù)返回標(biāo)記值2,直接拋出異常退出程序。這就是iter函數(shù)的鮮為人知的另一個用法。


網(wǎng)頁標(biāo)題:創(chuàng)新互聯(lián)Python教程:Python中可迭代對象、迭代器詳解
轉(zhuǎn)載注明:http://www.5511xx.com/article/coopdce.html