概述
在上一節(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)