python進(jìn)階之推導(dǎo)式的實(shí)現(xiàn)
一、推導(dǎo)式介紹
Python推導(dǎo)式(Comprehension)是一種簡(jiǎn)潔、優(yōu)雅的語法結(jié)構(gòu),可以用單行代碼快速創(chuàng)建列表、字典、集合等數(shù)據(jù)結(jié)構(gòu)。它基于現(xiàn)有的可迭代對(duì)象,通過表達(dá)式和條件語句來生成新的數(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)式是最常見的形式,用于創(chuàng)建新的列表。
基本語法:
[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)建字典,語法與列表推導(dǎo)式類似。
基本語法:
{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ù)元素。
基本語法:
{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)存。
基本語法:
(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)潔,但過度復(fù)雜的推導(dǎo)式可能會(huì)降低可讀性:
# 可讀性好的推導(dǎo)式 good_example = [x**2 for x in range(10) if x % 2 == 0] # 過于復(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)。
五、常見應(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)
- 避免過度復(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)文章
python數(shù)據(jù)分析:關(guān)鍵字提取方式
今天小編就為大家分享一篇python數(shù)據(jù)分析:關(guān)鍵字提取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02使用Numpy讀取CSV文件,并進(jìn)行行列刪除的操作方法
今天小編就為大家分享一篇使用Numpy讀取CSV文件,并進(jìn)行行列刪除的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07Python多線程同步Lock、RLock、Semaphore、Event實(shí)例
這篇文章主要介紹了Python多線程同步Lock、RLock、Semaphore、Event實(shí)例,Lock & RLock 用來確保多線程多共享資源的訪問,Semaphore用來確保一定資源多線程訪問時(shí)的上限,Event是最簡(jiǎn)單的線程間通信的方式,需要的朋友可以參考下2014-11-11Python中跳臺(tái)階、變態(tài)跳臺(tái)階與矩形覆蓋問題的解決方法
這篇文章主要給大家介紹了關(guān)于Python中跳臺(tái)階、變態(tài)跳臺(tái)階與矩形覆蓋問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05PyTorch學(xué)習(xí)筆記之回歸實(shí)戰(zhàn)
這篇文章主要介紹了PyTorch學(xué)習(xí)筆記之回歸實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05python3.9實(shí)現(xiàn)pyinstaller打包python文件成exe
這篇文章主要介紹了python3.9實(shí)現(xiàn)pyinstaller打包python文件成exe,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Django User 模塊之 AbstractUser 擴(kuò)展詳解
這篇文章主要介紹了Django User 模塊之 AbstractUser 擴(kuò)展詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03