【python】python進階——推導式

目錄

一、推導式介紹

二、推導式的用法

2.1?列表推導式?

2.2?字典推導式?

2.3 集合推導式?

2.4?生成器表達式?

三、推導式的嵌套和復雜用法

3.1 嵌套推導式

3.2 多重條件推導式

四、推導式對比傳統循環

4.1 性能比較

4.2 可讀性比較

五、常見應用場景

5.1 數據清洗和轉換

5.2 文件處理

5.3 API數據處理

六、注意事項

參考


一、推導式介紹

????????Python推導式(Comprehension)是一種簡潔、優雅的語法結構,可以用單行代碼快速創建列表、字典、集合等數據結構。它基于現有的可迭代對象,通過表達式和條件語句來生成新的數據集合。

不僅讓代碼更加簡潔易讀,而且在大多數情況下比傳統的循環方式執行效率更高。

    二、推導式的用法

    ????????Python 推導式是一種獨特的數據處理方式,可以從一個數據序列構建另一個新的數據序列的結構體。

    Python 支持推導式的數據結構有:

    • 列表(list)推導式
    • 字典(dict)推導式
    • 集合(set)推導式
    • 元組(tuple)推導式

    2.1?列表推導式?

    列表推導式是最常見的形式,用于創建新的列表。

    基本語法:

    [expression for item in iterable if condition]

    示例:

    # 傳統方式
    squares = []
    for x in range(10):squares.append(x**2)# 列表推導式
    squares = [x**2 for x in range(10)]
    print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    帶條件的列表推導式:

    # 只保留偶數平方
    even_squares = [x**2 for x in range(10) if x % 2 == 0]
    print(even_squares)  # [0, 4, 16, 36, 64]# 使用條件表達式
    results = ["偶數" if x % 2 == 0 else "奇數" for x in range(5)]
    print(results)  # ['偶數', '奇數', '偶數', '奇數', '偶數']

    嵌套循環的列表推導式:

    # 生成所有可能的坐標對
    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?字典推導式?

    字典推導式用于創建字典,語法與列表推導式類似。

    基本語法:

    {key_expression: value_expression for item in iterable if condition}

    示例:

    # 創建數字到其平方的映射
    squares_dict = {x: x**2 for x in range(5)}
    print(squares_dict)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}# 反轉字典的鍵和值
    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'}# 帶條件的字典推導式
    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 集合推導式?

    集合推導式用于創建集合,會自動去除重復元素。

    基本語法:

    {expression for item in iterable if condition}

    示例:

    # 從列表中創建不重復的平方數集合
    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}# 帶條件的集合推導式
    even_squares = {x**2 for x in range(10) if x % 2 == 0}
    print(even_squares)  # {0, 64, 4, 36, 16}

    2.4?生成器表達式?

    生成器表達式使用圓括號,與列表推導式類似,但返回一個生成器對象,按需生成值,節省內存。

    基本語法:

    (expression for item in iterable if condition)

    示例:

    # 創建生成器
    squares_gen = (x**2 for x in range(10))# 使用生成器
    print(next(squares_gen))  # 0
    print(next(squares_gen))  # 1# 可以轉換為列表
    print(list(squares_gen))  # [4, 9, 16, 25, 36, 49, 64, 81]# 在函數中使用
    total = sum(x**2 for x in range(10))
    print(total)  # 285

    三、推導式的嵌套和復雜用法

    3.1 嵌套推導式

    # 二維列表展平
    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]# 轉置矩陣
    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 多重條件推導式

    # 多個條件
    numbers = [x for x in range(20) if x % 2 == 0 if x % 3 == 0]
    print(numbers)  # [0, 6, 12, 18]# 復雜的條件表達式
    categorized = ["大偶數" if x > 5 and x % 2 == 0 else "小偶數" if x % 2 == 0 else "大奇數" if x > 5 else "小奇數" for x in range(10)]
    print(categorized)

    四、推導式對比傳統循環

    4.1 性能比較

    推導式通常比等效的循環更快,因為它們在底層使用了優化的C代碼。

    import timeit
    # 測試列表推導式性能
    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"列表推導式: {list_comp_time:.3f}秒")
    print(f"傳統循環: {loop_time:.3f}秒")

    4.2 可讀性比較

    雖然推導式更簡潔,但過度復雜的推導式可能會降低可讀性:

    # 可讀性好的推導式
    good_example = [x**2 for x in range(10) if x % 2 == 0]# 過于復雜的推導式(不推薦)
    bad_example = [[x*y for y in range(10) if y % 2 == 0] for x in range(10) if x % 3 == 0]

    建議:當推導式變得復雜難以理解時,考慮使用傳統的循環結構。

    五、常見應用場景

    5.1 數據清洗和轉換

    # 從字符串中提取數字并轉換為整數
    data = ["價格: 100元", "重量: 2.5kg", "數量: 15個"]
    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數據處理

    # 從API響應中提取特定信息
    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']

    六、注意事項

    • 避免過度復雜:如果推導式變得難以閱讀,考慮使用傳統循環

    • 注意內存使用:大型數據集考慮使用生成器表達式

    • 保持可讀性:適當的空格和換行可以提高復雜推導式的可讀性

    • 不要濫用:推導式不是所有循環的替代品,選擇合適的工具

    # 可讀性更好的復雜推導式
    result = [(x, y, z)for x in range(10)for y in range(10)for z in range(10)if x + y + z > 15and x % 2 == 0and y % 2 != 0
    ]print(result)

    參考

    • Python官方文檔 - 列表推導式

    • Real Python - Python列表推導式指南

    • Stack Overflow - 列表推導式最佳實踐討論

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/diannao/96463.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/diannao/96463.shtml
    英文地址,請注明出處:http://en.pswp.cn/diannao/96463.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    數字安全隱形基石:隨機數、熵源與DRBG核心解析與技術關聯

    前言:數字安全的 “隱形基石” 在數字化浪潮席卷全球的今天,從金融交易的密鑰生成到區塊鏈的共識機制,從量子通信的加密協議到智能汽車的身份認證,隨機數如同空氣般滲透在信息系統的每一個安全節點。然而,看似簡單的 …

    TDengine IDMP 最佳實踐

    最佳實踐 IDMP 提供了一強大的數據建模能力,讓數據標準化、情景化,從而可以更好地利用 AI 技術,從數據中挖掘出業務價值,但數據建模本身是一個很難用 AI 完成的事情。 為最大程度減少建模的成本,TDengine 推薦在數據…

    8.20網絡編程——sqlite3數據庫

    文章目錄一、思維導圖二、學生管理系統1、myhead.h2、代碼三、牛客網刷題一、思維導圖 二、學生管理系統 1、myhead.h #ifndef __MYHEAD_H__ #define __MYHEAD_H__#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>#d…

    電腦不能訪問服務器磁盤,連不上服務器。解決辦法:在窗口中輸入 regedit 確定即可打開注冊表,。。。。0改為1,確認;

    打開注冊表&#xff1a; 按鍵盤上的 WinR 鍵&#xff0c;打開運行窗口&#xff0c;在窗口中輸入 regedit 確定即可打開注冊表。&#xff08;或者直接在左下角搜索框中搜索“注冊表”&#xff09; 依次打開以下目錄 計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service…

    EP4CE40F23I7N Altera FPGA Cyclone IV E

    EP4CE40F23I7N 阿爾特拉 Altera Cyclone IV E 系列的一顆中等密度、低功耗 FPGA&#xff0c;通信接口與工業控制等應用。該器件采用成熟的工藝制程&#xff0c;器件規模約為 39k 左右的邏輯單元&#xff08;Logic Elements&#xff09;&#xff0c;由若干邏輯陣列塊&#xff08…

    【typenum】 21 類型級別計算最大公約數(Gcd)

    一、源碼 代碼實現了一個在類型級別計算最大公約數&#xff08;GCD&#xff09;的系統 定義&#xff08;type_operators.rs&#xff09; /// A **type operator** that computes the [greatest common divisor][gcd] of Self and Rhs. /// /// [gcd]: https://en.wikipedia.org…

    如何為 Visual Studio 2019 安裝 WDK

    我用nmake編譯代碼提示錯誤&#xff1a;fatal error U1052: 未找到文件“\makefile.def”&#xff0c;經過排查發現是代碼依賴WDK&#xff0c;所以研究了一下WDK的安裝步驟&#xff0c;下面是具體步驟&#xff1a; 請遵循以下步驟來為你的 VS2019 搭建完整的驅動開發環境&…

    使用 Apache Flink CDC 3.0 實現 MySQL 到 Elasticsearch 的數據同步

    下面我將創建一個完整的 Spring Boot 項目&#xff0c;使用 Flink CDC 3.0 基于 MySQL 的 binlog 實現數據同步到 Elasticsearch。 項目概述 這個項目將&#xff1a; 使用 Flink CDC 連接 MySQL 并讀取 binlog處理數據變化&#xff08;插入、更新、刪除&#xff09;將數據同步到…

    Web網站的運行原理2

    請求Web網站的文件-HTTP 可以使用HTTP協議在Web瀏覽器和Web服務器應用程序之間傳輸Web網頁的文件。 在進行HTTP傳輸之前&#xff0c;需要先在Web瀏覽器和Web服務器應用程序之間建立TCP連接。 使用HTTP請求可以要求Web瀏覽器向Web服務器應用程序傳輸文件。 傳輸Web網站的文件-HT…

    論文閱讀:Do As I Can, Not As I Say: Grounding Language in Robotic Affordances

    地址&#xff1a;Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 摘要 大型語言模型&#xff08;LLM&#xff09;能夠編碼豐富的世界語義知識&#xff0c;這類知識對于機器人執行自然語言表達的高層級、時間擴展指令具有重要價值。然而&#xff0c;語…

    Django管理后臺結合剪映實現課件視頻生成應用

    在教學內容的數字化制作中&#xff0c;如何將課件與音頻快速轉換為視頻是一項高頻需求。借助管理后臺和剪輯工具&#xff0c;可以實現課件內容的下載、轉換和草稿生成&#xff0c;大幅減少重復操作。 【AI教育教學考試系統】課件在線剪映視頻草稿生成應用這里實現的課件PPT部分…

    AI升級社區便民服務:AI辦事小程序高效辦證+應急系統秒響應,告別跑腿愁住得更安心

    朋友&#xff0c;你有沒有在社區辦過事&#xff1f;想給孩子辦入學證明&#xff0c;得先跑居委會開證明&#xff0c;再去街道辦事處蓋章&#xff0c;來回幾趟不說&#xff0c;要是材料沒帶全&#xff0c;還得重新跑&#xff1b;家里水管爆了&#xff0c;半夜聯系物業&#xff0…

    el-table-draggable拖拽實現表格內容排序

    1、圖片2、安裝包import ElTableDraggable from "el-table-draggable";3、代碼&#xff08;html&#xff09;<el-table-draggable:data"soloTableData"input"dragInputHandlerSolo"><el-table:data"soloTableData"row-key&qu…

    Linux設備模型技術路線圖

    Linux設備模型涉及的技術和知識點 1. 核心架構組件 1.1 Kobject 子系統 kobject(內核對象):Linux設備模型的基礎構建塊 kset(對象集合):kobject的容器,管理相同類型的對象 ktype(對象類型):定義kobject的行為和屬性 引用計數機制:使用kref管理對象生命周期 對象層…

    面試問題詳解六:元對象系統調用槽函數

    Qt 的 元對象系統&#xff08;Meta-Object System&#xff09; 是 Qt 核心機制之一&#xff0c;正是它讓 C 語言具備了類似腳本語言&#xff08;如 Python&#xff09;的反射、動態綁定、屬性系統等能力。 自定義信號與槽&#xff0c;是 Qt 元對象系統最常見、最實用的體現。&a…

    Scala面試題及詳細答案100道(1-10)-- 基礎語法與數據類型

    《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面試題-專欄總目錄 文章目錄 一、本文面試題目錄 1. 簡述Scala與Java的主要…

    http請求有哪些?

    TTP請求方法常見方法&#xff1a;GET&#xff1a;獲取資源&#xff0c;參數通過URL傳遞&#xff0c;可緩存到瀏覽器本地。POST&#xff1a;提交數據&#xff0c;參數通過請求體傳遞&#xff0c;不可緩存&#xff0c;常用于創建資源。PUT&#xff1a;更新資源&#xff0c;參數通…

    MAPGIS6.7地質編錄

    1.編錄文件excel位于D:\mapgis67\program\section&#xff0c;文件名稱&#xff1a;ZKInfoEdit.xls2生成副本&#xff0c;復制ZKInfoEdit.xls到桌面3開始編寫 04回次4開始編寫 03編錄5開始編寫 11采樣6開始編寫 06標志面7開始編寫 10鉆孔資料8 最后總結 …

    輕松掌握Chrome插件開發全流程

    Chrome插件開發概述介紹Chrome插件的基本概念、核心功能和應用場景&#xff0c;包括插件與瀏覽器擴展的區別、插件的主要組成部分&#xff08;如manifest文件、后臺腳本、內容腳本等&#xff09;。開發環境搭建列出開發Chrome插件所需的工具和環境配置&#xff0c;包括Chrome瀏…

    智能二維碼QR\刷IC卡\人臉AI識別梯控系統功能設計需基于模塊化架構,整合物聯網、生物識別、權限控制等技術,以下是多奧分層次的系統設計框架

    一、系統架構設計硬件層主控模塊&#xff1a;32位ARM嵌入式處理器&#xff0c;支持CAN/RS485/TCP/IP協議識別終端&#xff1a;支持IC卡(CPU/國密/HID)、二維碼掃碼器(動態碼)、人臉識別(活體檢測)電梯控制單元&#xff1a;繼電器矩陣控制板&#xff0c;支持20層以上電梯按鈕控制…