python 迭代器協議和生成器

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

相關文章
相關標籤/搜索