【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

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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层以上电梯按钮控制…