標籤:send obj war reduce open 對象 print subclass table
一、本節內容
1、迭代器 我們可以使用for迴圈來遍曆可迭代對象,那麼到底如何看某一對象是可迭代對象呢
我們目前熟悉的可迭代對象有str、list、tuple、dict、set。
我們可以通過dir函數來查看某一對象或某一類中定義好的所有方法
1 for el in s:2 print(s)3 4 s1 = 1235 # for el in s1:6 # print(s1)7 8 print(dir(s))9 print(dir(s1))
用dir來查看:
dir(s)返回的結果如下:
[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘,
‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘,
‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__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‘]
dir(s1)返回的結果如下:
[‘__abs__‘, ‘__add__‘, ‘__and__‘, ‘__bool__‘, ‘__ceil__‘, ‘__class__‘, ‘__delattr__‘,
‘__dir__‘, ‘__divmod__‘, ‘__doc__‘, ‘__eq__‘, ‘__float__‘, ‘__floor__‘, ‘__floordiv__‘,
‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘,
‘__index__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__int__‘, ‘__invert__‘, ‘__le__‘,
‘__lshift__‘, ‘__lt__‘, ‘__mod__‘, ‘__mul__‘, ‘__ne__‘, ‘__neg__‘, ‘__new__‘, ‘__or__‘,
‘__pos__‘, ‘__pow__‘, ‘__radd__‘, ‘__rand__‘, ‘__rdivmod__‘, ‘__reduce__‘, ‘__reduce_ex__‘,
‘__repr__‘, ‘__rfloordiv__‘, ‘__rlshift__‘, ‘__rmod__‘, ‘__rmul__‘, ‘__ror__‘, ‘__round__‘,
‘__rpow__‘, ‘__rrshift__‘, ‘__rshift__‘, ‘__rsub__‘, ‘__rtruediv__‘, ‘__rxor__‘, ‘__setattr__‘,
‘__sizeof__‘, ‘__str__‘, ‘__sub__‘, ‘__subclasshook__‘, ‘__truediv__‘, ‘__trunc__‘, ‘__xor__‘,
‘bit_length‘, ‘conjugate‘, ‘denominator‘, ‘from_bytes‘, ‘imag‘, ‘numerator‘, ‘real‘, ‘to_bytes‘]
通過對比帶有__雙底線的方法可以得到可迭代對象中存在__iter__,而不可迭代對象中則沒有該方法。
甚至在open檔案的時候也會有__iter__這個方法。
綜上我們可以確定,如果對象中有__iter__函數,那麼我們認為這個對象遵守了可迭代協議,就可以進行迭代。
這裡的__iter__協助我們擷取到對象的迭代器,我們使用__next__()來擷取到一個迭代器中的元素。
for的工作原理解析,例如:
1 s = "我愛北京天安" 2 c = s.__iter__() # 擷取迭代器 3 print(c.__next__()) # 使用迭代器進行迭代. 擷取一個元素 我 4 print(c.__next__()) # 愛 5 print(c.__next__()) # 北 6 print(c.__next__()) # 京 7 print(c.__next__()) # 天 8 print(c.__next__()) # 安 9 print(c.__next__()) # ?10 print(c.__next__()) # StopIteration 完成迭代後會報錯
2、產生器
產生器的實質就是迭代器,在python中有三種方式來擷取產生器:
1、通過產生器函數
2、通過各種推導式來實現產生器
3、通過資料的轉換也可以擷取產生器
我們嘗試用產生器函數來完成組建器的建立和使用。
1 def func():2 print("111")3 yield 2224 ret = func()5 print(ret)6 ret1 = ret.__next__()7 print(ret1)
print列印返回的結果是<generator object func at 0x0309C420>,是一個產生器對象。
我們可以直接執行__next__()來執行產生器,列印結果是111和222.
但需要注意的是,使用__next__方法,當程式運行完最後一個yield後,那麼如果後面繼續調用__next__()會報錯
send()方法和__next__()一樣,都可以讓產生器執行到下一個yield
send()和__next()兩者的區別:
1、send和next()都是讓產生器向下走一次;
2、send可以給上一個yield的位置傳遞值,不能給最後一個yield發送值,在第一次執行產生器代碼的時候不能使用send()。
python-fullstack-s13-day13-python基礎