[轉載] Python的生成器

參考鏈接: Python中的生成器Generator

Python的生成器?

什么是生成器?

創建python迭代器的過程雖然強大,但是很多時候使用不方便。生成器是一個簡單的方式來完成迭代。簡單來說,Python的生成器是一個返回可以迭代對象的函數。?

怎樣創建生成器?

在一個一般函數中使用yield關鍵字,可以實現一個最簡單的生成器,此時這個函數變成一個生成器函數。yield與return返回相同的值,區別在于return返回后,函數狀態終止,而yield會保存當前函數的執行狀態,在返回后,函數又回到之前保存的狀態繼續執行。?

生成器函數與一般函數的不同?

一下是幾點不同:?

生成器函數包含一個或者多個yield當調用生成器函數時,函數將返回一個對象,但是不會立刻向下執行像__iter__()和__next__()方法等是自動實現的,所以我們可以通過next()方法對對象進行迭代一旦函數被yield,函數會暫停,控制權返回調用者局部變量和它們的狀態會被保存,直到下一次調用函數終止的時候,StopIteraion會被自動拋出? 舉例:?

?# 簡單的生成器函數

def my_gen():

? ? ?n=1

? ? ?print("first")

? ? ?# yield區域

? ? ?yield n

?

? ? ?n+=1

? ? ?print("second")

? ? ?yield n

?

? ? ?n+=1

? ? ?print("third")

? ? ?yield n

?

?a=my_gen()

?print("next method:")

?# 每次調用a的時候,函數都從之前保存的狀態執行

?print(next(a))

?print(next(a))

?print(next(a))

?

?print("for loop:")

?# 與調用next等價的

?b=my_gen()

?for elem in my_gen():

? ? ?print(elem)

?

使用循環的生成器?

# 逆序yield出對象的元素

def rev_str(my_str):

? ? length=len(my_str)

? ? for i in range(length-1,-1,-1):

? ? ? ? yield my_str[i]

?

for char in rev_str("hello"):

? ? print(char)?

生成器的表達式?

Python中,有一個列表生成方法,比如?

# 產生1,2,3,4,5的一個列表

[x for x in range(5)]?

如果換成[]換成(),那么會成為生成器的表達式。?

(x for x in range(5))?

具體使用方式:?

a=(x for x in range(10))

b=[x for x in range(10)]

# 這是錯誤的,因為生成器不能直接給出長度

# print("length a:",len(a))

?

# 輸出列表的長度

print("length b:",len(b))

?

b=iter(b)

# 二者輸出等價,不過b是在運行時開辟內存,而a是直接開辟內存

print(next(a))

print(next(b))??

為什么使用生成器?

更容易使用,代碼量較小內存使用更加高效。比如列表是在建立的時候就分配所有的內存空間,而生成器僅僅是需要的時候才使用,更像一個記錄代表了一個無限的流。如果我們要讀取并使用的內容遠遠超過內存,但是需要對所有的流中的內容進行處理,那么生成器是一個很好的選擇,比如可以讓生成器返回當前的處理狀態,由于它可以保存狀態,那么下一次直接處理即可。流水線生成器。假設我們有一個快餐記錄,這個記錄的地4行記錄了過去五年每小時售出的食品數量,并且我們要把所有的數量加在一起,求解過去5年的售出的總數。假設所有的數據都是字符串,并且不可用的數字被標記成N/A。那么可以使用下面的方式處理:?

with open('sells.log') as file:

? ? pizza_col = (line[3] for line in file)

? ? per_hour = (int(x) for x in pizza_col if x != 'N/A')? # 使用生成器進行自動迭代

? ? print("Total pizzas sold = ",sum(per_hour))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540470.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540470.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540470.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

想提高用戶訪問的響應速度和成功率還不趕快學習CDN

2019獨角獸企業重金招聘Python工程師標準>>> 課程介紹 CDN可以將源站內容分發至最接近用戶的節點,使用戶可就近取得所需內容,提高用戶訪問的響應速度和成功率。解決因分布、帶寬、服務器性能帶來的訪問延遲問題,適用于站點加速、點…

[轉載] python迭代器、生成器和裝飾器

參考鏈接: 有效地在Python中使用迭代 文章目錄 生成器生成器表達式(generator expression)通過使用yield關鍵字定義生成器并行前戲高潮 迭代器迭代器概述iter()函數 創建迭代器創建一個迭代器(類)內置迭代器工具count無限迭代器cycle 無限迭代器,從一個…

java中的starts_Java Math類靜態double nextAfter(double starts,double direction)示例

java中的starts數學類靜態double nextAfter(雙向啟動,雙向) (Math Class static double nextAfter(double starts , double directions) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the double …

Python 核心編程(第二版)——條件和循環

Python 中的 if 子句由三部分組成: 關鍵字本身,用于判斷結果真假的條件表達式, 以及當表達式為真或者非零時執行的代碼塊。if 語句的語法如下: if expression: expr_true_suite 單個 if 語句可以通過使用布爾操作符 and , or 和 not實現多重判斷條件或…

[轉載] 【python魔術方法】迭代器(__iter__和__next__)

參考鏈接: Python __iter __()和__next __()| 將對象轉換為迭代器 文章目錄 __iter__ 和 __next__真正的迭代器總結 python里面有很多的以__開始和結尾的函數,利用它們可以完成很多復雜的邏輯代碼,而且提高了代碼的簡潔性,本文主…

Silverlight 異步單元測試

Silverlight 中的很多操作都是異步的,很多情況下要求單元測試也是異步的,但是介紹異步單元測試的文檔很少。通過對 Silverlight Toolkit 中的 Microsoft.Silverlight.Testing 和 Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight 這兩個文件…

網絡拓撲 令牌環網 以太網_以太網連接中網絡拓撲的類型及其框架 以太網技術...

網絡拓撲 令牌環網 以太網A topology explains how physically the network is designed or what is the structure of the network. These designs are both physical and logical. There are many network topologies 4 like Bus, Star, Ring, and Mesh. But only two types …

Wafer晶圓封裝工藝介紹

芯片封裝的目的(The purpose of chip packaging): 芯片上的IC管芯被切割以進行管芯間連接,通過引線鍵合連接外部引腳,然后進行成型,以保護電子封裝器件免受環境污染(水分、溫度、污染物等)&…

[轉載] Python中的解析式和生成器表達式

參考鏈接: Python | 生成器表達式 解析式和生成器表達式 列表解析List Comprehension 語法 [返回值 for 元素 in 可迭代對象 if 條件]使用中括號[],內部是for循環,if條件語句可選,會返回一個新的列表 列表解析試優點 編譯器會優化&…

java 數字字母進位_使用帶有進位的8085微處理器將兩個8位數字相乘

java 數字字母進位Problem statement: 問題陳述: Multiplication of two 8 bits numbers using 8085 microprocessor with carry. 使用帶有進位的8085微處理器將兩個8位數字相乘。 Algorithm: 算法: Load HL pair with initial data using LHLD comma…

[轉載] Python3.0中普通方法、類方法和靜態方法的比較

參考鏈接: Python中的類方法與靜態方法 一、語法區別 剛接觸Python中的面向對象,對于類方法和靜態方法難以區分,通過查找知乎、CSDN論壇,廢了好大的勁思路才逐漸明朗,所以就總結順便分享一下。 首先開始編輯代碼 # 普…

iOS:個人淺談工廠模式

一、什么是工廠方法? 正式的解釋是:在基類中定義創建對象的一個接口,讓子類決定實例化哪個類。工廠方法讓一個類的實例化延遲到子類中進行。工廠方法要解決的問題是對象的創建時機,它提供了一種擴展的策略,很好地符合了…

scanf 輸入十六進制_使用C語言中的scanf()在字符變量中輸入十進制,八進制和十六進制值...

scanf 輸入十六進制Here, we will declare an unsigned char variable and input different formats value like decimal format, octal format and hexadecimal format. 在這里,我們將聲明一個無符號的char變量,并輸入不同格式的值,例如十進…

[轉載] Python中pass的作用

參考鏈接: 如何在Python中編寫空函數?請使用 pass語句 空語句 do nothing保證格式完整保證語義完整 以if語句為例,在c或c/java中: if(true) ; //do nothing else { //do something } 對應于python就要這樣寫&#xff…

wrf 嵌套網格作用_在網格系統中使用響應列,嵌套列和偏移列 引導程序

wrf 嵌套網格作用介紹 (Introduction) In the previous article, we have learnt what is grid and grid system and how it works? Now, we will learn about how Responsive column, Nesting Columns and Offset Columns works and how to use them? If you have any doubt…

[看書筆記]《深入java虛擬機》——java體系結構(二)

java虛擬機的三種含義: - 抽象的規范 - 一個具體的實現 - 一個運行中的虛擬機實例 ---------------------java虛擬機的生命周期: java虛擬機實例的天職就是負責運行一個java程序。 啟動一個java程序,一個虛擬機實例誕生了;程序關閉…

[轉載] 【零基礎學爬蟲】python中的yield詳解

參考鏈接: 什么時候在Python中使用yield而不是return python中的yield功能比較強大,什么意思呢?如果一個函數f內使用了yield關鍵詞,那么該函數就可以這樣使用: for item in f(***): **** 也就是包含yield關鍵詞的函…

全新的membership框架Asp.net Identity(1)——.Net membership的歷史

在Asp.net上,微軟的membershop框架經歷了Asp.net membership到Asp.net simple membership,再到現在的Asp.net Identity. 每一次改變,都使得驗證框架更加的適應變化和可定制。這篇文章是Asp.net Identity系列的開篇,主要就membersh…

c語言100位整數變量聲明_C ++程序動態聲明一個整數變量并打印其內存地址

c語言100位整數變量聲明Here, we will learn how we can declare an integer variable dynamically and how to print address of declared memory block? 在這里,我們將學習如何動態聲明整數變量,以及如何打印聲明的內存塊的地址? In C pr…

[轉載] python 函數返回多個值

參考鏈接: 在Python中返回多個值 (廖雪峰Python教程學習筆記) 函數體內部的語句在執行時,一旦執行到return,函數就執行完畢,并將結果返回。 如果沒有return語句,函數執行完畢后也會返回結果…