''''
什么是迭代器?
迭代的工具
1.什么是迭代?
迭代是一個重復的過程,每一次重復都是基於上一次結果而進行的
while True:
print('hello world')
像上面做這種單純的重復並不是迭代
2.為什么要用迭代器?
找到一種不依賴索引的迭代取值方式
3.怎么用迭代器?
可迭代對象:在python在,但凡內置有__iter__方法的數據類型或者對象都是可迭代對象
執行可迭代對象__iter__方法得到的返回值就是一個迭代器對象
迭代器對象是內置有__next__方法的
迭代器對象也內置有__iter__方法:執行該方法得到任然是迭代器本身
dic = {"a":1,"b":2,"c":3}
res = dic.__iter__()
print(res)
res2 = res.__iter__()
print(res2)
# <dict_keyiterator object at 0x0000020A90BE9458>
# <dict_keyiterator object at 0x0000020A90BE9458>
迭代器對象一定是可迭代對象
可迭代的對象不一定是迭代器對象
ls = [1,2,3]
res = ls.__iter__()
print(res)###3<list_iterator object at 0x000001BD59BC03C8>
print(res.__next__())
print(res.__next__())
print(res.__next__())
dic = {"a":1,"b":2,"c":3}
res = dic.__iter__()
print(res)###<dict_keyiterator object at 0x0000012E99889A98>
print(res.__next__())
print(res.__next__())
print(res.__next__())
##在PYTHON的語法中,字典應該是無序的,但是在python3的語法中,新加入了一種算法使得
字典看起來好像是有序的,但是我們要把他當做無序的對待
'''
###這種做法只能針對優勢索引的數據類型:
# ls = [1,2,3,5,6,7]
# index = 0
# while index < len(ls):
# print(ls[index])
# index += 1
# a = 1
# b = 1.1
# c = []
# d = '123e'
# e = (1,2,3)
# f = {"name":124}
# c.__iter__()
# d.__iter__()
ls = [1,2,3]
res = ls.__iter__()
print(res)###3<list_iterator object at 0x000001BD59BC03C8>
print(res.__next__())
print(res.__next__())
print(res.__next__())
dic = {"a":1,"b":2,"c":3}
res = dic.__iter__()
print(res)###<dict_keyiterator object at 0x0000012E99889A98>
print(res.__next__())
print(res.__next__())
print(res.__next__())
print("=".center(100,'*'))
dic = {'k1':'v1','k2':'v2','k3':'v3'}
iter_obj = dic.__iter__()
while True:
try:
print(iter_obj .__next__())
except StopIteration:
break####捕捉異常,當沒有出現except中的錯誤時,執行try中的代碼
##for循環的底層運行機制:for循環可以稱之為迭代器循環
##上面while的循環也就是下面for循環的底層運行機制,一樣的功能
for k in dic:
print(k)
'''
1.先調用in 后面那個對象的__iter__方法,得到該可迭代的對象的迭代器對象
2.執行迭代器對象的__next__方法,將得到的返回值賦值給in 前面的變量名,然后執行一次循環體代碼
3.循環往復,直到取干凈迭代器內所有的值,自動捕捉異常結束循環
'''
##范例
# dic = {'k1':'v1','k2':'v2','k3':'v3'}
# # obj = dic.__iter__()
# #
# # print('第一次迭代取值')
# # for i in obj:
# # print(i)
# # print('第二次迭代取值')
# # for i in obj:
# # print(i)
#####結果:
# 第一次迭代取值
# k1
# k2
# k3
# 第二次迭代取值
#范例
dic = {'k1':'v1','k2':'v2','k3':'v3'}
obj = dic.__iter__()
print('第一次迭代取值')
for i in obj:
print(i)
obj = dic.__iter__()
print('第二次迭代取值')
for i in obj:
print(i)
##結果:
# 第一次迭代取值
# k1
# k2
# k3
# 第二次迭代取值
# k1
# k2
# k3
'''
總結迭代器的優缺點:
優點:
1,提供了一種不依賴索引的迭代取值方式
2,節省內存
缺點:
1,只能往后取,不能往前取,而且是一次性的,值取干凈之后無法再取值,除非重新得到新的迭代器對象
不如按索引取值的方式靈活
2,值取不干凈,永遠無法預測迭代器的長度
現在我們使用的都是官方內部定義還的迭代器,在今后中,如果我們需要用到比較大的數據,可以用一個自定義的迭代器來實現,
而不是用列表或者文件字典等實現。這樣更加節省內存,那么,如果自定義迭代器呢?
請看下一章節:生成器
'''