Python推导式深入解析

embedded/2025/3/29 9:04:06/

引言

Python 以其简洁、高效的语法而备受开发者喜爱,其中推导式(Comprehensions)更是 Python 语法的一大特色。推导式提供了一种简洁明了的方式来创建列表、集合和字典等数据结构,让代码更加紧凑和易读。本文将深入探讨 Python 推导式的各种形式及其应用场景。

列表推导式(List Comprehensions)

基本语法

列表推导式的基本语法形式为:[expression for item in iterable]。其中,expression是对item进行操作后返回的结果,item是从iterable中依次取出的元素。例如,我们要创建一个包含 1 到 10 的平方的列表,可以这样写:

python">squares = [i**2 for i in range(1, 11)]​
print(squares)

运行上述代码,输出结果为:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]。

带条件的列表推导式

我们还可以在列表推导式中添加条件语句,语法形式为:[expression for item in iterable if condition]。例如,我们要创建一个包含 1 到 10 中偶数的平方的列表:

python">even_squares = [i**2 for i in range(1, 11) if i % 2 == 0]​
print(even_squares)

输出结果为:[4, 16, 36, 64, 100]。这里if i % 2 == 0就是条件语句,只有满足该条件的元素才会进行i**2操作并被添加到结果列表中。

多层循环的列表推导式

列表推导式支持多层循环,语法形式为:[expression for item1 in iterable1 for item2 in iterable2]。例如,我们有两个列表a = [1, 2]和b = [3, 4],要生成它们所有元素组合的列表:

python">a = [1, 2]​
b = [3, 4]​
combinations = [(i, j) for i in a for j in b]​
print(combinations)

输出结果为:[(1, 3), (1, 4), (2, 3), (2, 4)]。这里先遍历a中的元素i,对于每个i再遍历b中的元素j,并将(i, j)作为结果添加到列表中。

集合推导式(Set Comprehensions)

集合推导式与列表推导式类似,只是将方括号[]换成了花括号{}。其基本语法为:{expression for item in iterable}。集合推导式会自动去重,因为集合中的元素是唯一的。例如,我们有一个包含重复元素的列表nums = [1, 2, 2, 3, 3, 3],要得到一个去重后的集合:

python">nums = [1, 2, 2, 3, 3, 3]​
unique_nums = {i for i in nums}​
print(unique_nums)

输出结果为:{1, 2, 3}。同样,集合推导式也可以添加条件语句,形式与列表推导式中的条件语句类似。

字典推导式(Dictionary Comprehensions)

字典推导式用于创建字典,基本语法为:{key_expression: value_expression for item in iterable}。例如,我们有一个列表keys = ['a', 'b', 'c'],要创建一个字典,键为列表中的元素,值为对应元素的长度:

python">keys = ['a', 'b', 'c']​
my_dict = {k: len(k) for k in keys}​
print(my_dict)

输出结果为:{'a': 1, 'b': 1, 'c': 1}。字典推导式也支持条件语句,并且可以通过多层循环来创建更复杂的字典。

元组推导式(生成器表达式(Generator Expressions))

生成器表达式与列表推导式非常相似,只是将方括号[]换成了圆括号()。其语法为:(expression for item in iterable)。生成器表达式返回的是一个生成器对象,它不会像列表推导式那样一次性将所有结果生成并存储在内存中,而是在需要时逐个生成,因此在处理大量数据时更加高效。例如:

python">nums = (i for i in range(1, 1000000))​
print(nums)

这里nums是一个生成器对象,我们可以通过next()函数来逐个获取其中的元素,或者通过for循环来遍历。

总结

Python 推导式为我们提供了一种简洁、高效的方式来创建数据结构。列表推导式、集合推导式、字典推导式和生成器表达式各自有其特点和应用场景。合理使用推导式可以让我们的代码更加简洁、易读,同时提高代码的运行效率。在实际编程中,我们应根据具体需求选择合适的推导式来优化代码。

希望本文能帮助你深入理解 Python 推导式,并在日常编程中灵活运用。


http://www.ppmy.cn/embedded/175948.html

相关文章

在线运行vscode

安装 https://github.com/coder/code-server?utm_sourcesyndication&pubDate20250317 运行前预览脚本 curl -fsSL https://code-server.dev/install.sh | sh -s -- --dry-run运行脚本 curl -fsSL https://code-server.dev/install.sh | sh其他 可以通过后台服务运行&am…

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

基于STM32的扫地机器人/小车控制系统设计 演示视频: 基于STM32的扫地机器人小车控制系统设计 简介:扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采…

虚拟机访问主机的plc仿真

主机 虚拟机 默认,连接物理地址

无法写入文件:(FileSystemError): Error: EPERM: operation not permitted, open...)

问题分析: 当我想在Visual Studio Code中编写文件时,出现无法写入文件的错误,发现是权限的问题 解决办法: 右键应用图标 → 以管理员身份运行就可以了

对比学习(Contrastive Learning)初接触

自监督学习结合了生成模型和对比模型的特点:从大量无标签数据中学习表示 引用知乎博主: https://zhuanlan.zhihu.com/p/410442591

Elasticsearch 中的数据分片问题

Elasticsearch 在存储数据时采用 分片(Shard)机制,以提高性能和可扩展性。 Elasticsearch 分片机制 Elasticsearch 索引中的数据被划分成多个 主分片(Primary Shard) 和 副本分片(Replica Shard&#xff…

Django 生产环境静态文件处理

python manage.py collectstatic 是 Django 提供的一个非常重要的管理命令,用于将项目中的静态文件收集到一个指定的目录中。这在部署 Django 项目时尤其重要,因为静态文件需要被 Web 服务器(如 Nginx 或 Apache)提供服务&#xf…

树莓派5的供电与启动

1.树莓派供电 Raspberry Pi 生产两种不同的 USB-C 电源。第一个是Raspberry Pi 15W USB-C电源,这是Raspberry Pi 4和Raspberry Pi 400的推荐电源。第二个是Raspberry Pi 27W USB-C电源,在5.1V下提供高达5A 的电流,是Raspberry Pi 5的推荐电源…