迭代器:迭代的工具。迭代是更新換代,如你爺爺生了你爹,你爹生了你,迭代也可以說成是重覆,並且但每一次的重覆都是基於上一次的結果來的。如電腦中的迭代開發,就是基於軟體的上一個版本更新。以下代碼就不是迭代,它只是單純的重覆 while True: print('*'*10) 一、可迭代對象 pytho ...
迭代器:迭代的工具。迭代是更新換代,如你爺爺生了你爹,你爹生了你,迭代也可以說成是重覆,並且但每一次的重覆都是基於上一次的結果來的。如電腦中的迭代開發,就是基於軟體的上一個版本更新。以下代碼就不是迭代,它只是單純的重覆
while True:
print('*'*10)
一、可迭代對象
python中一切皆對象,如
x = 1
name = 'nick'
lis = [1, 2]
tup = (1, 2)
dic = {'name': 'nick'}
s1 = {'a', 'b'}
def func():
pass
f = open('49w.txt', 'w', encoding='utf-8)
對於這一切的對象中,但凡有__iter__方法的對象,都是可迭代對象。
# x = 1.__iter__ # SyntaxError: invalid syntax
# 以下都是可迭代的對象
name = 'nick'.__iter__
lis = [1, 2].__iter__
tup = (1, 2).__iter__
dic = {'name': 'nick'}.__iter__
s1 = {'a', 'b'}.__iter__
f = open('49w.txt', 'w', encoding='utf-8')
f.__iter__
f.close()
總結
可迭代的對象:Python內置str、list、tuple、dict、set、file都是可迭代對象。
特點:
內置有__iter__方法的都叫可迭代的對象。
二、迭代器對象
只有字元串和列表都是依賴索引取值的,而其他的可迭代對象都是無法依賴索引取值的。因此我們得找到一個方法能讓其他的可迭代對象不依賴索引取值。
在找到該方法前,首先我們給出迭代器對象的概念:可迭代的對象執行__iter__方法得到的返回值。並且可迭代對象會有一個__next__方法。
- 不依賴索引的數據類型迭代取值
dic = {'a': 1, 'b': 2, 'c': 3}
iter_dic = dic.__iter__()
print(iter_dic.__next__())
print(iter_dic.__next__())
print(iter_dic.__next__())
# print(iter_dic.__next__()) # StopIteration:
輸出
a
b
c
- 依賴索引的數據類型迭代取值
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:
輸出
1
2
3
上述的方法是非常繁瑣的,我們可以使用while迴圈精簡下。
其中使用的try...except...為異常處理模塊,以後會詳細講解。
s = 'hello'
iter_s = s.__iter__()
#學習中遇到問題沒人解答?小編創建了一個Python學習交流群:489111204
while True:
try:
print(iter_s.__next__())
except StopIteration:
break
輸出
h
e
l
l
o
總結
迭代器對象:執行可迭代對象的__iter__方法,拿到的返回值就是迭代器對象。
特點:
- 內置__next__方法,執行該方法會拿到迭代器對象中的一個值
- 內置有__iter__方法,執行該方法會拿到迭代器本身
- 文件本身就是迭代器對象。
缺點:
- 取值麻煩,只能一個一個取,並且只能往後取,值取了就沒了
- 無法使用len()方法獲取長度
三、for迴圈原理
for迴圈稱為迭代器迴圈,in後必須是可迭代的對象。
lis = [1, 2, 3]
for i in lis:
print(i)
輸出
1
2
3
因為迭代器使用__iter__後還是迭代器本身,因此for迴圈不用考慮in後的對象是可迭代對象還是迭代器對象。
由於對可迭代對象使用__iter__方法後變成一個迭代器對象,這個迭代器對象只是占用了一小塊記憶體空間,他只有使用__next__後才會吐出一個一個值。如lis = [1,2,3,4,5,...]相當於一個一個雞蛋,而lis = [1,2,3,4,5,...].__iter__相當於一隻老母雞,如果你需要蛋,只需要__next__即可。
print(range(10)) # range(0, 10)