亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

案例詳解:理解Python中的“解析式”

系統(tǒng) 2124 0

全文共 2568 字,預(yù)計(jì)學(xué)習(xí)時(shí)長(zhǎng) 5 分鐘或更長(zhǎng)

?

案例詳解:理解Python中的“解析式”_第1張圖片 圖片來(lái)源:Pixabay/Gerd Altmann

本篇文章將詳細(xì)介紹解析式的基本要素及其各種形式。

?

Python中的解析式

解析式是允許在其他序列中構(gòu)建序列的結(jié)構(gòu)。Python 2.0介紹了列表解析式的概念,Python 3.0中進(jìn)一步介紹了字典和集合解析式。

?

案例詳解:理解Python中的“解析式”_第2張圖片

Pyhon中的解析式類型

為什么解析式如此強(qiáng)大?本文將通過(guò)一個(gè)例子試著理解這一點(diǎn)。大家都知道Python提供了各種表達(dá)列表的方法。例如:

· 可以明確地將整件事寫(xiě)成:

squares = [0, 1, 4, 9, 25]

· 或者,編寫(xiě)for循環(huán)以創(chuàng)建列表:

squares = []

for num in range(6):

squares.append(num*num)

· 創(chuàng)建列表的另一種方法是使用單行代碼。

squares = [num*num for num in range(6)]

上面的這個(gè)單行叫做列表解析式,是創(chuàng)建列表的便捷方式。它不再依賴循環(huán)并精簡(jiǎn)了代碼。下一部分將深入探討列表的概念以及Python 3中提供的其他類型的解析式。

?

列表解析式

列表解析式是一種以簡(jiǎn)潔的方式在Python中定義和創(chuàng)建列表的方法。大多數(shù)情況下,列表解析式可以僅在一行代碼中創(chuàng)建列表,無(wú)需擔(dān)心初始化列表或設(shè)置循環(huán)。

列表解析式包括以下幾個(gè)部分:

案例詳解:理解Python中的“解析式”_第3張圖片

?

列表解析式的各個(gè)部分

比如說(shuō),需要找到前五個(gè)偶數(shù)的平方。如上一節(jié)所示,有兩種方法可以做到這一點(diǎn):使用顯式的for循環(huán)或使用列表解析式。兩種方法都試試看吧。

· 使用循環(huán)

even_squares = []

>>> for num in range(11):

... if num%2 == 0:

... even_squares.append(num * num)>>> even_squares

[0, 4, 16, 36, 64, 100]

· 使用列表解析式

案例詳解:理解Python中的“解析式”_第4張圖片

even_squares = [num * num for num in range(11) if num%2 == 0]

even_squares

[0, 4, 16, 36, 64, 100]

如果仔細(xì)觀察,可以看出只需重新排列For循環(huán)就可以創(chuàng)建列表解析式。

?

列表解析式是Python中對(duì)集合應(yīng)用的一種符號(hào)表示方法,就好像數(shù)學(xué)中用到的集合表示方法。

?

案例詳解:理解Python中的“解析式”_第5張圖片

與數(shù)學(xué)中集合的相似性

一起實(shí)踐嘗試并看一些列表解析式幫助下創(chuàng)建列表的例子吧。

創(chuàng)造畢達(dá)哥拉斯三元數(shù)組

畢達(dá)哥拉斯三元數(shù)組由三個(gè)正整數(shù)a,b和c組成,而且a2+b2=c2。通常這樣的三元數(shù)組寫(xiě)成(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)]

?

帶字符串的列表解析式

· 將字符串中的小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母。

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']

含有元組的列表解析式

如果表達(dá)式包含元組(例如(x,y)),則必須用括號(hào)括起來(lái)。

# 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)]

?

嵌套列表解析式

列表解析式也可以嵌套以創(chuàng)建復(fù)雜的列表。例如,可以僅使用列表解析式來(lái)構(gòu)建矩陣。

· 構(gòu)建一個(gè)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]]

?

集合解析式

集合解析式類似于列表解析式,但返回的是集合而不是列表。意義上來(lái)說(shuō)語(yǔ)法略有不同,創(chuàng)建集合解析式用花括號(hào)而不是方括號(hào)。

思考包含以下人名的列表:

names = [ 'Arnold', 'BILL', 'alice', 'arnold', 'MARY', 'J', 'BIll' ,'maRy']

該列表包含許多重復(fù)項(xiàng),并且有的名字只有一個(gè)字母。目前想要的是一個(gè)由長(zhǎng)于一個(gè)字母且僅首字母大寫(xiě)的名字組成的列表。為了完成這項(xiàng)任務(wù),采用了集合解析式。

{name.capitalize() for name in names if len(name) > 1}{'Alice', 'Arnold', 'Bill', 'Mary'}

?

字典解析式 { }

當(dāng)輸入采用字典或鍵:值對(duì)的形式時(shí),使用字典解析式。例如,思考這樣一個(gè)字典,其中鍵表示字符,值表示這些字符出現(xiàn)在語(yǔ)料庫(kù)中的次數(shù)。

char_dict = {'A' : 4,'z': 2, 'D' : 8, 'a': 5, 'Z' : 10 }

字典char_dict由大寫(xiě)和小寫(xiě)字母組成。在此想要計(jì)算字母的總出現(xiàn)次數(shù),不管它們是大寫(xiě)還是小寫(xiě)。本文使用字典解析式來(lái)實(shí)現(xiàn)這個(gè)目標(biāo):

{ 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}

?

生成器解析式 ( )

列表解析是列表,因?yàn)樯善鞅磉_(dá)式是生成器。生成器函數(shù)從給定序列一次一個(gè)地輸出值,而不是一次性全部輸出。這是一篇很好的文章,它解釋了Python中Generators的細(xì)節(jié)。

生成器解析式的語(yǔ)法和工作方式就像列表解析式一樣,只不過(guò)它們使用圓括號(hào)而不是方括號(hào)。假設(shè)想要計(jì)算前十個(gè)自然數(shù)的平方和。

# Sum of first ten natural numbers using List Comprehensionssum([num**2 for num in range(11)])

385

如果我們使用任何其他可迭代而不一定是列表,結(jié)果將是相同的。

sum({num**2 for num in range(11)})

385

現(xiàn)在,如果使用生成器解析式來(lái)計(jì)算前十個(gè)自然數(shù)的平方,那么它將是這樣的:

squares = (num**2 for num in range(11))

squaressquares

at 0x1159536d8>

與列表解析式不同,生成器解析式不返回列表而是返回生成器對(duì)象。為了得到結(jié)果,可以使用上面的表達(dá)式和sum函數(shù)。

sum(n ** 2 for n in numbers)

38

看看如何擺脫上面表達(dá)式中的冗余括號(hào),使代碼更有效。

?

最后,不要過(guò)度使用解析式

列表解析式是減少代碼長(zhǎng)度的有效方法。它們還使代碼更具可讀性。但有些情況下不用它也能輕松地達(dá)成目的。

當(dāng)程序的邏輯太長(zhǎng)時(shí),不建議使用解析式。使用解析式的主要目的是縮短代碼。但是,當(dāng)開(kāi)始將過(guò)多的代碼打包到單個(gè)語(yǔ)句中時(shí),傾向于犧牲代碼的可讀性。在這種情況下,for循環(huán)是更優(yōu)選擇。案例詳解:理解Python中的“解析式”

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 羞羞视频免费网站在线 | 香蕉免费看一区二区三区 | 曰本亚洲欧洲色a在线 | 欧美日韩一区二区三区毛片 | 精品一区二区三区视频在线观看 | 天海冀一二三区 | 欧美精品另类 | 国产日韩欧美一区 | 欧美成人午夜做爰视频在线观看 | 久久精品福利视频 | 女人18毛片一级毛片在线 | 欧美同房免姿势108费视频 | 天天躁日日躁狠狠躁中文字幕 | 狠狠色噜噜狠狠狠狠69 | 亚洲国产成人精彩精品 | 国产精品久久久久不卡绿巨人 | 伊人久久大香线蕉亚洲 | 日日夜夜网站 | 思思久久99热这里只有精品66 | 老司机免费福利视频无毒午夜 | 欧美视频一区二区三区在线观看 | 手机在线精品视频每日更新 | 99爱视频在线观看免费播放 | 久久精品国产欧美日韩亚洲 | 成人午夜毛片 | 久操免费在线观看 | 一级特黄特黄的大片免费 | 青青青精品免费视频 | 久久99精品国产麻豆宅宅 | 噜噜噜天天躁狠狠躁夜夜精品 | 国产亚洲男人的天堂在线观看 | 久久精品亚洲精品国产欧美 | 欧美一级特黄真人毛片 | 国产一区二区精品久久 | 在线99| 毛片毛片毛片毛片 | 操美女免费看 | 黄色综合 | 偷拍肉窝窝视频在线播放 | 国产欧美久久一区二区 | 久久综合97色综合网 |