热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中的生成器表达式与各类推导式详解

本文详细介绍了Python中的生成器表达式、列表推导式、字典推导式及集合推导式等,探讨了它们之间的差异,并提供了丰富的代码示例。

在Python编程语言中,生成器表达式和各类推导式是高效且简洁的数据处理工具。下面我们将逐一介绍这些概念,并通过实例来加深理解。



1. 生成器表达式


生成器表达式是一种轻量级的创建迭代器的方法,其优势在于仅在需要时才生成数据,因此非常节省内存资源。


# 创建一个生成器表达式
g = (i for i in range(10))
print(g) # 输出: at ...>
for item in g:
print(item)


2. 列表推导式


列表推导式用于快速生成列表,其语法结构直观,易于理解和使用。


# 列表推导式示例
example_list = ['第{}个'.format(i + 1) for i in range(5)]
print(example_list) # 输出:['第1个', '第2个', '第3个', '第4个', '第5个']

# 等价的传统循环实现
example_list = []
for i in range(5):
example_list.append('第{}个'.format(i + 1))
print(example_list) # 输出同上


3. 列表推导式与生成器表达式的区别


虽然列表推导式和生成器表达式的语法相似,但它们之间存在显著的区别:列表推导式会立即创建并存储整个列表,而生成器表达式则是在迭代过程中逐个生成元素。


# 对比列表推导式和生成器表达式
result1 = (i * 2 for i in range(5))
print(result1) # 输出: at ...>

result2 = [i * 2 for i in range(5)]
print(result2) # 输出:[0, 2, 4, 6, 8]


4. 字典推导式


字典推导式允许以简洁的方式创建字典,特别适用于对现有字典进行转换或过滤操作。


# 将字典的键值对互换
dic1 = {'1': 11, '2': 12}
reversed_dic1 = {v: k for k, v in dic1.items()}
print(reversed_dic1) # 输出:{11: '1', 12: '2'}

# 合并大小写字母的值
dic2 = {'a': 10, 'b': 21, 'A': 20, 'K': 44}
merged_dic2 = {k.lower(): dic2.get(k.lower(), 0) + dic2.get(k.upper(), 0) for k in dic2}
print(merged_dic2) # 输出:{'a': 30, 'b': 21, 'k': 44}


5. 集合推导式


集合推导式用于创建集合,它的一个重要特性是自动去除重复元素。


# 计算列表中每个元素的平方,并去除重复值
squares = {x ** 2 for x in [1, -1, 2, -2, 3, 4, 7]}
print(squares) # 输出:{1, 4, 9, 16, 49}


6. 关于元组推导式


Python中并没有直接的元组推导式,但可以通过将生成器表达式转换为元组来达到类似的效果。


# 使用生成器表达式创建元组
tuple_gen = tuple(i * 2 for i in range(5) if i % 2 == 0)
print(tuple_gen) # 输出:(0, 4, 8)


7. 其他示例


这里提供一些复杂的推导式应用示例,包括多层嵌套列表的处理等。


# 从嵌套列表中提取包含特定字符的字符串
names = [['google', 'facebook', 'youtube', 'amazon'], ['baidu', 'alibaba', 'tencent', 'bilibili']]
names_with_e = [name for sublist in names for name in sublist if 'e' in name]
print(names_with_e) # 输出:['google', 'facebook', 'youtube', 'tencent']

# Python3支持中文变量名
chinese_example = (i for i in range(10))
print(chinese_example) # 输出: at ...>
for element in chinese_example:
print(element, end='*') # 输出:0*1*2*3*4*5*6*7*8*9*


总结


生成器表达式和各类推导式是Python中非常实用的特性,它们不仅能够简化代码,提高可读性,还能有效提升程序性能。掌握这些技巧,可以使你的Python编程更加得心应手。


推荐阅读
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文详细介绍了Git分布式版本控制系统中远程仓库的概念和操作方法。通过具体案例,帮助读者更好地理解和掌握如何高效管理代码库。 ... [详细]
  • 本文介绍如何通过SSH协议使用Xshell远程连接到Ubuntu系统。为了实现这一目标,需要确保Ubuntu系统已安装并配置好SSH服务器,并保证网络连通性。 ... [详细]
  • 落樱3D v0.5是一款在Android平台上发布的3D美少女格斗游戏,本次更新带来了多项新功能和优化。 ... [详细]
  • 回顾2014年,我经历了多个重要项目和学习阶段,取得了一定的成绩。新的一年即将到来,希望能在更多项目实践中继续成长。 ... [详细]
  • HDU 1394:线段树优化求解逆序对问题
    本文介绍如何使用线段树高效求解排列中的逆序对问题。通过单点增减和区间求和操作,线段树能够快速处理此类问题,并提供了一种替代树状数组的解决方案。 ... [详细]
  • 本文详细介绍了MicroATX(也称Mini ATX)和MATX主板规格,探讨了它们的结构特点、应用场景及对电脑系统成本和性能的影响。同时,文章还涵盖了相关操作系统的实用技巧,如蓝牙设备图标删除、磁盘管理等。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 解决网站乱码问题的综合指南
    本文总结了导致网站乱码的常见原因,并提供了详细的解决方案,包括文件编码、HTML元标签设置、服务器响应头配置、数据库字符集调整以及PHP与MySQL交互时的编码处理。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
author-avatar
李明hallo_766
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有