python 全棧開發,Day13(迭代器,產生器)

來源:互聯網
上載者:User

標籤:為什麼   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(迭代器,產生器)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.