迭代器:迭代的工具,迭代是更新換代,如你爺爺生了你爹,你爹生了你,迭代也可以說成是重復,并且但每一次的重復都是基于上一次的結果來的,如計算機中的迭代開發,就是基于軟體的上一個版本更新,以下代碼就不是迭代,它只是單純的重復
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544706.html
標籤:其他
下一篇:Java-模塊化
