深刻理解python特性-列表推导式和生成器表达式

news2024/9/23 1:26:01

哈喽大家好,今天给大家介绍两个Python中特性-列表推导式和生成器表达式

今天我想向你介绍python语言的两个非常有用的特性:列表推导式和生成器表达式。这两个特性都可以让你用一行简洁的代码来创建一个序列,而不需要写循环或者函数。但是它们之间也有一些重要的区别,我们一起来看看吧。

图片

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

本文文章由粉丝的分享、推荐,资料干货、资料分享、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自CSDN + 加群
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

列表推导式

列表推导式是一种用方括号包围的表达式,它可以根据一个或多个迭代器来生成一个列表。例如,如果你想要生成一个包含1到10的平方数的列表,你可以这样写:

squares = [x**2 for x in range(1, 11)]
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

你也可以在列表推导式中加入条件判断,来过滤掉一些不想要的元素。例如,如果你只想要生成偶数的平方数,你可以这样写:

even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)
# [4, 16, 36, 64, 100]

你还可以在列表推导式中使用多个迭代器,来生成笛卡尔积。例如,如果你想要生成两个列表中所有可能的组合,你可以这样写:

colors = ["red", "green", "blue"]
shapes = ["circle", "square", "triangle"]
combinations = [(c, s) for c in colors for s in shapes]
print(combinations)
# [('red', 'circle'), ('red', 'square'), ('red', 'triangle'), ('green', 'circle'), ('green', 'square'), ('green', 'triangle'), ('blue', 'circle'), ('blue', 'square'), ('blue', 'triangle')]

列表推导式的优点是它可以快速地创建一个列表,并且语法简洁易读。但是它也有一个缺点,就是它会一次性地把所有的元素都存储在内存中,这可能会占用很多空间,尤其是当生成的列表很大或者无限时。这时候,我们就可以使用生成器表达式来解决这个问题。

生成器表达式是一种用圆括号包围的表达式,它和列表推导式非常相似,只是它不会立即生成一个列表,而是返回一个生成器对象。生成器对象是一种特殊的迭代器,它可以按需地产生下一个元素,而不需要提前计算和存储所有的元素。例如,如果你想要生成一个包含1到10的平方数的生成器对象,你可以这样写:

squares_gen = (x**2 for x in range(1, 11))
print(squares_gen)
# <generator object <genexpr> at 0x000001F7E8C6D740>

注意,这里打印出来的不是一个列表,而是一个生成器对象。如果你想要获取生成器对象中的元素,你可以使用next()函数或者for循环来遍历它。例如:

print(next(squares_gen))
# 1
print(next(squares_gen))
# 4
for square in squares_gen:
    print(square)
# 9
# 16
# ...

注意,每次调用next()函数或者遍历生成器对象时,它都会动态地计算下一个元素,并且记住当前的状态。

生成器表达式

生成器表达式的语法和列表推导式基本一致,只是用圆括号代替方括号。你也可以在生成器表达式中加入条件判断和多个迭代器,就像列表推导式一样。例如:

even_squares_gen = (x**2 for x in range(1, 11) if x % 2 == 0)
combinations_gen = ((c, s) for c in colors for s in shapes)

生成器表达式的优点是它可以节省内存空间,因为它不会一次性地创建一个列表,而是按需地产生下一个元素。这样,你就可以处理很大或者无限的序列,而不需要担心内存溢出。例如,如果你想要生成一个无限的斐波那契数列,你可以这样写:

def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib_gen = (x for x in fib())

注意,这里我们使用了一个生成器函数来定义斐波那契数列,然后用一个生成器表达式来包装它。生成器函数是一种使用yield语句来返回值的函数,它也会返回一个生成器对象。生成器函数和生成器表达式都是生成器的两种不同的写法,它们都可以用来创建惰性求值的序列。

生成器表达式的另一个优点是它可以提高性能,因为它可以避免不必要的计算和中间变量。例如,如果你想要计算一个序列中所有元素的和,你可以这样写:

total = sum([x**2 for x in range(1, 11)])

但是这样会先创建一个列表,然后再对列表中的元素求和,这样会浪费时间和空间。如果你使用生成器表达式,你可以这样写:

total = sum(x**2 for x in range(1, 11))

这样就不会创建一个列表,而是直接把每个元素的平方数传给sum()函数,这样会更快更省空间。事实上,很多内置的函数都可以接受一个生成器作为参数,例如min(), max(), all(), any()等等。你也可以把一个生成器传给list()函数或者set()函数来转换成一个列表或者集合。

总结

图片

我可以用一个餐厅的例子来比喻列表推导式和生成器表达式。假设你是一个餐厅的老板,你想要给你的客人提供一份菜单,让他们选择自己喜欢的菜品。你有两种方式来制作菜单:

  • 一种是使用列表推导式,也就是提前把所有的菜品都做好,然后放在一个大盘子里,让客人自由挑选。这样的好处是客人可以看到所有的菜品,也可以多次取用,而且速度很快。但是这样的坏处是你需要占用很多的厨房空间和食材,而且有些菜品可能会变凉或者变质,造成浪费。

  • 另一种是使用生成器表达式,也就是根据客人的需求,现场做出一个菜品,然后送到客人的桌子上。这样的好处是你不需要占用很多的厨房空间和食材,而且每个菜品都是新鲜的,不会浪费。但是这样的坏处是客人不能看到所有的菜品,也不能多次取用,而且速度可能会慢一些。

所以,你应该根据不同的情况来选择合适的方式来制作菜单。如果你有很多的客人,而且他们都喜欢吃不同的菜品,那么你可能更适合使用列表推导式。如果你只有少数的客人,而且他们都喜欢吃新鲜的菜品,那么你可能更适合使用生成器表达式。

总之,列表推导式和生成器表达式都是非常有用的特性,它们可以让你用一行简洁的代码来创建一个序列。列表推导式适合于需要多次遍历或者操作的序列,而生成器表达式适合于只需要遍历一次或者处理很大或者无限的序列。你应该根据不同的场景来选择合适的方式来提高你的代码效率和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/818558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十年测试经验告诉你单元测试到底测什么

今天的前端夜点心我们来聊聊在项目中单元测试应该测些什么&#xff1f; 以国内互联网的开发节奏&#xff0c;在前端业务项目中全面覆盖单元测试有时显得不太可行&#xff0c;主要是因为以下这些绊脚石&#xff1a; UI 交互复杂&#xff0c;路径难以覆盖全面 工期紧&#xf…

HCIA云计算 V5.0题库

云计算&#xff0c;这是近几年听得最多词了&#xff0c;云计算对于网络的发展帮助非常大&#xff0c;它自身所产生的价值是不可估量的&#xff01;所以云计算的岗位对于很多IT公司来说&#xff0c;都是有一定地位的。华为认证云计算面向的对象很简单就是对云计算技术感兴趣的人…

明道云与美洽产品生态合作介绍

背景介绍 近来&#xff0c;B2B企业用人及获客成本居高不下的问题愈发显现&#xff0c;企业为提高核心竞争力&#xff0c;利用信息技术协调企业与客户在销售、营销和服务上的交互&#xff0c;在优化管理方式的同时&#xff0c;向客户提供个性化交互服务&#xff0c;以达到吸引新…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…

秋叶整合包如何安装Python包

前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章&#xff0c;有同学运行时遇到缺少Python Module的问题&#xff0c;帮助他处理了一下&#xff0c;今天把这个经验分享给大家&#xff0c;希望能帮助到更多的同学。 有时候启动某些插件的时候会出现 Mo…

《Cesium 基础知识点》- 监听鼠标事件

Cesium.ScreenSpaceEventHandler 处理用户输入事件。可以添加自定义功能&#xff0c;以便在用户输入时执行。初始化&#xff1a; const handler new Cesium.ScreenSpaceEventHandler(viewer.canvas); 添加事件监听 使用方法 setInputAction 例如 handler.setInputAction(o…

数据分级分类工具

数据安全现状 当前数据安全形势严峻&#xff0c;数据泄露、丢失、被篡改等问题层出不穷。企业需要采取一系列措施&#xff0c;包括加强数据加密、完善数据备份、加强网络安全防护、加强员工培训等。政府也需要加强对数据安全的监管和管理&#xff0c;制定相关法律法规&#xf…

程序员在今年这种行情下如何快速找到合适的工作?

前面好几篇文章都在写面试的感悟&#xff0c;带大家了解了目前的一些市场行情&#xff0c;以及面试过程中招聘方与求职者看待面试的不同视角。 今天这篇文章写一些对大家求职面试可能更有用的几条建议&#xff1a; 第一&#xff0c;值与量的权衡 在早些年&#xff0c;大多数…

利用Python 实现 模拟退火算法

模拟退火算法 模拟退火算法流程图 初始温度 新温度值 进入循环 生成新的解 按照 bound按照 constraint 计算新解与当前解的目标差异判断是否接受解判断是否更新解循环结束按照温度降低率降低温度温度小于最低温度输出结果 模拟退火算法示例代码1 import numpy as npdef objec…

【ESP32】调试IIC功能

1.创建示例项目i2c_simple&#xff1a;VSCODE中->“查看”->”命令面板“->输入&#xff1a;Show Examples projects->选择Use current ESP-IDF(C:\Espressif\frameworks\esp-idf-v5.1)->弹出示例ESP-IDF Examples&#xff0c;选择peripherals->i2c->i2c_…

<findbugs>静态代码分析工具

背景&#xff1a; IDEA安装的findbug插件目前无法和jenkins的扫描结果保持一致&#xff0c;因为&#xff1a;没有对应jenkins上findbug的版本&#xff1b; 原理&#xff1a; 将jenkins服务器上的findbugs插件&#xff0c;拷贝到本地&#xff0c;修改build.xml内容以匹配目录…

代码随想录算法训练营第五天| 242. 有效的字母异位词,349. 两个数组的交集,202快乐数,1. 两数之和

哈希表 首先什么是 哈希表&#xff0c;哈希表&#xff08;英文名字为Hash table&#xff0c;国内也有一些算法书籍翻译为散列表&#xff0c;大家看到这两个名称知道都是指hash table就可以了&#xff09;。 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断…

cypress 教程

cypress 教程 cypress是一个用于Web应用程序的端到端测试框架。它是一个开源的js测试工具&#xff0c;设计的目的是Web应用程序的测试能更快速、简单和可靠。赛普斯允许开发人员编写模拟用户交互和验证应用程序行为的自动测试。 我们可以使用js或者ts来开发&#xff0c;但是j…

用牛鲨水豚赚取SUI的机会又来喽,500万SUI奖励等你来领!

刚刚结束的第一轮Bullshark Quest真是一次惊心动魄的体验&#xff01;我们非常感激社区成员的积极参与以及对Sui生态系统的关注。此轮获奖者的奖励已于美国时间2023年7月28日&#xff0c;在Quest门户网站上公布。参与者点击“Claim”即可将奖励领取至Sui钱包。请注意&#xff0…

猿创征文|弃文从工,从小白到蚂蚁工程师,我的 Java 成长之路

一、前言 1.1 背景 最近 CSDN 开展了猿创征文&#xff0c;希望博主写文章讲述自己在某个领域的技术成长历程。 之前也曾想找个机会写篇文章&#xff0c;记录下自己的成长历程。 因此&#xff0c;借着这个机会写下这篇文章。 在回顾自己的成长历程的同时&#xff0c;希望对一…

红队打靶:FourAndSix2.01打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;NFS渗透 第三步&#xff1a;7z压缩包的密码破解 第四步&#xff1a;ssh私钥登录 第五步&#xff1a;lessvi提权 总结与思考 写在开头 本篇博客根据大佬红队笔记的视频进行打靶&#xff0c;详述了…

基于Caffe的静默活体检测识别分析系统

周末的时候看到一个好玩的项目就想着实际拿来使用一下&#xff0c;这个项目主要是做的是开源的跟人脸活体检测相关的内容&#xff0c;这里主要采用的是静默活体检测的方式。 人脸静默活体检测是一种用于验证人脸是真实、活体的技术&#xff0c;而不需要进行任何口头指令或特定…

13.7 CentOS 7 环境下大量创建帐号的方法

13.7.1 一些帐号相关的检查工具 pwck pwck 这个指令在检查 /etc/passwd 这个帐号配置文件内的信息&#xff0c;与实际的主文件夹是否存在等信息&#xff0c; 还可以比对 /etc/passwd /etc/shadow 的信息是否一致&#xff0c;另外&#xff0c;如果 /etc/passwd 内的数据字段错…

Linux 给用户 赋某个文件夹操作的权限(实现三权分立)

Linux 给用户 赋某个文件夹操作的权限 这里用的ubuntu16.04 一、配置网站管理员 linux文件或目录的权限分为&#xff0c;读、写、可执行三种权限。文件访问的用户类别分为&#xff0c;文件创建者、与文件创建者同组的用户、其他用户三类。 添加用户 useradd -d /var/www/htm…

解密低价正规渠道的来源:影视会员肯德基点餐直充api接口

话费充值 接口已经整合移动、联通、电信三网话费充值渠道。话费可以说是全民所需&#xff0c;对于平台引流&#xff0c;增强平台日活跃度可以提供不小的帮助。 肯德基在线点餐 接口整合了各大城市的肯德基门店&#xff0c;支持门店选择&#xff0c;在线点餐 提前点餐领取&a…