1、什麼是迭代器協議html
1.迭代器協議是指:對象必須提供一個next方法,執行該方法要麼返回迭代中的下一項,要麼就引發一個stoplteration異常,以終止迭代(只能日後走,不能往前退)python
2.可迭代對象:實現了迭代器協議的對象(如何實現:對象內部定義一個__iter__()方法)編程
3.協議是一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象函數
2、python中強大的for循環機制工具
for循環的本質:循環全部對象,全都是使用迭代器協議。spa
正文清源:code
不少人會想,for循環的本質就是遵循迭代器協議去訪問對象,那麼for循環的對象確定都是迭代器了啊。沒錯,那既然這樣,for循環能夠遍歷(字符串,列表,元祖,字典,集合,文件對象),那這些類型的數據確定是可迭代對象啊?可是,我tmd爲何定義一個列表=[1, 2, 3, 4]沒有next方法,打臉麼?htm
(字符串,列表,元祖,字典,集合,文件對象)這些都不是可迭代對象,只不過在for循環式,調用了他們內部的__iter__方法,把他們變成了可迭代對象。對象
而後for循環調用可迭代對象的__next__方法取值,並且for循環會捕捉stoplteration異常,以終止迭代。blog
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 ls = ['a', 'b', 'c'] 4 # 1、下標訪問方式,默認從0開始計數 5 print(ls[0]) 6 print(ls[1]) 7 print(ls[2]) 8 # print(ls[3]) # 報錯,超出索引下標 9 # # 2、遵循迭代器協議訪問方式 10 diedai_ls = ls.__iter__() 11 print(diedai_ls.__next__()) 12 print(diedai_ls.__next__()) 13 print(diedai_ls.__next__()) 14 # 三for循環訪問方式 15 for item in ls: 16 print(item) 17 # 使用while循環方式 18 diedai_ls = ls.__iter__() 19 while True: 20 try: 21 print(diedai_ls.__next__()) 22 except StopIteration: 23 print('迭代完啦!') 24 break
3、生成器初探
什麼是生成器?
能夠理解爲一種數據類型,這種數據類型自動實現了迭代器協議(其餘的數據類型須要調用本身的內置的__iter__方法),因此生成器就是可迭代對象
生成器分類及在Python中的變現形式:(Python有兩種不一樣的方式提供生成器)
1.生成器函數:常規函數的定義,可是,使用yield語句而不是return語句返回結果。yield語句語句一次返回一個結果,在每一個結果中間,掛起函數的狀態,以便下次從它離開的地方繼續執行。
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 def test(): 4 yield 1 # 1 5 yield 2 # 2 6 yield 3 # 3 7 8 9 res = test() 10 print(res.__next__()) 11 print(res.__next__()) 12 print(res.__next__()) 13 # print(res.__next__()) # 報錯,超出索引下標
2.生成器表達式:相似於列表推導,可是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 ls = ('數字:%s' % i for i in range(10)) 4 print(ls.__next__()) # 數字:0 5 print(ls.__next__()) # 數字:1 6 print(ls.__next__()) # 數字:3
爲什麼使用生成器之生成器的特色
Python使用生成器對延遲操做提供了支持。所謂延遲操做,是指在須要的時候才產生結果,而不是當即產生結果。這也是生產層器的主要好處。
生成器小結:
a.是可迭代對象
b.實現了延遲計算,省內存
c.生成器本質和其餘的數據類型同樣,都是實現了迭代器協議,只不過生成器附加了一個延遲計算省內存的好處,其他的可迭代對象可沒有這點好處,記住哦~~
4、生成器表達式與三元運算
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 name = 'alex' 4 res = 'True' if name == 'alex' else 'False' 5 print(res)
5、列表解析
1 ls = ['數字:%s' % i for i in range(10)] 2 print(ls)
總結:
1.把列表解析的[]換成()獲得的就是生成器表達式
2.列表解析與生成器表達式都是一種遍歷的編程方式,只不過生成器表達式更節省內存
3.Python不但使用迭代器協議讓for循環變得更加通用。大部份內置函數,也是使用迭代器協議訪問對象的。例如,sum函數是Python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議,因此,咱們能夠直接這樣計算一系列值的和:
1 print(sum(x for x in range(1000000000000000)))
原文出處:https://www.cnblogs.com/chenyanbin/p/10294814.html