python進(jìn)階之推導(dǎo)式的實(shí)現(xiàn)
一、推導(dǎo)式介紹
Python推導(dǎo)式(Comprehension)是一種簡(jiǎn)潔、優(yōu)雅的語(yǔ)法結(jié)構(gòu),可以用單行代碼快速創(chuàng)建列表、字典、集合等數(shù)據(jù)結(jié)構(gòu)。它基于現(xiàn)有的可迭代對(duì)象,通過(guò)表達(dá)式和條件語(yǔ)句來(lái)生成新的數(shù)據(jù)集合。
不僅讓代碼更加簡(jiǎn)潔易讀,而且在大多數(shù)情況下比傳統(tǒng)的循環(huán)方式執(zhí)行效率更高。
二、推導(dǎo)式的用法
Python 推導(dǎo)式是一種獨(dú)特的數(shù)據(jù)處理方式,可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列的結(jié)構(gòu)體。
Python 支持推導(dǎo)式的數(shù)據(jù)結(jié)構(gòu)有:
- 列表(list)推導(dǎo)式
- 字典(dict)推導(dǎo)式
- 集合(set)推導(dǎo)式
- 元組(tuple)推導(dǎo)式
2.1 列表推導(dǎo)式
列表推導(dǎo)式是最常見(jiàn)的形式,用于創(chuàng)建新的列表。
基本語(yǔ)法:
[expression for item in iterable if condition]
示例:
# 傳統(tǒng)方式
squares = []
for x in range(10):
squares.append(x**2)
# 列表推導(dǎo)式
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]帶條件的列表推導(dǎo)式:
# 只保留偶數(shù)平方 even_squares = [x**2 for x in range(10) if x % 2 == 0] print(even_squares) # [0, 4, 16, 36, 64] # 使用條件表達(dá)式 results = ["偶數(shù)" if x % 2 == 0 else "奇數(shù)" for x in range(5)] print(results) # ['偶數(shù)', '奇數(shù)', '偶數(shù)', '奇數(shù)', '偶數(shù)']
嵌套循環(huán)的列表推導(dǎo)式:
# 生成所有可能的坐標(biāo)對(duì) coordinates = [(x, y) for x in range(3) for y in range(3)] print(coordinates) # [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
2.2 字典推導(dǎo)式
字典推導(dǎo)式用于創(chuàng)建字典,語(yǔ)法與列表推導(dǎo)式類似。
基本語(yǔ)法:
{key_expression: value_expression for item in iterable if condition}示例:
# 創(chuàng)建數(shù)字到其平方的映射
squares_dict = {x: x**2 for x in range(5)}
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 反轉(zhuǎn)字典的鍵和值
original = {'a': 1, 'b': 2, 'c': 3}
reversed_dict = {v: k for k, v in original.items()}
print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'}
# 帶條件的字典推導(dǎo)式
even_squares = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}2.3 集合推導(dǎo)式
集合推導(dǎo)式用于創(chuàng)建集合,會(huì)自動(dòng)去除重復(fù)元素。
基本語(yǔ)法:
{expression for item in iterable if condition}示例:
# 從列表中創(chuàng)建不重復(fù)的平方數(shù)集合
numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
unique_squares = {x**2 for x in numbers}
print(unique_squares) # {16, 1, 9, 4}
# 帶條件的集合推導(dǎo)式
even_squares = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares) # {0, 64, 4, 36, 16}2.4 生成器表達(dá)式
生成器表達(dá)式使用圓括號(hào),與列表推導(dǎo)式類似,但返回一個(gè)生成器對(duì)象,按需生成值,節(jié)省內(nèi)存。
基本語(yǔ)法:
(expression for item in iterable if condition)
示例:
# 創(chuàng)建生成器 squares_gen = (x**2 for x in range(10)) # 使用生成器 print(next(squares_gen)) # 0 print(next(squares_gen)) # 1 # 可以轉(zhuǎn)換為列表 print(list(squares_gen)) # [4, 9, 16, 25, 36, 49, 64, 81] # 在函數(shù)中使用 total = sum(x**2 for x in range(10)) print(total) # 285
三、推導(dǎo)式的嵌套和復(fù)雜用法
3.1 嵌套推導(dǎo)式
# 二維列表展平 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] flattened = [num for row in matrix for num in row] print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9] # 轉(zhuǎn)置矩陣 transposed = [[row[i] for row in matrix] for i in range(3)] print(transposed) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
3.2 多重條件推導(dǎo)式
# 多個(gè)條件
numbers = [x for x in range(20) if x % 2 == 0 if x % 3 == 0]
print(numbers) # [0, 6, 12, 18]
# 復(fù)雜的條件表達(dá)式
categorized = ["大偶數(shù)" if x > 5 and x % 2 == 0 else
"小偶數(shù)" if x % 2 == 0 else
"大奇數(shù)" if x > 5 else
"小奇數(shù)" for x in range(10)]
print(categorized)四、推導(dǎo)式對(duì)比傳統(tǒng)循環(huán)
4.1 性能比較
推導(dǎo)式通常比等效的循環(huán)更快,因?yàn)樗鼈冊(cè)诘讓邮褂昧藘?yōu)化的C代碼。
import timeit
# 測(cè)試列表推導(dǎo)式性能
list_comp_time = timeit.timeit('[x**2 for x in range(1000)]', number=10000)
loop_time = timeit.timeit('''
result = []
for x in range(1000):
result.append(x**2)
''', number=10000)
print(f"列表推導(dǎo)式: {list_comp_time:.3f}秒")
print(f"傳統(tǒng)循環(huán): {loop_time:.3f}秒")4.2 可讀性比較
雖然推導(dǎo)式更簡(jiǎn)潔,但過(guò)度復(fù)雜的推導(dǎo)式可能會(huì)降低可讀性:
# 可讀性好的推導(dǎo)式 good_example = [x**2 for x in range(10) if x % 2 == 0] # 過(guò)于復(fù)雜的推導(dǎo)式(不推薦) bad_example = [[x*y for y in range(10) if y % 2 == 0] for x in range(10) if x % 3 == 0]
建議:當(dāng)推導(dǎo)式變得復(fù)雜難以理解時(shí),考慮使用傳統(tǒng)的循環(huán)結(jié)構(gòu)。
五、常見(jiàn)應(yīng)用場(chǎng)景
5.1 數(shù)據(jù)清洗和轉(zhuǎn)換
# 從字符串中提取數(shù)字并轉(zhuǎn)換為整數(shù)
data = ["價(jià)格: 100元", "重量: 2.5kg", "數(shù)量: 15個(gè)"]
numbers = [float(''.join(filter(str.isdigit, item))) for item in data]
print(numbers) # [100.0, 25.0, 15.0]5.2 文件處理
# 讀取文件并處理行
with open('data.txt', 'r') as file:
lines = [line.strip().upper() for line in file if line.strip()]5.3 API數(shù)據(jù)處理
# 從API響應(yīng)中提取特定信息
api_response = [
{'name': 'Alice', 'age': 25, 'active': True},
{'name': 'Bob', 'age': 30, 'active': False},
{'name': 'Charlie', 'age': 35, 'active': True}
]
active_users = [user['name'] for user in api_response if user['active']]
print(active_users) # ['Alice', 'Charlie']六、注意事項(xiàng)
- 避免過(guò)度復(fù)雜:如果推導(dǎo)式變得難以閱讀,考慮使用傳統(tǒng)循環(huán)
- 注意內(nèi)存使用:大型數(shù)據(jù)集考慮使用生成器表達(dá)式
- 保持可讀性:適當(dāng)?shù)目崭窈蛽Q行可以提高復(fù)雜推導(dǎo)式的可讀性
- 不要濫用:推導(dǎo)式不是所有循環(huán)的替代品,選擇合適的工具
# 可讀性更好的復(fù)雜推導(dǎo)式
result = [
(x, y, z)
for x in range(10)
for y in range(10)
for z in range(10)
if x + y + z > 15
and x % 2 == 0
and y % 2 != 0
]
print(result)參考
到此這篇關(guān)于python進(jìn)階之推導(dǎo)式的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)python 推導(dǎo)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)python字典過(guò)濾條件的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python字典過(guò)濾條件的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
python基于socket實(shí)現(xiàn)網(wǎng)絡(luò)廣播的方法
這篇文章主要介紹了python基于socket實(shí)現(xiàn)網(wǎng)絡(luò)廣播的方法,涉及Python操作socket的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
利用PyQt中的QThread類實(shí)現(xiàn)多線程
本文主要給大家分享的是python實(shí)現(xiàn)多線程及線程間通信的簡(jiǎn)單方法,非常的實(shí)用,有需要的小伙伴可以參考下2020-02-02
Django Admin 實(shí)現(xiàn)外鍵過(guò)濾的方法
下面小編就為大家?guī)?lái)一篇Django Admin 實(shí)現(xiàn)外鍵過(guò)濾的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
python按照多個(gè)字符對(duì)字符串進(jìn)行分割的方法
這篇文章主要介紹了python按照多個(gè)字符對(duì)字符串進(jìn)行分割的方法,涉及Python中正則表達(dá)式匹配的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
python從內(nèi)存地址上加載python對(duì)象過(guò)程詳解
這篇文章主要介紹了python從內(nèi)存地址上加載pythn對(duì)象過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01

