'徹底理解Python中的yield'

Python 數據結構 獅範課 2019-08-31
"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

徹底理解Python中的yield


解析獲取到一頁信息後,我們需要將信息處理一下,遍歷提取結果並生成字典,這樣的目的是為了將數據結構整齊(不然的話,數據比較亂),便於後面存儲數據。

在這裡,我用了生成器函數,每調用一次函數時,將會返一個迭代對象,這個迭代對象裡面包含一頁的所有信息,如下圖:

"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

徹底理解Python中的yield


解析獲取到一頁信息後,我們需要將信息處理一下,遍歷提取結果並生成字典,這樣的目的是為了將數據結構整齊(不然的話,數據比較亂),便於後面存儲數據。

在這裡,我用了生成器函數,每調用一次函數時,將會返一個迭代對象,這個迭代對象裡面包含一頁的所有信息,如下圖:

徹底理解Python中的yield


這樣,在我們需要將信息保存時,只需再次遍歷這個迭代對象,就可以一條一條的將每一期的3D彩票信息按照自己想要的結構存儲起來,代碼如下(我是將信息存儲到Excel表格中):

"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

徹底理解Python中的yield


解析獲取到一頁信息後,我們需要將信息處理一下,遍歷提取結果並生成字典,這樣的目的是為了將數據結構整齊(不然的話,數據比較亂),便於後面存儲數據。

在這裡,我用了生成器函數,每調用一次函數時,將會返一個迭代對象,這個迭代對象裡面包含一頁的所有信息,如下圖:

徹底理解Python中的yield


這樣,在我們需要將信息保存時,只需再次遍歷這個迭代對象,就可以一條一條的將每一期的3D彩票信息按照自己想要的結構存儲起來,代碼如下(我是將信息存儲到Excel表格中):

徹底理解Python中的yield


保存效果:

"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

徹底理解Python中的yield


解析獲取到一頁信息後,我們需要將信息處理一下,遍歷提取結果並生成字典,這樣的目的是為了將數據結構整齊(不然的話,數據比較亂),便於後面存儲數據。

在這裡,我用了生成器函數,每調用一次函數時,將會返一個迭代對象,這個迭代對象裡面包含一頁的所有信息,如下圖:

徹底理解Python中的yield


這樣,在我們需要將信息保存時,只需再次遍歷這個迭代對象,就可以一條一條的將每一期的3D彩票信息按照自己想要的結構存儲起來,代碼如下(我是將信息存儲到Excel表格中):

徹底理解Python中的yield


保存效果:

徹底理解Python中的yield


分析一下這個例子:

parse_one_page函數中出現了關鍵字yield,預示著這個函數每次只產生一個結果值,這個函數返回一個生成器(通過print(parse_one_page)輸出可以看出來),用來產生連續的迭代對象

在創造生成器實例的時候,只需要像普通函數一樣調用就可以,但是這個調用卻不會執行這個函數,這個可以通過輸出看出來

看到這裡應該可以理解生成器這個抽象的概念了吧,如果不懂可以留言,我會一一給大家回答

為什麼叫生成器函數?

因為他隨著時間的推移生成了一個數值隊列。一般的函數在執行完畢之後會返回一個值然後退出,但是生成器函數會自動掛起,然後重新拾起繼續執行,他會利用yield關鍵字關起函數,給調用者返回一個值,同時保留了當前的足夠多的狀態,可以使函數繼續執行。生成器和迭代協議是密切相關的,可迭代的對象都有一個__next()__成員方法,這個方法要麼返回迭代的下一項,要麼引起異常結束迭代。

為了支持迭代協議,擁有yield語句的函數被編譯為生成器,這類函數被調用時返回一個生成器對象,返回的對象支持迭代接口,即成員方法__next()__繼續從中斷處執行執行。

為了更加深刻的理解,我再舉個例子:

"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

徹底理解Python中的yield


解析獲取到一頁信息後,我們需要將信息處理一下,遍歷提取結果並生成字典,這樣的目的是為了將數據結構整齊(不然的話,數據比較亂),便於後面存儲數據。

在這裡,我用了生成器函數,每調用一次函數時,將會返一個迭代對象,這個迭代對象裡面包含一頁的所有信息,如下圖:

徹底理解Python中的yield


這樣,在我們需要將信息保存時,只需再次遍歷這個迭代對象,就可以一條一條的將每一期的3D彩票信息按照自己想要的結構存儲起來,代碼如下(我是將信息存儲到Excel表格中):

徹底理解Python中的yield


保存效果:

徹底理解Python中的yield


分析一下這個例子:

parse_one_page函數中出現了關鍵字yield,預示著這個函數每次只產生一個結果值,這個函數返回一個生成器(通過print(parse_one_page)輸出可以看出來),用來產生連續的迭代對象

在創造生成器實例的時候,只需要像普通函數一樣調用就可以,但是這個調用卻不會執行這個函數,這個可以通過輸出看出來

看到這裡應該可以理解生成器這個抽象的概念了吧,如果不懂可以留言,我會一一給大家回答

為什麼叫生成器函數?

因為他隨著時間的推移生成了一個數值隊列。一般的函數在執行完畢之後會返回一個值然後退出,但是生成器函數會自動掛起,然後重新拾起繼續執行,他會利用yield關鍵字關起函數,給調用者返回一個值,同時保留了當前的足夠多的狀態,可以使函數繼續執行。生成器和迭代協議是密切相關的,可迭代的對象都有一個__next()__成員方法,這個方法要麼返回迭代的下一項,要麼引起異常結束迭代。

為了支持迭代協議,擁有yield語句的函數被編譯為生成器,這類函數被調用時返回一個生成器對象,返回的對象支持迭代接口,即成員方法__next()__繼續從中斷處執行執行。

為了更加深刻的理解,我再舉個例子:

徹底理解Python中的yield


結果如下:

"

沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python中的生成器的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了生成器,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說概念不清,所以本篇今天總結縷縷python的生成器和yield關鍵字。

在介紹yield前有必要先說明下Python中的迭代器(iterator)和生成器(constructor)。

一、迭代器(iterator)

在Python中,for循環可以用於Python中的任何類型,包括列表、元祖等等,實際上,for循環可用於任何“可迭代對象”,這其實就是迭代器。迭代器是一個實現了迭代器協議的對象,Python中的迭代器協議就是有next方法的對象會前進到下一結果,而在一系列結果的末尾是,則會引發StopIteration。任何這類的對象在Python中都可以用for循環或其他遍歷工具迭代,迭代工具內部會在每次迭代時調用next方法,並且捕捉StopIteration異常來確定何時離開。

使用迭代器一個顯而易見的好處就是:每次只從對象中讀取一條數據,不會造成內存的過大開銷。

二、生成器(constructor)

生成器函數在Python中與迭代器協議的概念聯繫在一起。簡而言之,包含yield語句的函數會被特地編譯成生成器。當函數被調用時,他們返回一個生成器對象,這個對象支持迭代器接口。函數也許會有個return語句,但它的作用是用來yield產生值的。

不像一般的函數會生成值後退出,生成器函數在生成值後會自動掛起並暫停他們的執行和狀態,他的本地變量將保存狀態信息,這些信息在函數恢復時將再度有效。

覺得還是模糊話,就拿我最近爬取3D彩票14的數據來說吧,如下圖:

徹底理解Python中的yield


解析獲取到一頁信息後,我們需要將信息處理一下,遍歷提取結果並生成字典,這樣的目的是為了將數據結構整齊(不然的話,數據比較亂),便於後面存儲數據。

在這裡,我用了生成器函數,每調用一次函數時,將會返一個迭代對象,這個迭代對象裡面包含一頁的所有信息,如下圖:

徹底理解Python中的yield


這樣,在我們需要將信息保存時,只需再次遍歷這個迭代對象,就可以一條一條的將每一期的3D彩票信息按照自己想要的結構存儲起來,代碼如下(我是將信息存儲到Excel表格中):

徹底理解Python中的yield


保存效果:

徹底理解Python中的yield


分析一下這個例子:

parse_one_page函數中出現了關鍵字yield,預示著這個函數每次只產生一個結果值,這個函數返回一個生成器(通過print(parse_one_page)輸出可以看出來),用來產生連續的迭代對象

在創造生成器實例的時候,只需要像普通函數一樣調用就可以,但是這個調用卻不會執行這個函數,這個可以通過輸出看出來

看到這裡應該可以理解生成器這個抽象的概念了吧,如果不懂可以留言,我會一一給大家回答

為什麼叫生成器函數?

因為他隨著時間的推移生成了一個數值隊列。一般的函數在執行完畢之後會返回一個值然後退出,但是生成器函數會自動掛起,然後重新拾起繼續執行,他會利用yield關鍵字關起函數,給調用者返回一個值,同時保留了當前的足夠多的狀態,可以使函數繼續執行。生成器和迭代協議是密切相關的,可迭代的對象都有一個__next()__成員方法,這個方法要麼返回迭代的下一項,要麼引起異常結束迭代。

為了支持迭代協議,擁有yield語句的函數被編譯為生成器,這類函數被調用時返回一個生成器對象,返回的對象支持迭代接口,即成員方法__next()__繼續從中斷處執行執行。

為了更加深刻的理解,我再舉個例子:

徹底理解Python中的yield


結果如下:

徹底理解Python中的yield


正所謂,眼看十遍不如手動一遍,趕緊動起手來感受一下這個神奇又抽象的生成器概念吧;

來源網絡,侵權聯繫刪除

"

相關推薦

推薦中...