迭代器協議

'''
1、迭代器協議:1,對象必須提供一個next()方法
             2,執行該方法,要麼返回迭代中的下一項,要麼引發一個StopIteration異常,以終止跌倒
2、可迭代對象,    實現了迭代器協議的對象
3、for循環的本質就是遵循迭代器協議去訪問對象
4、字符串,列表,元組,字典,集合,文件這些均不限屬於可迭代對象,
    for循環之因此能遵循迭代器協議對其進行訪問,其實是調用了這些對象內的iter()方法,將這些對象變成了可迭代對象
    再經過next()方法·取值,直到取到stopiteration異常時終止迭代,中止循環

'''
# vocaloid_list=['miku','rin','ran','ruka']
# vocaloid=vocaloid_list.__iter__()
# print(vocaloid.__next__())      #輸出結果:miku
# print(vocaloid.__next__())      #輸出結果:rin
# print(vocaloid.__next__())      #輸出結果:ran
# print(vocaloid.__next__())      #輸出結果:ruka
# print(vocaloid.__next__())      #報告StopIteration異常

'''
內置函數中的next()函數與__next__()方法的效果是同樣的
        next(變量) 《--------》變量.__next__()
        
'''
# vocaloid_list=['miku','rin','ran','ruka']
# vocaloid=vocaloid_list.__iter__()
# print(vocaloid.__next__())      #輸出結果:miku
# print(next(vocaloid))           #輸出結果:rin
# print(vocaloid.__next__())      #輸出結果:ran
# print(vocaloid.__next__())      #輸出結果:ruka
# print(vocaloid.__next__())      #報告StopIteration異常

'''

對於有序序列:字符串,列表,元組等雖然能夠使用while如下標的方式遍歷,
但對於無序的字典集合文件等對象則沒法遍歷
for循環經過基於迭代器協議訪問對象,提供了一個統一的遍歷全部對象的方法

'''

'''
經過while模擬for循環的工做方式=
'''
def iteration_while(x):
    temp=x.__iter__()
    while True:
        # result=temp.__next__()
        # if result == 'StopIteration':
        #     print('監測到StopIteration異常,終止循環')
        #     # break
        # else:
        #     print(result)
        try:
            print(temp.__next__())
        except StopIteration:
            print('監測到StopIteration異常,迭代結束')
            break
vocaloid_list = ['miku', 'rin', 'ran', 'ruka']
iteration_while(vocaloid_list)
相關文章
相關標籤/搜索