python函數:迭代器和生成器

python函數:迭代器和生成器

迭代器和生成器是函數中的一大重點,務必掌握,何爲迭代?何爲迭代器?

預習:

處理文件,用戶指定要查找的文件和內容,將文件中包含要查找內容的每一行都輸出到屏幕(使用生成器)

 

一、迭代器

複製代碼

for i in 50:
    print(i)
#運行結果:
# Traceback (most recent call last):
#   File "G:/python/python代碼/八月/day2 迭代器生成器/3迭代器.py", line 8, in <module>
#     for i in 50:
# TypeError: 'int' object is not iterable

報錯:

TypeError: 'int' object is not iterable

類型報錯:'int'對象是不可迭代的    何爲迭代?

iterable:可迭代的;迭代的;

可迭代的:從上面代碼可以簡單分析出能被for循環取值的就是可迭代,那麼我們就可以初步總結出可迭代的類型:str、list、tuple、set、dict

可迭代的 ——對應的標誌 擁有__iter__方法

print('__iter__' in dir([1,2,3]))  #判斷一個變量是不是一個可迭代的

可迭代協議

可以被迭代要滿足的要求就叫做可迭代協議。可迭代協議的定義非常簡單,就是內部實現了__iter__方法


 

二、迭代器

__iter__方法作用:

 迭代器

iterator:迭代器;迭代程序

迭代器協議:必須擁有__iter__方法和__next__方法

通過iter(x)得到的結果就是一個迭代器,

x是一個可迭代的對象

在for循環中,就是在內部調用了__next__方法才能取到一個一個的值。

__next__的精髓:

 __next__方法的使用精髓

如果我們一直取next取到迭代器裏已經沒有元素了,就會報錯(拋出一個異常StopIteration),告訴我們,列表中已經沒有有效的元素了。這個時候,我們就要使用異常處理機制來把這個異常處理掉。try_except異常處理機制只做瞭解,不是本章重點,會面會詳細講解。

判斷是否可迭代和迭代器的簡潔方法:

 判斷可迭代和迭代器

不管是一個迭代器還是一個可迭代對象,都可以使用for循環遍歷

迭代器出現的原因 幫你節省內存


 

三、生成器

迭代器大部分都是在python的內部去使用的,我們直接拿來用就行了

我們自己寫的能實現迭代器功能的東西就叫生成器。

1.生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行

2.生成器表達式:類似於列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

生成器Generator:

本質:迭代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)

特點:惰性運算,開發者自定義

 生成器函數

生成器的好處:不會一下子在內存中生成太多數據

其它應用:

 生成器監聽文件輸入的例子

 計算移動平均值簡單

 計算移動平均值升級_生成器激活裝飾器

 yield from


 

四、列表推導式和生成器表達式

 列表推導式和生成器表達式

使用生成器的優點:

1、延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大數據量處理,將會非常有用。

2、提高代碼可讀性

#列表解析
sum([i for i in range(100000000)])#內存佔用大,機器容易卡死
#生成器表達式
 
 sum(i for i in range(100000000))#幾乎不佔內存

總結:

1、把列表解析的[]換成()得到的就是生成器表達式

2、列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存

3、Python不但使用迭代器協議,讓for循環變得更加通用。大部分內置函數,也是使用迭代器協議訪問對象的。例如, sum函數是Python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議,所以,我們可以直接這樣計算一系列值的和

print(sum([1,2,3]))
print(sum(range(1,4)))
print(sum(x ** 2 for x in range(4)))
print(sum([x ** 2 for x in range(4)]))

 

預習答案和思維導圖明天更新...


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章