全文共 2568 字,預計學習時長 5 分鐘或更長
?
?
Python中的解析式
解析式是允許在其他序列中構建序列的結構。Python 2.0介紹了列表解析式的概念,Python 3.0中進一步介紹了字典和集合解析式。
?
Pyhon中的解析式類型
為什么解析式如此強大?本文將通過一個例子試著理解這一點。大家都知道Python提供了各種表達列表的方法。例如:
· 可以明確地將整件事寫成:
squares = [0, 1, 4, 9, 25]
· 或者,編寫for循環以創建列表:
squares = []
for num in range(6):
squares.append(num*num)
· 創建列表的另一種方法是使用單行代碼。
squares = [num*num for num in range(6)]
上面的這個單行叫做列表解析式,是創建列表的便捷方式。它不再依賴循環并精簡了代碼。下一部分將深入探討列表的概念以及Python 3中提供的其他類型的解析式。
?
列表解析式是一種以簡潔的方式在Python中定義和創建列表的方法。大多數情況下,列表解析式可以僅在一行代碼中創建列表,無需擔心初始化列表或設置循環。
列表解析式包括以下幾個部分:
?
列表解析式的各個部分
比如說,需要找到前五個偶數的平方。如上一節所示,有兩種方法可以做到這一點:使用顯式的for循環或使用列表解析式。兩種方法都試試看吧。
· 使用循環
even_squares = []
>>> for num in range(11):
... if num%2 == 0:
... even_squares.append(num * num)>>> even_squares
[0, 4, 16, 36, 64, 100]
· 使用列表解析式
even_squares = [num * num for num in range(11) if num%2 == 0]
even_squares
[0, 4, 16, 36, 64, 100]
如果仔細觀察,可以看出只需重新排列For循環就可以創建列表解析式。
?
列表解析式是Python中對集合應用的一種符號表示方法,就好像數學中用到的集合表示方法。
?
與數學中集合的相似性
一起實踐嘗試并看一些列表解析式幫助下創建列表的例子吧。
創造畢達哥拉斯三元數組
畢達哥拉斯三元數組由三個正整數a,b和c組成,而且a2+b2=c2。通常這樣的三元數組寫成(a,b,c)的形式,例如(3,4,5)。
[(a,b,c) for a in range(1,30) for b in range(1,30) for c in range(1,30)if a**2 + b**2 == c**2][(3, 4, 5), (4, 3, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 6, 10), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 5, 13), (12, 9, 15), (12, 16, 20), (15, 8, 17), (15, 20, 25),(16, 12, 20), (20, 15, 25),(20, 21, 29), (21, 20, 29), (24, 7, 25), (24, 10, 26)]
?
帶字符串的列表解析式
· 將字符串中的小寫字母轉換為大寫字母。
colors = ["pink", "white", "blue", "black", purple"]
[color.upper() for color in colors]
['RED', 'GREEN', 'BLUE', 'PURPLE']
· 交換給定列表中的名和姓。
presidents_usa = ["George Washington", "John Adams","Thomas Jefferson","James Madison","James Monroe","John Adams","Andrew Jackson"]split_names = [name.split(" ") for name in presidents_usa]
swapped_list = [split_name[1] + " " + split_name[0] for split_name in split_names]swapped_list['Washington George', 'Adams John', 'Jefferson Thomas', 'Madison James', 'Monroe James', 'Adams John', 'Jackson Andrew']
含有元組的列表解析式
如果表達式包含元組(例如(x,y)),則必須用括號括起來。
# Convert height from cms to feet using List Comprehension : 1 cm = 0.0328 feetheight_in_cms = [('Tom',183),('Daisy',171),('Margaret',179),('Michael',190),('Nick',165)]height_in_feet = [(height[0],round(height[1]*0.0328,1)) for height in height_in_cms]height_in_feet[('Tom', 6.0), ('Daisy', 5.6), ('Margaret', 5.9), ('Michael', 6.2), ('Nick', 5.4)]
?
嵌套列表解析式
列表解析式也可以嵌套以創建復雜的列表。例如,可以僅使用列表解析式來構建矩陣。
· 構建一個3x3的矩陣
matrix = [[j * j+i for j in range(3)] for i in range(3)]
matrix[[0, 1, 4], [1, 2, 5], [2, 3, 6]]
?
集合解析式
集合解析式類似于列表解析式,但返回的是集合而不是列表。意義上來說語法略有不同,創建集合解析式用花括號而不是方括號。
思考包含以下人名的列表:
names = [ 'Arnold', 'BILL', 'alice', 'arnold', 'MARY', 'J', 'BIll' ,'maRy']
該列表包含許多重復項,并且有的名字只有一個字母。目前想要的是一個由長于一個字母且僅首字母大寫的名字組成的列表。為了完成這項任務,采用了集合解析式。
{name.capitalize() for name in names if len(name) > 1}{'Alice', 'Arnold', 'Bill', 'Mary'}
?
字典解析式 { }
當輸入采用字典或鍵:值對的形式時,使用字典解析式。例如,思考這樣一個字典,其中鍵表示字符,值表示這些字符出現在語料庫中的次數。
char_dict = {'A' : 4,'z': 2, 'D' : 8, 'a': 5, 'Z' : 10 }
字典char_dict由大寫和小寫字母組成。在此想要計算字母的總出現次數,不管它們是大寫還是小寫。本文使用字典解析式來實現這個目標:
{ k.lower() : char_dict.get(k.lower(), 0) + char_dict.get(k.upper(), 0) for k in char_dict.keys()}{'a': 9, 'z': 12, 'd': 8}
?
生成器解析式 ( )
列表解析是列表,因為生成器表達式是生成器。生成器函數從給定序列一次一個地輸出值,而不是一次性全部輸出。這是一篇很好的文章,它解釋了Python中Generators的細節。
生成器解析式的語法和工作方式就像列表解析式一樣,只不過它們使用圓括號而不是方括號。假設想要計算前十個自然數的平方和。
# Sum of first ten natural numbers using List Comprehensionssum([num**2 for num in range(11)])
385
如果我們使用任何其他可迭代而不一定是列表,結果將是相同的。
sum({num**2 for num in range(11)})
385
現在,如果使用生成器解析式來計算前十個自然數的平方,那么它將是這樣的:
squares = (num**2 for num in range(11))
squaressquares
與列表解析式不同,生成器解析式不返回列表而是返回生成器對象。為了得到結果,可以使用上面的表達式和sum函數。
sum(n ** 2 for n in numbers)
38
看看如何擺脫上面表達式中的冗余括號,使代碼更有效。
?
最后,不要過度使用解析式
列表解析式是減少代碼長度的有效方法。它們還使代碼更具可讀性。但有些情況下不用它也能輕松地達成目的。
當程序的邏輯太長時,不建議使用解析式。使用解析式的主要目的是縮短代碼。但是,當開始將過多的代碼打包到單個語句中時,傾向于犧牲代碼的可讀性。在這種情況下,for循環是更優選擇。案例詳解:理解Python中的“解析式”
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
