欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python進(jìn)階之推導(dǎo)式的實(shí)現(xiàn)

 更新時(shí)間:2025年08月24日 08:23:29   作者:青銅發(fā)條  
Python推導(dǎo)式是一種簡(jiǎn)潔高效的數(shù)據(jù)處理語法,包括列表、字典、集合和生成器四種形式,下面就具體來介紹一下,感興趣的可以了解一下

一、推導(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)鍵字提取方式

    今天小編就為大家分享一篇python數(shù)據(jù)分析:關(guān)鍵字提取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 使用Numpy讀取CSV文件,并進(jìn)行行列刪除的操作方法

    使用Numpy讀取CSV文件,并進(jìn)行行列刪除的操作方法

    今天小編就為大家分享一篇使用Numpy讀取CSV文件,并進(jìn)行行列刪除的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python多線程同步Lock、RLock、Semaphore、Event實(shí)例

    Python多線程同步Lock、RLock、Semaphore、Event實(shí)例

    這篇文章主要介紹了Python多線程同步Lock、RLock、Semaphore、Event實(shí)例,Lock & RLock 用來確保多線程多共享資源的訪問,Semaphore用來確保一定資源多線程訪問時(shí)的上限,Event是最簡(jiǎn)單的線程間通信的方式,需要的朋友可以參考下
    2014-11-11
  • Python的列表和元組詳情

    Python的列表和元組詳情

    這篇文章主要介紹了Python的列表和元組,列表和元組是python組常見的內(nèi)置內(nèi)省,下面文章我們講圍繞Python的列表和元組的相關(guān)資料展開話題,感興趣的小伙伴以參考一下
    2021-10-10
  • Python中跳臺(tái)階、變態(tài)跳臺(tái)階與矩形覆蓋問題的解決方法

    Python中跳臺(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-05
  • PyTorch學(xué)習(xí)筆記之回歸實(shí)戰(zhàn)

    PyTorch學(xué)習(xí)筆記之回歸實(shí)戰(zhàn)

    這篇文章主要介紹了PyTorch學(xué)習(xí)筆記之回歸實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 在Python的Flask框架下收發(fā)電子郵件的教程

    在Python的Flask框架下收發(fā)電子郵件的教程

    這篇文章主要介紹了在Python的Flask框架下收發(fā)電子郵件的教程,主要用到了Flask中的Flask-mail工具,需要的朋友可以參考下
    2015-04-04
  • python兩種注釋用法的示例

    python兩種注釋用法的示例

    這篇文章主要介紹了python兩種注釋用法的示例,幫助大家開始學(xué)習(xí)和使用python 注釋,感興趣的朋友可以了解下
    2020-10-10
  • python3.9實(shí)現(xiàn)pyinstaller打包python文件成exe

    python3.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-12
  • Django User 模塊之 AbstractUser 擴(kuò)展詳解

    Django User 模塊之 AbstractUser 擴(kuò)展詳解

    這篇文章主要介紹了Django User 模塊之 AbstractUser 擴(kuò)展詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03

最新評(píng)論