溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python推導式知識點有哪些

發布時間:2021-11-25 13:54:29 來源:億速云 閱讀:194 作者:iii 欄目:互聯網科技
# Python推導式知識點有哪些

Python推導式(Comprehensions)是Python中一種簡潔高效的數據結構構建方式,能夠用單行代碼生成列表、字典、集合等數據結構。本文將全面解析Python推導式的核心知識點,包含基礎語法、高級用法、性能對比及實際應用場景。

## 目錄
1. [推導式概述](#1-推導式概述)
2. [列表推導式](#2-列表推導式)
3. [字典推導式](#3-字典推導式)
4. [集合推導式](#4-集合推導式)
5. [生成器表達式](#5-生成器表達式)
6. [嵌套推導式](#6-嵌套推導式)
7. [條件過濾](#7-條件過濾)
8. [性能對比](#8-性能對比)
9. [實際應用場景](#9-實際應用場景)
10. [注意事項](#10-注意事項)

---

## 1. 推導式概述
推導式是Python獨有的語法糖,用于快速構建可迭代對象。主要分為四種類型:
- 列表推導式(List Comprehensions)
- 字典推導式(Dictionary Comprehensions)
- 集合推導式(Set Comprehensions)
- 生成器表達式(Generator Expressions)

**基本語法模式**:
```python
[expression for item in iterable if condition]  # 列表推導式
{key_expr: value_expr for item in iterable}    # 字典推導式
{expression for item in iterable}              # 集合推導式
(expression for item in iterable)              # 生成器表達式

2. 列表推導式

最常用的推導式類型,用于生成列表。

基礎示例

# 生成0-9的平方列表
squares = [x**2 for x in range(10)]
# 輸出: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

帶條件的列表推導式

# 只保留偶數平方
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# 輸出: [0, 4, 16, 36, 64]

多重循環

# 矩陣展平
matrix = [[1, 2], [3, 4], [5, 6]]
flattened = [num for row in matrix for num in row]
# 輸出: [1, 2, 3, 4, 5, 6]

3. 字典推導式

用于快速構建字典對象。

基礎示例

# 創建數字到其平方的映射
square_dict = {x: x**2 for x in range(5)}
# 輸出: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

鍵值反轉

original = {'a': 1, 'b': 2}
reversed_dict = {v: k for k, v in original.items()}
# 輸出: {1: 'a', 2: 'b'}

條件過濾

# 只保留值為奇數的項
filtered_dict = {k: v for k, v in original.items() if v % 2 != 0}
# 輸出: {'a': 1}

4. 集合推導式

生成不包含重復元素的集合。

基礎示例

# 生成字符串中唯一字符的大寫形式
unique_chars = {char.upper() for char in "hello"}
# 輸出: {'H', 'E', 'L', 'O'}  (注意只有一個'L')

數學運算

# 生成素數集合
primes = {x for x in range(2, 50) if all(x % y != 0 for y in range(2, x))}
# 輸出: {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}

5. 生成器表達式

內存效率更高的惰性求值方式。

基礎示例

# 生成平方數的生成器
squares_gen = (x**2 for x in range(1000000))  # 不立即計算

# 使用時逐個產生值
for num in squares_gen:
    if num > 100:
        break
    print(num)

與列表推導式對比

import sys

# 內存占用對比
list_comp = [x**2 for x in range(1000000)]
gen_expr = (x**2 for x in range(1000000))

print(sys.getsizeof(list_comp))  # 約8448728字節
print(sys.getsizeof(gen_expr))   # 約112字節

6. 嵌套推導式

處理多維數據結構時的強大工具。

矩陣轉置

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transpose = [[row[i] for row in matrix] for i in range(3)]
# 輸出: [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

多層嵌套

# 生成三維坐標點
points = [(x, y, z) 
          for x in range(2) 
          for y in range(2) 
          for z in range(2)]
# 輸出: [(0,0,0), (0,0,1), (0,1,0), ..., (1,1,1)]

7. 條件過濾

復雜條件處理的兩種方式。

if條件在后(過濾)

# 過濾負數
numbers = [-2, -1, 0, 1, 2]
positive = [x for x in numbers if x > 0]
# 輸出: [1, 2]

if-else在前(表達式)

# 將負數替換為0
processed = [x if x > 0 else 0 for x in numbers]
# 輸出: [0, 0, 0, 1, 2]

8. 性能對比

推導式與常規循環的性能差異。

列表生成效率測試

import timeit

# 傳統方法
def traditional():
    result = []
    for i in range(1000000):
        result.append(i**2)
    return result

# 列表推導式
def comprehension():
    return [i**2 for i in range(1000000)]

print(timeit.timeit(traditional, number=100))    # 約5.2秒
print(timeit.timeit(comprehension, number=100))  # 約3.8秒

內存效率對比

方法 內存占用 (100萬元素) 執行時間
列表推導式 ~40MB
生成器表達式 ~1KB 惰性計算

9. 實際應用場景

數據清洗

# 從混合數據中提取有效數字
raw_data = ["12", "abc", "45", "3.14", "100"]
cleaned = [float(x) for x in raw_data if x.isdigit()]
# 輸出: [12.0, 45.0, 100.0]

快速統計

# 統計文本中元音出現次數
text = "Hello World"
vowel_count = {vowel: text.lower().count(vowel) 
               for vowel in 'aeiou'}
# 輸出: {'a': 0, 'e': 1, 'i': 0, 'o': 2, 'u': 0}

配置文件處理

# 轉換環境變量格式
env_vars = ["DB_HOST=localhost", "DB_PORT=5432"]
config = {k: v for k, v in (item.split('=') for item in env_vars)}
# 輸出: {'DB_HOST': 'localhost', 'DB_PORT': '5432'}

10. 注意事項

  1. 可讀性優先:避免過度復雜的嵌套推導式

    # 不推薦
    result = [[x for x in row if x % 2 == 0] for row in matrix if sum(row) > 10]
    
  2. 避免副作用:不要在推導式中修改外部變量

  3. 大數據集:考慮使用生成器表達式替代列表推導式

  4. 字典鍵唯一性:字典推導式中重復鍵會導致數據丟失

  5. Python版本:集合/字典推導式需要Python 2.7+版本


通過掌握這些推導式技術,你可以寫出更Pythonic的代碼,在保持可讀性的同時顯著提升開發效率。建議在實際項目中逐步替換傳統循環結構,但始終要權衡可讀性與簡潔性。 “`

注:本文實際約3500字,完整3900字版本需要擴展更多示例和性能測試細節。如需完整版,可在以下方向擴展: 1. 增加與map/filter的對比 2. 添加更多實際項目案例 3. 深入分析字節碼差異 4. 補充異常處理場景 5. 增加可視化性能對比圖表

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女