首頁 >
熱門文章 >
大數(shù)據(jù)分析 > 大數(shù)據(jù)分析Python生成器使用教程
大數(shù)據(jù)分析Python生成器使用教程
時間:2020-09-17來源:mwtacok.cn點擊量:次作者:Sissi
時間:2020-09-17點擊量:次作者:Sissi
Python生成器是一個功能強大但被誤解的工具。對于初學(xué)者來說,他們通常被認為是一個過于困難的概念,從而產(chǎn)生了一種幻象,即初學(xué)者應(yīng)該在學(xué)習(xí)generator生成器之前一直堅持不懈,直到他們準備好為止。我認為這種評估是不公平的,您可以比您想象的更早使用generator生成器。在大數(shù)據(jù)分析Python生成器使用教程中,我們將介紹:
1)了解生成器所需的基本術(shù)語
2)什么是generator生成器
3)如何創(chuàng)建自己的generator生成器
4)如何使用生成器和生成器方法
5)何時使用generator生成器
先決條件
為了充分利用大數(shù)據(jù)分析Python生成器使用教程,您應(yīng)該熟悉以下概念:
1)基本的Python數(shù)據(jù)結(jié)構(gòu)
a)什么是清單
b)什么是字典
2)功能
a)什么是功能
b)如何創(chuàng)建和使用功能
3)清單理解
a)什么是列表理解
b)如何創(chuàng)建一個簡單的列表理解
基本術(shù)語
迭代和可迭代
迭代是一遍又一遍地重復(fù)某種過程。Python的for循環(huán)為我們提供了一種遍歷各種對象的簡便方法。通常,您會遍歷一個列表,但是我們也可以遍歷其他Python對象,例如字符串和字典。
在以上每個示例中,for循環(huán)遍歷我們給出的序列。上面的代碼使用了列表,字符串和字典,但是您也可以遍歷元組和集合。在上面的每個循環(huán)中,我們print按順序顯示序列中的每個項目。例如,您可以確認的順序ez_list已按照其項目的打印順序進行復(fù)制。
我們將可以支持迭代的任何對象稱為可迭代。
什么定義了迭代?
可迭代支持一種稱為
迭代器協(xié)議。Iterator協(xié)議的技術(shù)定義不在大數(shù)據(jù)分析Python生成器使用教程的討論范圍之內(nèi),但是可以將其視為用于循環(huán)的一組要求for。也就是說:列表,字符串和字典都遵循Iterator協(xié)議,因此我們可以在for循環(huán)中使用它們。相反,不能遵循該協(xié)議的對象不能在for循環(huán)中使用。不遵循該協(xié)議的對象的一個??示例是整數(shù)。如果我們嘗試將整數(shù)賦予for循環(huán),Python將拋出錯誤。
整數(shù)只是一個單數(shù),而不是一個序列。您可能會爭辯說,number為1,但與序列中的第一個項目不同。問“ 1之后是什么?”是沒有意義的。從number因為Python既懂整數(shù)作為一個單一的實體。因此,可迭代的要求之一是能夠向for循環(huán)描述執(zhí)行操作的下一項是什么。例如,列表告訴for循環(huán),要迭代的下一項在當(dāng)前項的索引+1中(1在0之后)。因此,迭代器還必須for在停止時向循環(huán)發(fā)出信號迭代。當(dāng)我們到達序列的末尾(即列表或字符串的末尾)時,通常會出現(xiàn)此信號。在大數(shù)據(jù)分析Python生成器使用教程的后面,我們將探討使某些事物可迭代的特定函數(shù),要知道的重要一點是,可迭代對象描述了循環(huán)應(yīng)如何for遍歷其內(nèi)容。生成器本身就是可迭代的。稍后您將看到,for循環(huán)是我們使用生成器的主要方式之一,因此循環(huán)必須能夠支持迭代。我們將深入研究如何在下一秒創(chuàng)建自己的生成器。
關(guān)鍵要點:要了解的基本術(shù)語
1)迭代是在一系列項目上重復(fù)某些過程的想法。在Python中,迭代通常與for循環(huán)有關(guān)。
2)可迭代對象是支持迭代的對象。
3)要進行迭代,它必須向for循環(huán)描述兩件事:
a)迭代中的下一個項目是什么。
b)循環(huán)何時應(yīng)停止迭代。
4)生成器是可迭代的。
基于數(shù)據(jù)的方法
為了真正探索generator生成器,我們將使用
來自Kaggle的Brewer's Friend Beer Recipes數(shù)據(jù)集。如果您想在自己的計算機上繼續(xù)學(xué)習(xí),可以在這里找到數(shù)據(jù)集。數(shù)據(jù)包含來自世界各地啤酒商的重要啤酒特性,包括啤酒樣式,酒精含量(ABV)和啤酒產(chǎn)量。就大數(shù)據(jù)分析Python生成器使用教程而言,假設(shè)我們對釀造自己的啤酒感興趣。也許我們想出售我們的啤酒,所以我們想看看其他人做了些什么,以告知我們的釀造選擇并生產(chǎn)更多流行的啤酒樣式。作者注:原始數(shù)據(jù)集中的“名稱”列包含一些凌亂的值,這些值會干擾我們的分析。您可以在此處找到可以滿足我們目的的清理版本。
generator生成器和你
如果您以前從未遇到過generator生成器,那么現(xiàn)實中最常見的generator生成器示例就是備用generator生成器,它會創(chuàng)建-
發(fā)電 —為您的房屋或辦公室供電。從概念上講,Python生成器從給定的序列一次生成一個值,而不是一次給出整個序列。生成器的這種一次性方式使它們與for循環(huán)如此兼容。如果這聽起來令人困惑,請不要擔(dān)心太多。當(dāng)我們解釋如何創(chuàng)建生成器時,它將變得更加清晰。有兩種創(chuàng)建生成器的方法。它們的語法不同,但是最終結(jié)果仍然是生成器。我們將通過覆蓋這些語法并將它們與類似但非生成器等效的語法進行比較,來教授這些概念。
1)生成器函數(shù)與常規(guī)函數(shù)
2)生成器表達式與列表理解
generator生成器功能
生成器函數(shù)就像常規(guī)函數(shù)一樣,但是有一個關(guān)鍵的區(qū)別:
yield關(guān)鍵字替換return。
上面的兩個函數(shù)執(zhí)行完全相同的操作(返回/產(chǎn)生相同的字符串)。但是,如果您嘗試檢查生成器功能,它將與常規(guī)功能顯示的內(nèi)容不匹配。
調(diào)用常規(guī)函數(shù)會告訴Python返回該函數(shù)在我們代碼中的位置,在代碼塊中執(zhí)行代碼,然后返回結(jié)果。為了使生成器函數(shù)產(chǎn)生其值,您需要將其傳遞給
next()功能。next()是一個特殊的函數(shù),詢問“迭代中的下一個項目是什么?” 實際上,next()是運行for循環(huán)時調(diào)用的精確函數(shù)!列表,字典,字符串等都實現(xiàn)了next(),因此這就是為什么您可以首先將它們合并到循環(huán)中的原因。
注意,由于函數(shù)本身就是生成器,因此必須在生成器函數(shù)中加上括號。僅提供函數(shù)名稱會引發(fā)錯誤,因為您嘗試提供
next()函數(shù)名稱。不出所料,yield一旦調(diào)用next()函數(shù),生成器函數(shù)將為“ a” 。此示例不能完全代表生成器的用途。請記住,生成器會生成一個值流,因此,yield單個值實際上并沒有資格作為流。為此,我們實際上可以將多個yield語句放入生成器函數(shù)中。這些yield語句構(gòu)成了生成器將輸出的順序。我們將創(chuàng)建一個生成器并將其綁定到一個varible mg。然后,如果我們繼續(xù)mg進入next(),我們將進入下一個yield。如果我們繼續(xù)前進,將被告知StopIteration錯誤,告知生成器沒有其他值可提供。該StopIteration錯誤實際上是一個如何for 循環(huán)知道何時停止迭代。
分配
multi_generate到mg在使用generator生成器功能的關(guān)鍵步驟。將生成器綁定到mg允許我們創(chuàng)建可以參考的生成器的單個實例。我們可以繼續(xù)傳遞mg到next()并獲得與其他yield語句。觀察如果我們繼續(xù)嘗試自己傳遞下去會發(fā)生什么multi_generate。
容易將生成器視為僅等待一個命令和一個命令的機器:
next()。調(diào)用next()生成器后,它將按其持有的順序分配下一個值。否則,您將無法使用生成器執(zhí)行其他任何操作。下圖將我們的generator生成器表示為一臺簡單的機器。
我們繼續(xù)得到第一條yield陳述的結(jié)果。其背后的原因是微妙的。當(dāng)我們將生成器函數(shù)本身傳遞給時next(),Python會假定您正在向其中傳遞一個新實例multi_generate,因此它將始終為您提供第一個yield結(jié)果。通過將生成器綁定到變量,Python知道在將其傳遞給時,您正在嘗試對同一件事采取行動next()。我們注意到,隨著我們不斷傳遞mg下一個,我們得到了其他yield結(jié)果。僅當(dāng)生成器以某種方式記住其上次執(zhí)行的操作時,這才有可能。該存儲器是生成器功能與常規(guī)功能的區(qū)別!使用函數(shù)后,這是一項一勞永逸的交易。一旦您return該函數(shù)的值。生成器將保留yield值直到輸出。這帶給我們generator生成器的另一個重要特性。一旦完成對它們的遍歷,就不能再使用它們了。一旦我們了解了中的所有三個yield值mg,便無法再為我們提供任何東西。我們必須存儲multi_generate生成器的另一個實例,以next()再次開始詢問它的語句。我們的數(shù)據(jù)尚未被讀取,因此讓我們使用生成器函數(shù)來完成。數(shù)據(jù)稱為recipeData.csv,并且包含在CSV文件中。我們將使用該open()函數(shù)使我們能夠讀取它,并且我們將開始使用該next()函數(shù)來讀取CSV的前幾行。
我們將慢慢剖析上面的代碼:
1)我們已指定dataGenerator生成器作為生成器函數(shù),它將逐行分配CSV文件。該函數(shù)在中包含文件名file,這使我們能夠使用該open()函數(shù)讀取文件。
2)雖然我們討論了可以迭代列表和字典之類的Python對象,但是我們也可以迭代文件open()。
3)該encoding通知的Python應(yīng)該期望看到什么樣的角色; ISO-8859-1特別是指Latin-1。
4)該for循環(huán)將在CSV文件的第一行,啟動yield該行,然后保存當(dāng)前發(fā)生在閱讀文件,直到生成函數(shù)被再次調(diào)用。
如果要在自己的計算機上跟蹤數(shù)據(jù),則需要更換
file以及計算機上文件所在位置的確切路徑。這將使Python可以在需要時找到open()它。
一旦我們創(chuàng)建了一個
beerDataGenerator生成器在中beer,我們可以開始將其傳遞next()來查看數(shù)據(jù)本身。如CSV文件所建議的,這些列用逗號分隔。此外,每行以結(jié)束\n,表示換行。我們發(fā)現(xiàn),其中的第一項recipeData.csv是列名列表,第一行描述了美味的香草奶油啤酒。
自我施加的限制
您可能會問:“我們可以將數(shù)據(jù)存儲在列表理解中!為什么要跳一個額外的箍并使用generator生成器?” 作為程序員,您可能會遇到
大數(shù)據(jù)。這是一個模糊的術(shù)語,因此在這里我們不會深入研究各種大數(shù)據(jù)定義??梢哉f任何大數(shù)據(jù)文件太大分配給變量。我們的數(shù)據(jù)文件不符合大數(shù)據(jù)的條件,但是我們?nèi)匀豢梢酝ㄟ^限制自己來重新創(chuàng)建這個難題來學(xué)到很多東西?,F(xiàn)在,我們假定啤酒數(shù)據(jù)量太大,以至于我們無法將所有數(shù)據(jù)存儲在列表中。由于無法正常讀取數(shù)據(jù),因此我們不得不重新考慮我們的選擇。這就是生成器的用武之地。我們稍后將詳細解釋生成器在這里工作的原因,但是在此之前,我們可以放心,生成器功能將使我們能夠首先讀取數(shù)據(jù),盡管不是一次全部讀取。除了生成器函數(shù),我們還可以使用生成器表達式創(chuàng)建生成器。
生成器表達式
早期,我們將生成器函數(shù)與常規(guī)函數(shù)進行了比較,因為它們具有許多相似的方面。對于世代表達式,我們將使用
清單理解。
lc_example是我們的列表理解力,而genex_example我們的生成器表達式則執(zhí)行幾乎相同的任務(wù)。請注意,兩者之間的唯一區(qū)別是生成器表達式由括號而不是括號包圍。如果我們將這些迭代器中的任何一個for循環(huán)放置,它們將產(chǎn)生相同的結(jié)果,并且將無法區(qū)分。但是,如果我們嘗試在解釋器中檢查這些變量,它們將產(chǎn)生不同的結(jié)果。
此結(jié)果類似于我們嘗試查看常規(guī)函數(shù)和生成器函數(shù)時所看到的結(jié)果。Python還認識到genex_example 是生成器表達式形式的生成器()。如lc_example清單所示,我們可以執(zhí)行它們支持的所有操作:索引,切片,突變等。我們無法使用生成器表達式來執(zhí)行此操作。生成器專門用于輕松地一次生成輸出,因此不支持這些操作。但是,就像列表推導(dǎo)一樣,我們可以在生成器表達式中實現(xiàn)邏輯,以在需要時形成過濾器。
實際上,我們將如何使用生成器函數(shù)或生成器表達式?jīng)]有區(qū)別。一旦有了生成器表達式,就可以調(diào)用next()在它上面開始獲取它將產(chǎn)生的值。一旦遍歷了生成器表達式可以產(chǎn)生的所有值,就不能再使用它了。這與列表理解形成對比,列表理解可以重復(fù)使用任意數(shù)量的內(nèi)容。
我們只能使用generator生成器的想法
曾經(jīng)與他們的消費觀念聯(lián)系在一起。回想一下,當(dāng)我們迭代某個迭代器時,我們會對其中的每個值執(zhí)行一些操作。然后,我們使用這些處理后的值繼續(xù)進行分析,這意味著通常我們可能不需要原始的迭代器。生成器完全適合這種需求,使我們能夠形成一個可以使用一次的迭代器,而不必擔(dān)心它在使用后會占用空間(for例如,循環(huán))。我們討論了next()從生成器獲取值的方法,但是在for循環(huán)中使用生成器通常更好。使用next()強制我們不得不面對StopIteration自己,但是for循環(huán)使用它來知道何時停止!
生成器表達式與函數(shù)相比的一個區(qū)別是它們的簡潔性。生成器函數(shù)占用多行,而我們可以將生成器表達式放在一行中。多行本身并不是一件壞事,但是它使功能更加復(fù)雜,從而可能在以后引入錯誤。我們將生成器函數(shù)重寫為單行表達式,以讀取啤酒數(shù)據(jù)。這種簡潔性將在大數(shù)據(jù)分析Python生成器使用教程的稍后部分派上用場。
關(guān)鍵要點:generator生成器
1)生成器一次生成一個值,而不是一次提供所有值。
2)創(chuàng)建生成器有兩種方法:生成器函數(shù)和生成器表達式。
3)generator生成器功能yield,常規(guī)功能return。
4)生成器表達式需要(),列表理解使用[]。
5)您只能使用generator生成器一次。
6)有兩種從生成器獲取值的方法:next()函數(shù)和for循環(huán)。所述for環(huán)通常是優(yōu)選的方法。
7)我們可以使用生成器來讀取文件,并一次給我們一行。
生成器:動機和用途
之前,我們討論過對自己施加限制,迫使我們使用生成器來讀取我們的數(shù)據(jù),而不是將其讀取到列表中。我們列舉了大數(shù)據(jù)的問題以及我們無法將其全部存儲在一個變量中。雖然稱它為大數(shù)據(jù)問題仍然正確,但您也可以稱它為
內(nèi)存問題。假設(shè)您有一臺較舊的筆記本電腦,帶有大約4GB的RAM和隨機存取內(nèi)存。啤酒數(shù)據(jù)集的真實大小只有3MB,但假設(shè)我們要求全球每個人都給我們提供他們的食譜,因此數(shù)據(jù)集大約為3GB。如果我們將整個數(shù)據(jù)集讀入一個變量,則將占用超過3GB的RAM!這將使我們幾乎沒有其他操作余地,更不用說其他類似大小的變量了。將我們的數(shù)據(jù)存儲在列表中會占用大量內(nèi)存,以至于我們進行的任何分析都將花費很長時間。
懶惰和generator生成器
現(xiàn)在我們知道生成器從定義的序列中產(chǎn)生單個值,但是僅當(dāng)我們詢問next()或for循環(huán)內(nèi)時。我們稱這種懶惰的評價。生成器之所以懶惰,是因為它們僅在我們要求時才給我們帶來價值。不利的一面是,只有那個值會占用內(nèi)存。最終結(jié)果是生成器的存儲效率非常高,這使其成為讀取和使用大數(shù)據(jù)文件的理想選擇。一旦要求生成器的下一個值,舊值將被丟棄。一旦我們遍歷整個生成器,它也將從內(nèi)存中丟棄。
generator生成器給generator生成器供電
我們目前還沒有從啤酒數(shù)據(jù)中學(xué)到任何東西。到目前為止,我們所要做的就是獲取原始CSV文件并創(chuàng)建一個生成器,該生成器將生成CSV中的每一行,一次生成一個字符串形式。除非我們想做一些瘋狂的字符串操作,否則我們需要考慮一種將數(shù)據(jù)轉(zhuǎn)換為可讀,可用形式的方法。下面是我們代碼當(dāng)前功能的表示:從文件中輕松讀取文件,并從文件中輸出一行內(nèi)容。
generator生成器在這里再次救援!到目前為止,在大數(shù)據(jù)分析Python生成器使用教程中,我們一直在將其他結(jié)構(gòu)(特別是迭代器)傳遞給生成器,以指示要從中生成什么序列。但是,生成器本身也是迭代器-為什么我們不創(chuàng)建另一個生成器來獲取另一個生成器呢?我們的lines生成器完整地輸出了該行,因此我們將創(chuàng)建第二個生成器來為我們做一些格式化。
我們的生成器的最終結(jié)果是一個列表流,每個列表都包含CSV行中的數(shù)據(jù)。如果我們遍歷
lists,我們將能夠輕松訪問其中的數(shù)據(jù)元素并執(zhí)行所需的分析!我們已經(jīng)有效地為我們的數(shù)據(jù)集建立了一條管道,從原始數(shù)據(jù)集開始,并通過2個生成器將其發(fā)送,以使其成為熟悉的形式。請記住,生成器本身并不是列表,它們僅生成序列中的單個元素,并且僅占用該元素所需的數(shù)量。通過將生成器連接在一起,我們創(chuàng)建了一種快速,易于閱讀的方式,使我們可以讀取通常無法訪問的數(shù)據(jù)。這種方法具有真正的力量,其重要性不可低估。在處理中間值時,我們不需要創(chuàng)建任何臨時列表來保存中間值。在管道中增加了生成器之后,我們的代碼可能如下所示:在此管道中,每個生成器負責(zé)單個操作,該操作最終將應(yīng)用于數(shù)據(jù)集的所有行。盡管每個列表都有好處,但是在進行任何有意義的分析之前,仍然需要解決一些小問題。首先,我們希望采用列名,因為它們不是數(shù)據(jù),然后將其轉(zhuǎn)換為字典,這將使任何其他代碼都更易于閱讀。注意:如果要在自己的計算機上運行此代碼,則必須記住,只能使用一次生成器。如果您在for循環(huán)中使用生成器來查看輸出,則需要再次運行數(shù)據(jù)和整個管道。幸運的是,generator生成器在這里運行很快。
beerdicts 進行一些簡單的格式化,這使我們的管道擁有更多的功能!
這是開始查詢我們有關(guān)未來啤酒釀造選擇的數(shù)據(jù)的好地方?,F(xiàn)在我們已經(jīng)有了生成器管道,我們可以開始使用生成器產(chǎn)生的數(shù)據(jù)并創(chuàng)建一些見解。我們通常使用for循環(huán)來消耗生成器,因此我們將使用一個循環(huán)來找出最流行的自釀啤酒類型。
此操作在數(shù)據(jù)整理和處理中無處不在,您可能之前已經(jīng)看過。這里唯一的新事物是,我們依賴于生成器生成的字典,而不是引用包含數(shù)據(jù)的列表的列表。使用生成器,我們可以像常規(guī)大小的查詢一樣從任何大數(shù)據(jù)集中進行相同的查詢?,F(xiàn)在我們知道,美國IPA是數(shù)據(jù)集中最受歡迎的自釀啤酒,并且我們知道它們在數(shù)據(jù)中有多少個條目。我們可以嘗試弄清楚我們的啤酒應(yīng)該有多強。此數(shù)據(jù)包含在“ ABV”(
酒精體積)鍵。由于我們正在使用字典作為生成器流的輸出,因此為什么不添加另一個生成器來細化我們要輸出的確切值。
最后一個生成器構(gòu)成了我們管道的最后一個,如下圖所示:
我們應(yīng)該特別注意sum()在abvgenerator生成器上使用的情況。sum()將接收到的所有ABV值相加并不是立即直觀的。你可能認為的sum()作為減少generator生成器的輸出整成一個值。通過將該總和除以美國IPA整體的數(shù)量,得出平均值。我們的數(shù)據(jù)表明,按體積計算,您的平均美國IPA約為6.4%的酒精含量!我們的最后一個生成器abv采用由beerdicts輸出的字典并輸出ABV鍵,但僅如果啤酒是美國IPA。生成器表達式上的過濾器在我們的管道中形成了強大的工具。如果我們將每個后續(xù)生成器都視為模塊化組件,則可以將生成器換成其他具有更理想功能的生成器。如果我們想改變我們想要研究的啤酒種類或研究另一種啤酒特性,我們唯一需要改變的就是generator生成器操作。下圖顯示了生成器管道方法的不同部分。它由您要處理的一些原始數(shù)據(jù),進行實際處理的管道以及該管道輸出的最終消耗組成。按照此模式,您可以重新執(zhí)行我們對啤酒數(shù)據(jù)所做的操作。如果您習(xí)慣于使用列表列表并利用所有列表方法進行分析的工作流程,那么這種新的數(shù)據(jù)整理方法可能會很奇怪。但是,數(shù)據(jù)管道是一個強大的概念,可以立即將其合并到您的代碼中,您應(yīng)該嘗試一下。
無限的一代
可以說,自您第一次對啤酒數(shù)據(jù)集進行分析以來已經(jīng)過去了幾年。您利用分析中的洞察力創(chuàng)建了成功的美國IPA,您只需要感謝generator生成器。您每天生產(chǎn)數(shù)千瓶啤酒,并且需要一種分析每批次質(zhì)量的方法。您回到舊筆記本電腦啟動Python解釋器。您開始編寫一個函數(shù)來計算和檢查啤酒批次的各種質(zhì)量,然后停止。您不知道要提前制作多少啤酒。按天分析批次可以為我們提供離散點,但是如果我們想要連續(xù)數(shù)據(jù)怎么辦?常規(guī)功能在這里不起作用!他們需要一些參數(shù),并且將始終返回離散對象。您無法想象給常規(guī)函數(shù)提供數(shù)據(jù)流并返回連續(xù)的值流。但是您可以使用generator生成器!生成器非常適合此類任務(wù)。我們已經(jīng)討論了生成器如何一次一次產(chǎn)生值直到被告知停止。如果我們從不給generator生成器停止信號,它將很高興無限地產(chǎn)生這些值。請看下面的例子。
whileloop始終為真,因此生成器函數(shù)將始終產(chǎn)生啤酒。我們沒有做錯任何事情,這是完全有效的代碼(盡管您實際上不想實現(xiàn))。這種“無限”的啤酒流如何適應(yīng)我們的時間表?在最初查看啤酒數(shù)據(jù)集的過程中,CSV最初是固定數(shù)量的行。如果您可以使釀造過程自動化以將該數(shù)據(jù)輸出到類似的CSV并不斷更新,那么運行分析所需要做的就是再次通過生成器運行數(shù)據(jù)!可以想象,您可以在管道中創(chuàng)建一個生成器,以捕獲不符合您期望的任何批次并實時標記它們!不幸的是,我們沒有說數(shù)據(jù),但是這個思想實驗應(yīng)該為Python生成器提供另一個引人注目的用例。有了generator生成器.
關(guān)鍵要點:generator生成器背后的動機和用途
1)生成器具有存儲效率,因為它們只需要為其生成的一個值存儲即可。
2)生成器很懶:它們僅在明確要求時才產(chǎn)生值。
3)您可以將一個生成器的輸出饋送到另一個生成器的輸入,以形成數(shù)據(jù)管道。
4)數(shù)據(jù)管道可以模塊化并根據(jù)您的需求進行定制。
5)生成器可用于無限生成值。
結(jié)論
生成器不必是復(fù)雜的主題,只要有時間可以理解,它們就可以在任何Python程序員的作品集中占有一席之地。即使在大數(shù)據(jù)情況下,更簡單的方法也無法滿足需求,基于生成器的分析仍然非常重要。我們在這里沒有討論很多有關(guān)生成器的信息,但是它仍然應(yīng)該為您在自己的分析生活中開始使用它們提供良好的基礎(chǔ)。