049 迭代器

迭代器

  • 迭代器就至關因而更新換代的意思,重複的操做、基於上一次的結果獲得下一次的結果

1.可迭代對象

  • python中一切皆是對象
  • 對於全部的對象,只要是有.____iter___方法的對象,都是可迭代對象
  • python內置的str、list、tuple、dict、set、file都是可迭代對象。
x = 1 # 不可迭代對象

name = 'xichen'# 可迭代對象

lis = [1,2,3] # 可迭代對象

dic = {'a':1,'b':2} # 可迭代對象

se = {1,2,3,4} # 可迭代對象

tuple = (1,2,3) # 可迭代對象

f = open('test.txt') # 可迭代對象

def fun(): # 不可迭代對象
    pass

2.迭代器對象

  • 可迭代的對象執行__iter__方法獲得的返回值。而且可迭代對象會有一個__next__方法。
  • 只有字符串和列表是依賴索引取值的,而其餘的可迭代對象都是沒法依賴索引取值的。所以咱們就有了迭代器對象的方法能讓其餘的可迭代對象不依賴索引取值。
# 不依賴索引的數據類型迭代取值
dic = {'a': 1, 'b': 2, 'c': 3}
dic_iter = dic.__iter__()
print(dic_iter .__next__())
print(dic_iter .__next__())
print(dic_iter .__next__())
# print(dic_iter .__next__())  # StopIteration:
# 依賴索引的數據類型迭代取值
lis = [1, 2, 3]
iter_lis = lis.__iter__()
print(iter_lis.__next__())
print(iter_lis.__next__())
print(iter_lis.__next__())
# print(iter_lis.__next__())  # StopIteration:
s = 'nick'  # 可迭代對象,不屬於迭代器對象
s.__iter__()

lt = [1, 2, 3]  # 可迭代對象,不屬於迭代器對象

dic = {'a': 1, 'b': 2}  # 可迭代對象,不屬於迭代器對象

tup = (1,)  # 元組只有一個元素必須得加逗號# 可迭代對象,不屬於迭代器對象

se = {1, 2, 3}  # 可迭代對象,不屬於迭代器對象

f = open('time.py')  # 可迭代對象,迭代器對象
#只有文件是迭代器對象
  • 總結
    • 執行可迭代對象的__iter__方法,拿到的返回值就是迭代器對象。
    • 具備__iter__方法的對象就是可迭代對象,除了數字類型和函數都是可迭代對象
    • 具備__iter__和__next__方法的都是迭代器對象,只有文件
  • 特色
    • 內置__next__方法,執行該方法會拿到迭代器對象中的一個值
    • 內置有__iter__方法,執行該方法會拿到迭代器自己
    • 文件自己就是迭代器對象。
  • 缺點
    • 取值麻煩,只能一個一個取,而且只能日後取,值取了就沒了
    • 沒法使用len()方法獲取長度

3.for循環原理

  • for循環被稱爲迭代器循環,in後面的必須是可迭代的對象
  • 由於迭代器使用__iter__後仍是迭代器自己,所以for循環不用考慮in後的對象是可迭代對象仍是迭代器對象
lt = [1, 2, 3]
for i in lt:
    print(i)
    
# 結果
1
2
3
  • 1.把lt(可迭代對象/迭代器對象)用__iter__方法轉換成迭代器對象
  • 2.使用__next__取出迭代器裏的全部值
# 3.使用__next__方法取盡迭代器中的全部值,必定會報錯,經過異常捕捉退出while循環
s = 'hello'
iter_s = s.__iter__()

while True:
    try:
        print(iter_s.__next__())
    except StopIteration:
        break
相關文章
相關標籤/搜索