30天拿下Python之推導式

概述

在上一節(jié)仿滔,我們介紹了Python的迭代器和生成器,包括:使用迭代器犹芹、創(chuàng)建迭代器崎页、創(chuàng)建生成器、使用生成器等內(nèi)容腰埂。在這一節(jié)中飒焦,我們將介紹Python的推導式。Python的推導式是一種簡潔屿笼、強大的表達式牺荠,是編寫復雜迭代邏輯的簡潔方式,也是Python語言的一大特色驴一,可以用于生成列表休雌、元組、集合和字典肝断。
推導式是一種在Python中用于創(chuàng)建新的數(shù)據(jù)結構的表達式杈曲,通過使用for循環(huán)和if語句來從已有的數(shù)據(jù)中創(chuàng)建新的數(shù)據(jù)。推導式在語法上與普通的表達式有些類似胸懈,但是它有一個特殊的語法結構鱼蝉,可以讓我們在表達式中執(zhí)行更復雜的操作。
推導式的定義非常簡單箫荡,它由一個for循環(huán)和一個可選的if語句組成魁亦。我們可以在for循環(huán)中迭代一個可迭代對象,并在if語句中添加一些條件來篩選出我們想要的數(shù)據(jù)羔挡。

列表推導式

列表推導式的基本語法如下:

[expression for item in iterable if condition]

下面對上述語法中的各個元素作一個簡單的介紹洁奈。
expression:是一個表達式,用于對每個item進行計算并生成一個新的元素绞灼。
item:是一個變量利术,在iterable中取值。
iterable:是一個可迭代對象低矮,比如:列表印叁、元組、集合等。
condition:是一個條件表達式轮蜕,用于篩選出滿足條件的元素昨悼。它是可選的,如果省略跃洛,則不進行篩選率触。
在下面的示例代碼中,我們使用列表推導式生成一個包含1到10之間的奇數(shù)的列表汇竭。其中葱蝗,expression是x,
item是range(1, 10)中的每個元素细燎,iterable是range(1, 10)两曼,condition是 x % 2 != 0,最終生成的列表包含1到10中的所有奇數(shù)玻驻。

odd_number = [x for x in range(1, 10) if x % 2 != 0]
# 輸出: [1, 3, 5, 7, 9]
print(odd_number)

再來看下面的示例代碼合愈,我們使用列表推導式生成了1到5的立方值。

cubed_number = [x**3 for x in range(1, 6)]
# 輸出:[1, 8, 27, 64, 125]
print(cubed_number)

元組推導式

元組推導式與列表推導式類似击狮,但是它用來生成元組佛析。元組是一種不可變的序列類型,可以包含任何類型的元素彪蓬。
元組推導式的語法如下:

(expression for item in iterable if condition)

這與列表推導式非常相似寸莫,主要區(qū)別在于使用圓括號而不是方括號來創(chuàng)建元組。與列表推導式不同的是档冬,元組推導式返回的結果是一個生成器對象膘茎,需要使用tuple()函數(shù),將生成器對象轉換為元組酷誓。
在下面的示例代碼中披坏,我們創(chuàng)建了一個元組,其顏色字符串的長度值大于等于5盐数。

all_colors = ['red', 'blue', 'pink', 'purple', 'white']
passed_colors = (item + ' passed' for item in all_colors if len(item) >= 5)
# 返回一個生成器對象棒拂,輸出:<generator object <genexpr> at 0x000001BD9F422B20>  
print(passed_colors)
# 轉換為元組,,輸出:('purple passed', 'white passed')
print(tuple(passed_colors))

集合推導式

集合推導式是一種創(chuàng)建集合的簡潔方式玫氢,它允許你通過一個表達式來定義集合的元素帚屉,通常用于從已有的數(shù)據(jù)中創(chuàng)建新的集合。
集合推導式的語法如下:

{expression for item in iterable if condition}

其中漾峡,expression是一個用于生成每個元素的表達式攻旦,item是iterable中的元素,iterable是要迭代的序列生逸,condition是一個可選的條件表達式牢屋,用于過濾序列中的元素且预。
在下面的示例代碼中,我們有一個所有水果的列表烙无,然后使用集合推導式生成了一個名稱長度為奇數(shù)的水果的集合锋谐。

def is_odd_len(s):
    return len(s) % 2 == 1

all_fruits = ['pineapple', 'banana', 'cherry', 'watermelon', 'dates']
odd_len_fruits = {item for item in all_fruits if is_odd_len(item)}
# 輸出:{'pineapple', 'dates'}
print(odd_len_fruits)

字典推導式

字典推導式是一種創(chuàng)建字典的簡潔方式,它允許你通過一個表達式來定義字典的鍵值對皱炉,這個表達式通常包含一個循環(huán)和一個條件判斷。
字典推導式的語法如下:

{key_expression: value_expression for item in iterable if condition}

其中狮鸭,key_expression和value_expression是用于生成每個鍵值對的表達式合搅,item是iterable中的元素,iterable是要迭代的序列歧蕉,condition是一個可選的條件表達式灾部,用于過濾序列中的元素。

text = "hello world by hope_wisdom"
word_len_dict = {item: len(item) for item in text.split()}
# 輸出:{'hello': 5, 'world': 5, 'by': 2, 'hope_wisdom': 11}
print(word_len_dict)

條件推導式

條件推導式是一種簡潔的語法惯退,用于根據(jù)條件選擇不同的表達式結果赌髓。它類似于三元運算符(expr1 if condition else expr2),但具有更廣泛的用途催跪。
條件推導式的語法如下:

[expression1 if condition else expression2 for item in iterable]

其中锁蠕,expression1和expression2是兩個可選的表達式,condition是一個條件表達式懊蒸,item是iterable中的元素荣倾。
在下面的示例代碼中,對于列表中的每個元素骑丸,如果元素是偶數(shù)舌仍,則返回該元素的平方,否則返回該元素本身通危。

numbers = [1, 2, 3, 4, 5]
even_squares = [x**2 if x % 2 == 0 else x for x in numbers]
# 輸出 [1, 4, 3, 16, 5]
print(even_squares)
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铸豁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菊碟,更是在濱河造成了極大的恐慌节芥,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逆害,死亡現(xiàn)場離奇詭異藏古,居然都是意外死亡,警方通過查閱死者的電腦和手機忍燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門拧晕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梅垄,你說我怎么就攤上這事厂捞∈溏瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵靡馁,是天一觀的道長欲鹏。 經(jīng)常有香客問我,道長臭墨,這世上最難降的妖魔是什么赔嚎? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮胧弛,結果婚禮上尤误,老公的妹妹穿的比我還像新娘。我一直安慰自己结缚,他們只是感情好损晤,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著红竭,像睡著了一般尤勋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茵宪,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天最冰,我揣著相機與錄音,去河邊找鬼稀火。 笑死锌奴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的憾股。 我是一名探鬼主播鹿蜀,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼服球!你這毒婦竟也來了茴恰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斩熊,失蹤者是張志新(化名)和其女友劉穎往枣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粉渠,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡分冈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霸株。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕沉。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖去件,靈堂內(nèi)的尸體忽然破棺而出坡椒,到底是詐尸還是另有隱情扰路,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布倔叼,位于F島的核電站汗唱,受9級特大地震影響,放射性物質發(fā)生泄漏丈攒。R本人自食惡果不足惜哩罪,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巡验。 院中可真熱鬧际插,春花似錦、人聲如沸深碱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敷硅。三九已至,卻和暖如春愉阎,著一層夾襖步出監(jiān)牢的瞬間绞蹦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工榜旦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幽七,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓溅呢,卻偏偏與公主長得像澡屡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咐旧,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容