標籤:為什麼 attribute star size 轉換 sdi 機制 好處 _for
一、迭代器
python 一切皆對象
能被for迴圈的對象就是可迭代對象
可迭代對象: str,list,tuple,dict,set,range
迭代器: f1檔案控制代碼
dir列印該對象的所有操作方法
s = ‘python‘print(dir(s))
執行輸出:
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__iter__‘, ‘__le__‘, ‘__len__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__rmod__‘, ‘__rmul__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘capitalize‘, ‘casefold‘, ‘center‘, ‘count‘, ‘encode‘, ‘endswith‘, ‘expandtabs‘, ‘find‘, ‘format‘, ‘format_map‘, ‘index‘, ‘isalnum‘, ‘isalpha‘, ‘isdecimal‘, ‘isdigit‘, ‘isidentifier‘, ‘islower‘, ‘isnumeric‘, ‘isprintable‘, ‘isspace‘, ‘istitle‘, ‘isupper‘, ‘join‘, ‘ljust‘, ‘lower‘, ‘lstrip‘, ‘maketrans‘, ‘partition‘, ‘replace‘, ‘rfind‘, ‘rindex‘, ‘rjust‘, ‘rpartition‘, ‘rsplit‘, ‘rstrip‘, ‘split‘, ‘splitlines‘, ‘startswith‘, ‘strip‘, ‘swapcase‘, ‘title‘, ‘translate‘, ‘upper‘, ‘zfill‘]
什麼是可迭代對象:內部含有__iter__方法的對象就叫做可迭代對象
可迭代對象就遵循可迭代協議。
如何判斷 兩種方式
第一種:
s = ‘python‘print(‘__iter__‘ in dir(s))
執行輸出:
True
第二種:
from collections import Iterablel = [1, 2, 3, 4]print(isinstance(l, Iterable))
執行輸出:
True
from collections import Iterablel = [1, 2, 3, 4]print(type(l))print(isinstance(l,list))
執行輸出:
<class ‘list‘>
True
type只能判斷是什麼類型
isinstance判斷方面更廣,不僅能判斷類型,還能判斷是否可迭代
迭代器
可迭代對象轉化成迭代器:可迭代對象.__iter__() --->迭代器
迭代器不僅含有__iter__,還含有__next__。遵循迭代器協議。
l1 = [1,2,3]l1_obj = l1.__iter__() # 迭代器print(l1_obj)
執行輸出:
<list_iterator object at 0x000001987D5EB668>
表示它是一個列表迭代器對象
l1 = [1,2,3]l1_obj = l1.__iter__() # 迭代器print(‘__iter__‘ in dir(l1_obj)) #是否含有__iter__方法print(‘__next__‘ in dir(l1)) #是否含有__next__方法print(‘__next__‘ in dir(l1_obj))
執行輸出:
True
False
True
從結果中,可以看出l1_obj是同時含有__iter__和__next__的對象,所以它是迭代器
迭代器使用__next__擷取一個值
l1 = [1,2,3]l1_obj = l1.__iter__() # 迭代器print(l1_obj.__next__()) #擷取一個元素print(l1_obj.__next__())print(l1_obj.__next__())print(l1_obj.__next__())
執行報錯:
1
Traceback (most recent call last):
2
3
File "E:/python_script/day13/迭代器.py", line 9, in <module>
print(l1_obj.__next__())
StopIteration
多取了一個,就會報錯,因為列表只有3個元素
使用for迴圈方式
l1 = [1,2,3]l1_obj = l1.__iter__() # 轉換為迭代器for i in l1_obj: print(i)
執行輸出:
1
2
3
for迴圈的內部機制,就是用__next__方法執行的。為什麼沒有報錯呢?它內部有異常處理機制
總結:
僅含有__iter__方法的,就是可迭代對象
包含__iter__和__next__方法的,就是迭代器
判斷迭代器的2種方法:
第1種:
l1 = [1,2,3]l1_obj = l1.__iter__() # 轉換為迭代器print(‘__iter__‘ in dir(l1_obj))
第2種:
l1 = [1,2,3]l1_obj = l1.__iter__() # 轉換為迭代器from collections import Iteratorprint(isinstance(l1_obj, Iterator))
返回True,就表示它是的
迭代器的好處:
1,節省記憶體空間。
2,滿足惰性機制。
3,不能反覆取值,無法復原。
無法復原,表示,已經取過的值,不能再次取,它只能取下一個。
for處理機制
l2 = [1, 2, 3, 4, 5, 6, 7, 8]for i in l2: print(i)
1,將可迭代對象轉化成迭代器
2,內部使用__next__方法取值
3,運用了異常處理去處理報錯。
迭代器最大的好處,就是節省記憶體
好的程式員,會在記憶體最佳化方面考慮,比如迭代器。
使用while迴圈,指定用__next__方法遍曆列表
l2 = [1, 2, 3, 4, 5, 6, 7, 8]l2_obj = l2.__iter__() #1.將可迭代對象轉化成迭代器while True: try: i = l2_obj.__next__() #內部使用__next__方法取值 print(i) except Exception: #運用了異常處理去處理報錯 break
try裡面的代碼,出現報錯,不會提示紅色文字
Exception 可以接收所有報錯,表示報錯的時候,該怎麼處理,這裡直接使用breck跳出迴圈
面試題:
使用whlie迴圈去遍曆一個有限對象
直接使用上述代碼即可。
二、產生器
產生器:產生器本質上是迭代器
l = [1,2,3]l.__iter__()
#產生器的產生方式:
1,產生器函數構造。
2,產生器推導式構造。
3,資料類型的轉化。
python 全棧開發,Day13(迭代器,產生器)