六星源課堂:Python列表解析式到底該怎么用?
Python 是一種極其多樣化和強大的編程語言!當(dāng)需要解決一個問題時,它有著不同的方法。在本文中,將會展示列表解析式(List Comprehension)。我們將討論如何使用它?什么時候該或不該使用它?
列表解析式的優(yōu)勢
比循環(huán)更節(jié)省時間和空間。
需要更少的代碼行。
可將迭代語句轉(zhuǎn)換為公式。
如何在 Python 中創(chuàng)建列表
列表解析式是一種基于現(xiàn)有列表創(chuàng)建列表的語法結(jié)構(gòu)。讓我們來看看創(chuàng)建列表的不同實現(xiàn)
循環(huán)
循環(huán)是創(chuàng)建列表的傳統(tǒng)方式。不管你使用什么樣的循環(huán)。要以這種方式創(chuàng)建列表,您應(yīng)該:
實例化一個空列表。
循環(huán)遍歷一個可迭代的(如 )的元素。
將每個元素附加到列表的末尾。
輸出:
在此示例中,您實例化了一個空列表 。然后使用 ?循環(huán)迭代 ?并使用 ?方法將每個數(shù)字附加到列表的末尾。
map() 對象
是創(chuàng)建列表的另一種方法。您需要向 ?傳遞一個函數(shù)和一個可迭代對象,之后它會創(chuàng)建一個對象。該對象包含使用指定函數(shù)執(zhí)行每個迭代元素所獲得的輸出。
例如,我們將呈現(xiàn)在某些產(chǎn)品的價格中增加增值稅的任務(wù)。
您已經(jīng)構(gòu)建了 ?函數(shù)并創(chuàng)建了 ?可迭代對象。您將這兩個參數(shù)都傳遞給 ?并收集生成的 ?對象 ,或者您可以使用 ?輕松地將其轉(zhuǎn)換為列表。
輸出:
列表解析式
現(xiàn)在,讓我們看一下列表解析式方法!這確實是 Python 風(fēng)格,并且是創(chuàng)建列表的更好方法。為了弄清楚這種方法有多強大,我們用一個單行代碼來重寫那個循環(huán)示例。
輸出
正如您所見,這是一種不可思議的方法!列表解析式看起來足夠可讀,您不需要編寫更多代碼,而只需一行。
為了更好地理解列表,請查看以下語法格式:
哪種方法更有效
好的,我們已經(jīng)學(xué)習(xí)了如何使用循環(huán)、 和列表解析式來創(chuàng)建列表,在您的腦海中可能會提出“哪種方法更有效”的問題。我們來分析一下吧!
輸出:
正如我們現(xiàn)在所看到的,創(chuàng)建列表的最優(yōu)的方法是 ,排在第二位的是列表解析式,最后是循環(huán)。
但是,方法的選擇應(yīng)取決于您想要實現(xiàn)的目標(biāo)。
使用 ?可以使你的代碼更高效。
使用循環(huán)可以使代碼的思路展現(xiàn)更加清晰。
使用列表解析式可以您使代碼更加緊湊,且較高效。這是創(chuàng)建列表的最佳方式,因為這種方式可讀性最強。
高級解析式
條件邏輯
早些時候,我向您展示了這個公式:
公式可能有些不完整。對解析式的更加完整描述增加了對可選條件的支持。將條件邏輯添加到列表解析式的最常見方法是在表達式的末尾添加條件:
在這里,您的條件語句正好位于右邊的括號中。
條件很重要,因為它們允許列表解析式過濾掉不需要的值,這在一般情況下也可以調(diào)用 :
輸出:
正如您所看到的那樣,這個解析式收集了可被 2 整除且沒有余數(shù)的數(shù)字。
如果您需要更復(fù)雜的過濾器,那么您甚至可以將條件邏輯移動到單獨的函數(shù)中。
輸出:
您構(gòu)建 ?以確定是否是素數(shù)并返回布爾值。接下來,您應(yīng)該將函數(shù)添加到解析式的條件中。
該公式允許您使用條件邏輯從幾個可能的輸出選項中進行選擇。例如,您有一個產(chǎn)品價格表,若有負數(shù),您應(yīng)將其轉(zhuǎn)換為正數(shù):
輸出:
在這里,您的表達式 ?有一個條件語句,如果 。這會告訴 Python,如果價格為正,則輸出價格值;但如果價格為負,則將價格轉(zhuǎn)換為正值。該功能很強大,考慮將條件邏輯視為其自身的函數(shù)的確是很有用的:
輸出:
集合解析式
您還可以創(chuàng)建一個集合解析式!它基本與列表解析式相同。不同之處在于集合解析式不包含重復(fù)項。您可以通過使用花括號取代方括號來創(chuàng)建集合解析式:
輸出:
你的集合解析式只包含唯一的字母。這與列表不同,集合不保證項目將以特定順序存儲數(shù)據(jù)。這就是為什么集合輸出的第二個字母是 ,即使字符串中的第二個字母是 。
字典解析式
字典解析式也是是類似的,但需要定義一個鍵:
輸出:
要創(chuàng)建 ?字典,請在表達式中使用花括號 () 以及鍵值對 ()。
海象運算符
Python 3.8 中引入的海象運算符允許您一次解決兩個問題:為變量賦值,返回該值。
假設(shè)您需要對將返回溫度數(shù)據(jù)的 API 應(yīng)用十次。您想要的只是 100 華氏度以上的結(jié)果。而每個請求可能都會返回不同的數(shù)據(jù)。在這種情況下,沒有辦法在 Python 中使用列表解析式來解決問題??傻蓡T(如果有條件)的公式表達式無法讓條件將數(shù)據(jù)分配給表達式可以訪問的變量。
海象運算符解決了這個問題。它允許您在執(zhí)行表達式的同時將輸出值分配給變量。以下示例顯示了這是如何實現(xiàn)的,使用 ?生成偽天氣數(shù)據(jù):
輸出:
什么時候不要使用解析式
列表解析式非常有用,它可以幫助您編寫清晰且易于閱讀和調(diào)試的代碼。但在某些情況下,它們可能會使您的代碼運行速度變慢或使用更多內(nèi)存。如果它讓您的代碼效率更低或更難理解,那么可以考慮選擇另一種方式。
注意嵌套的解析式
可以通過嵌套解析式以創(chuàng)建列表、字典和集合的組合集合(譯者注:這個集合不是指 set 對象類型,而是 collection,泛指容器)。例如,假設(shè)一家公司正在跟蹤一年中五個不同城市的收入。存儲這些數(shù)據(jù)的完美數(shù)據(jù)結(jié)構(gòu)可以是嵌套在字典解析式中的列表解析式。
輸出:
您使用字典解析式創(chuàng)建了 ?容器。該表達式是一個鍵值對,其中包含另一個解析式。此代碼將快速生成城市中每個 ?的數(shù)據(jù)列表。
嵌套列表是創(chuàng)建矩陣的常用方法,通常用于數(shù)學(xué)目的。查看下面的代碼塊:
輸出:
外部列表解析式 ?創(chuàng)建了六行,而內(nèi)部列表解析式 ?將用值填充這些行中的每一行。
到目前為止,每個嵌套解析式的目標(biāo)都是真正且直觀的。但是,還有一些其他情況,例如創(chuàng)建扁平化的嵌套列表,其中的邏輯可以使您的代碼非常難以閱讀。讓我們看下面的例子,使用嵌套列表解析式來展平一個矩陣:
輸出:
扁平化矩陣的代碼確實很簡潔,但是太難理解了,您應(yīng)該花點時間弄清楚它是如何工作的。另一方面,如果您使用 ?循環(huán)來展平相同的矩陣,那么您的代碼將更加簡單易讀:
輸出:
現(xiàn)在,您可以看到代碼一次遍歷矩陣的一行,在移動到下一行之前取出該行中的所有元素。
雖然嵌套列表解析式可能看起來更具有 Python 風(fēng)格,但對于能夠編寫出您的團隊可以輕松理解和修改的代碼來才是更加最重要的。當(dāng)選擇一個方法時,您應(yīng)該根據(jù)解析式是有助于還是有損于可讀性來做出相應(yīng)的判斷。
為大型數(shù)據(jù)集使用生成器
Python 中的列表解析式通過將整個列表存儲到內(nèi)存中來工作。對于小型至中型列表這通常很好。如果您想將前一千個整數(shù)相加,那么列表解析式將輕松地解決此任務(wù):
輸出:
但是,如果您需要對十億個數(shù)字求和呢?您可以嘗試執(zhí)行此操作,但您的計算機可能不會有響應(yīng)。這是可能因為計算機中分配大量內(nèi)存。也許您是因為計算機沒有如此多的內(nèi)存資源。
例如,你想要一些第一個十億整數(shù),那么讓我們使用生成器!這可能多需要一些時間,但計算機應(yīng)該可以克服它:
輸出:
讓我們來對比一下哪種方法是更優(yōu)的!
輸出:
正如您所見,生成器比 ?高效得多。
總結(jié)
本文向您介紹了列表解析式,以及如何使用它來解決復(fù)雜的任務(wù),而不會使您的代碼變得過于困難。
現(xiàn)在你:
學(xué)習(xí)了幾種創(chuàng)建列表的替代方法。
找出每種方法的優(yōu)點。
可以簡化循環(huán)和 map() 調(diào)用列表解析式。
理解了一種將條件邏輯添加到解析式中的方法。
可以創(chuàng)建集合和字典解析式。
學(xué)會了何時不使用解析式。
以上就是本次分享的全部內(nèi)容了,希望對你有所幫助,對編程感興趣的小伙伴們可前往六星源課堂獲得更多資訊哦~