中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

搞懂python中的可迭代對象和迭代器對象(即迭代器)

發布時間:2020-10-07 12:28:59 來源:網絡 閱讀:365 作者:wx5a4c600866558 欄目:編程語言
可迭代的對象和迭代器解惑:

可迭代的對象:常見的可以被for循環迭代的一些數據類型都是可迭代的對象,如列表,元組,字典,集合,字符串,生成器,range函數生成的數列等,從廣泛的意義
上來說,這些對象都有一個內置的iter方法,且該方法可以返回一個迭代器對象,當用iter(可迭代對象)調用這個對象時,會返回一個迭代器對象(屬于Iterator類)

for語句的原理就是先用iter函數獲取可迭代對象的迭代器,然后調用next函數,此函數自動調用迭代器對象的next方法,每次遍歷都返回相應的值,如果沒有返回值了,就會拋出StopIter異常for語句自動捕獲異常并處理

迭代器:

在Python3中,實現了next方法和方法iter方法,并且這個iter這個方法返回了值的對象,就叫做迭代器或者迭代器對象。
判斷可迭代對象和迭代器,從collections導入Iterable,Iterator,用isinstance判斷
根據以上的介紹,我們可以按照這個思路實現自定義的迭代器

模擬for語句底層的原理:
寫兩個類分別重寫iter方法和next方法

#迭代器對象類

class MyRangeIterator(object):
    def __init__(self, start, end):
        self.index = start
        self.end = end

    def __next__(self):
        if self.index < self.end:
            temp = self.index
            self.index += 1
            return temp
        else:
            raise StopIteration()

#可迭代對象類

class MyRangeIterable(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        # 該方法返回迭代器對象
        return MyRangeIterator(self.start, self.end)

#1.直接采用for遍歷可迭代對象:

for i in MyRangeIterable(1, 10):
    print(i)

#2.for底層的原理,for到底干了哪些事情:
#第一步,iter函數獲取迭代器對象:

ret_iterator = iter(MyRangeIterable(1,10))
while True:
    try:
        x = next(ret_iterator) #或者ret_iterator.__next__,實際iter函數和next函數都會反射去執行對象的__next__和__iter__方法,道理一樣
        print(x)
    #如果迭代器沒有返回值了就拋出異常,退出死循環
    except StopIteration:
        break
有的時候,我們會將iter方法和next方法寫到一類里,這時類創建的對象有兩個身份,既是可迭代對象,又是迭代器對象,和上面分開實現有稍微的區別,比如對文件讀寫時,我們打開一個文件產生的對象就是屬于可迭代對象,也屬于迭代器對象,可以通過dir查看到,它既有iter方法,也有next方法,而列表,元組則有點不一樣,他們是可迭代對象,可以通過dir查看到它有iter方法,但沒有next方法,所以還不是一個迭代器,需要通過iter函數調用對象,然后返回的才是可迭代器對象
在一個類中實現iter和next方法,把上面MyTRangeIterator next的代碼挪到下面MyRangeIterable中,MyRangeIterable中返回自身就可以了
print('----第二種實現迭代器的類---')
class MyRangeIterable(object):
    def __init__(self, start, end):
        # self.start = start
        self.end = end
        self.index = start

    def __iter__(self):
        # 返回對象本身作為迭代器對象
        return self

    def __next__(self):
        if self.index < self.end:
            temp = self.index
            self.index += 1
            return temp
        else:
            raise StopIteration()

my_range = MyRangeIterable(1,20)
for i in my_range:
    print(i)
以上就是在一個類中實現的迭代器,它既是一個可迭代對象,也是一個迭代器對象,但是有個缺點,這個類創建出來的對象只能被遍歷一輪,因為在最后index變量的值已經到底了,你再遍歷這個對象是沒有值的;但是分開實現的迭代器就沒有這個問題,因為每次都進行了初始化
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莱芜市| 景谷| 福建省| 额敏县| 威远县| 德化县| 成武县| 城口县| 获嘉县| 北海市| 东宁县| 丰原市| 广宁县| 闽侯县| 平江县| 休宁县| 志丹县| 襄垣县| 长寿区| 龙里县| 瓦房店市| 福泉市| 河西区| 唐河县| 仁布县| 托克托县| 缙云县| 丹江口市| 若羌县| 兴国县| 荥阳市| 利津县| 孟州市| 惠安县| 新民市| 交口县| 句容市| 桑植县| 军事| 清水县| 华容县|