Python之解析式和生成器表达式

news2024/11/20 13:16:48

Python之解析式和生成器表达式

列表解析式

  • 列表解析式List Comprehension,也叫列表推导式。

语法

  • [返回值 for 元素 in 可迭代对象 if 条件]
  • 使用中括号[],内部是for循环,if条件语句可选
  • 返回一个新的列表

列表解析式是一种语法糖

  • 编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
  • 减少程序员工作量,减少出错
  • 简化了代码,增强了可读性

集合解析式

语法

  • {返回值 for 元素 in 可迭代对象 if 条件}
  • 列表解析式的中括号换成大括号{}就变成了集合解析式
  • 立即返回一个集合

字典解析式

语法

  • {key:value for 元素 in 可迭代对象 if 条件}
  • 列表解析式的中括号换成大括号{},元素的构造使用key:value形式
  • 立即返回一个字典

生成器表达式

语法

  • (返回值 for 元素 in 可迭代对象 if 条件)
  • 列表解析式的中括号换成小括号就行了
  • 返回一个生成器对象

和列表解析式的区别

  • 生成器表达式是按需计算(或称惰性求值、延迟计算),需要的时候才计算值
  • 列表解析式是立即返回值

生成器对象

  • 可迭代对象
  • 迭代器
生成器表达式列表解析式
延迟计算立即计算
返回可迭代对象器,可以迭代返回可迭代列表,不是迭代器
只能迭代一次可反复迭代

生成器表达式和列表解析式对比

  • 计算方式
    • 生成器表达式延迟计算,列表解析式立即计算
  • 内存占用
    • 单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表
    • 生成器没有数据,内存占用极少,使用的时候,一次返回一个数据,只会占用一个数据的空间
    • 列表解析式构造新的列表需要为所有元素立即占用掉内存
  • 计算速度
    • 单看计算时间看,生成器表达式耗时非常短,列表解析式耗时长
    • 但生成器本身并没有返回任何值,只返回了一个生成器对象
    • 列表解析式构造并返回了一个新的列表

x = [] # 构建一个新的列表
for i in range(10):
    x.append(i ** 2)
# 循环写法,求平方
x
# 返回结果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[ i ** 2 for i in range(10)]
# 解析式的写法
# 返回结果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
%%timeit
x = [] # 构建一个新的列表
for i in range(10):
    x.append(i ** 2)
# 查看效率问题,1.85微秒
# 返回结果:1.85 µs ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
%timeit [ i ** 2 for i in range(10)]
# 查看效率问题,1.75微秒还快了一点
# 返回结果:1.75 µs ± 6.28 ns per loop (mean ± std. dev. of 7 runs, 1,000,000 loops each)
[ (i+1, i) for i in range(5)]
# 列表中套元组,一个二元对象
# 返回结果:[(1, 0), (2, 1), (3, 2), (4, 3), (5, 4)]
dict([(i+1, i) for i in range(10)])
# 可以创建字典
# 返回结果:{1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9}
[range(i) for i in range(5)]
# 创建5个range对象
# 返回结果:[range(0, 0), range(0, 1), range(0, 2), range(0, 3), range(0, 4)]
x = []
for i in range(7):
    if i > 4:
        for j in range(20, 25):
            if j > 23:
                x.append((i, j))
# 想下这个结果
x
# 返回结果:[(5, 24), (6, 24)]
[(i, j) for i in range(7) if i > 4 for j in range(20, 25) if j > 23]
# 解析式方法
# 返回结果:[(5, 24), (6, 24)]
{i for i in range(9)}
# 集合解析式
# 返回结果:{0, 1, 2, 3, 4, 5, 6, 7, 8}
{i:i+1 for i in range(5)}
# 字典解析式
# 返回结果:{0: 1, 1: 2, 2: 3, 3: 4, 4: 5}
[i for i in range(5)], list(range(5)), [*range(5)]
# 等价
# 返回结果:([0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
[str(i) for i in range(5)], list(map(str, range(5)))
# map变形
# 返回结果:(['0', '1', '2', '3', '4'], ['0', '1', '2', '3', '4'])
{chr(0x41 + i) for i in range(5)}
# 获取Ascii码表的字符
# 返回结果:{'A', 'B', 'C', 'D', 'E'}
{chr(0x41 + i):i for i in range(5)}
# 这样就能构建字典了
# 返回结果:{'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4}
{i:j for i in 'abcd' for j in range(3)}
# 思考一下这个得到结果,为什么最后只有4个?
# 返回结果:{'a': 2, 'b': 2, 'c': 2, 'd': 2}
{'a':0, 'a':1, 'a':2}
# 覆盖问题一定要思考
# 返回结果:{'a': 2}
{i:j for i in 'abcd' for j in range(3, 0, -1)}
# 思考的点,覆盖问题,range前包后不包
# 返回结果:{'a': 1, 'b': 1, 'c': 1, 'd': 1}

生成器

x = (i + 1 for i in range(5))
# 这个是什么?元组解析式吗?
x
# 元组的方式是生成器对象,0x那一串是内存地址
# 返回结果:<generator object <genexpr> at 0x000001447C22B120>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 列表是可迭代对象,生成器也是可迭代对象
  • 生成器也是迭代器一种,但列表不是
  • 迭代器特点:
    1.一次性迭代,指针不能回头
    2.类型range(range不是迭代器),是惰性的。使用next挤一下
    3.for循环可以迭代,但是如果已经到头,for相当于迭代空容器。但是next不能迭代,如果使用next会抛出Stop Iteration异常
    4.迭代器不可以索引
  1. 列表立即构建,元素都在了,可以反复使用;生成器对象会立即产生,但是什么元素都没有
  2. 内存占用:内存:列表元素内存立即都占用了;生成器在内存中只占用了一个生成器对象大小的内存
  3. 计算角度:使用时,列表中元素就在那里,随手拿就能用;生成器才开始热身造元素,造好了返回
    列表预先计算,放在内存中,我们称为 空间换时间 预热
    生成器懒计算,等待的时长是否能够容忍,延时计算

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

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

相关文章

Vue中如何处理表单输入验证?

在Vue中,能使用多种方式处理表单输入验证。以下是几种常见的方法: 1:使用Vue的指令和表达式: Vue提供了一些内置的指令和表达式,可以直接在模板中进行表单验证。例如,你可以使用v-model指令结合条件表达式来验证输入内容。 <template><div><input v-mod…

微软官方推出的四款工具,太实用了,值得收藏

目录 一、Officeplus——丰富的办公资源库 二、微软数学求解器 三、微软内置edge浏览器 四、Microsoft To-Do 办公待办神器 所以今天小编给大家分享4个微软官方推出的实用工具&#xff0c;每一个都非常好用&#xff0c;对于大家日常办公&#xff0c;非常有必要&#xff0c;感兴…

【C++深入浅出】C/C++内存管理(教你如何new到对象)

一. 前言 前面我们学习了有关C类和对象的知识&#xff0c;学会了如何构建一个完整的类&#xff0c;这些类都是存储在栈空间上的。在C语言中&#xff0c;我们不仅可以在栈上定义变量&#xff0c;也可以对堆上的空间进行管理&#xff0c;在接下来的几期中&#xff0c;我们的目标就…

idea + Docker-Compose 实现自动化打包部署(仅限测试环境)

一、修改docker.service文件&#xff0c;添加监听端口 vi /usr/lib/systemd/system/docker.service ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock重启docker服务 systemctl daemo…

一个进程最多可以创建多少个线程基本分析

前言 ​话不多说&#xff0c;先来张脑图~ linux 虚拟内存知识回顾 虚拟内存空间长啥样 在 Linux 操作系统中&#xff0c;虚拟地址空间的内部又被分为内核空间和用户空间两部分&#xff0c;不同位数的系统&#xff0c;地址空间的范围也不同。比如最常见的 32 位和 64 位系统&…

四大特性模块(module)

module的动机 C20中新增了四大特性之一的模块(module)&#xff0c;用以解决传统的头文件在编译时间及程序组织上的问题。 modules 试图解决的痛点 能最大的痛点就是编译慢, 头文件的重复替换, 比如你有多个翻译单元, 每一个都调用了 iostream, 就得都处理一遍. 预处理完的源…

muduo异步日志库

文章目录 一、日志库模型参考 一、日志库模型 muduo日志库是异步高性能日志库&#xff0c;其性能开销大约是前端每写一条日志消息耗时1.0us~1.6us。 采用双缓冲区&#xff08;double buffering&#xff09;交互技术。基本思想是准备2部分buffer&#xff1a;A和B&#xff0c;前…

英语——分享篇——每日200词——2601-2800

2601——resistant——[rɪzɪstənt]——adj.抵抗的——resistant——resi热死(拼音)st石头(拼音)ant蚂蚁(熟词)——热死了石头上的蚂蚁还在抵抗——The body may be less resistant if it is cold. ——天冷时&#xff0c;身体的抵抗力会下降。 2602——prospect——[prɒspe…

ubuntu安装后配置

基础配置 查看当前Ubuntu 的版本号 cat /etc/issue 更新软件源&#xff1a; 可以不用再复制黏贴内容了&#xff0c;直接找到Software Updates&#xff0c;Download from 选择china下的阿里云&#xff0c;然后reload就可以了。 更新软件 sudo apt-get update sudo apt-get u…

算法__中缀表达式转后缀表达式

文章目录 概念算法中缀转后缀案例讲解 后缀算值案例讲解 概念 中缀表达式就是日常生活中遇到的运算表达式&#xff0c;例如a*(b-c)&#xff1b; 后缀表达式则是另一种运算表达式&#xff0c;其特点在于运算符在对象后&#xff0c;且表达式中没有括号&#xff0c;例如abc-* 算…

DOM4J解析.XML文件

<?xml version"1.0" encoding"utf-8" ?> <books><book id"SN123123413241"><name>java编程思想</name><author>华仔</author><price>9.9</price></book><book id"SN1234…

发票识别神器推荐,告别繁琐手动录入,轻松管理财务

随着数字化时代的到来&#xff0c;越来越多的企业和个人开始寻求自动化处理各种繁琐任务的方式。其中&#xff0c;发票识别就是一个常见且具有挑战性的任务。发票识别是指将纸质或电子形式的发票转化为结构化的数据&#xff0c;以便进一步处理和分析。在过去&#xff0c;人工进…

【Qt QML】Qt Linguist使用方法

1. 简介 应用开发过程中&#xff0c;有时候需要翻译成多种语言&#xff0c;例如&#xff1a;将界面上所有中文翻译成英文&#xff0c;以适应国外市场。 针对多语言切换需求&#xff0c;Qt有一个Qt Linguist解决方案。 在所有需要翻译的字符串处使用qsTr()函数&#xff0c;Qt…

负采样:如何高效训练词向量

Negative Sampling 1.何为负采样 负采样是一种用于训练词嵌入模型的采样方法&#xff0c;特别适用于处理大规模词汇表的情况。负采样的目标是降低计算成本并改善模型的性能&#xff0c;同时有效地训练词向量。 2.为什么需要负采样 在传统的词嵌入模型中&#xff0c;如Word…

CleanMyMac X2024讲解及如何下载?

您是否曾经为Mac电脑的性能下降、存储空间不足而烦恼&#xff1f;是否希望有一个简单而高效的解决方案来优化您的Mac系统&#xff1f;那么&#xff0c;我向您介绍一款非常出色的工具&#xff1a;CleanMyMac X。它能够轻松处理这些问题&#xff0c;并让您的Mac恢复到最佳状态。 …

C++前缀和算法的应用:向下取整数对和 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 向下取整数对和 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 floor(nums[i] / nums[j]) 结果之和。由于答案可能会…

2023-10-17 LeetCode每日一题(倍数求和)

2023-10-17每日一题 一、题目编号 2652. 倍数求和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正整数 n &#xff0c;请你计算在 [1&#xff0c;n] 范围内能被 3、5、7 整除的所有整数之和。 返回一个整数&#xff0c;用于表示给定范围内所有满足约束条件的数…

深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识

文章目录 &#x1f31f; 技术架构&#xff1a;深度学习推荐系统的经典技术架构长啥样&#xff1f;&#x1f34a; 一、深度学习推荐系统的技术架构&#x1f34a; 二、基于用户行为的推荐&#x1f34a; 三、基于多模态数据的推荐&#x1f34a; 四、基于知识图谱的推荐 &#x1f3…

CEC2023:基于自适应启动策略的混合交叉动态约束多目标优化算法(MC-DCMOEA)求解CEC2023(提供MATLAB代码及参考文献)

一、动态多目标优化问题 1.1问题定义 1.2 动态支配关系定义 二、 基于自适应启动策略的混合交叉动态多目标优化算法 基于自适应启动策略的混合交叉动态多目标优化算法&#xff08;Mixture Crossover Dynamic Constrained Multi-objective Evolutionary Algorithm Based on Se…

【Overload游戏引擎细节分析】Lambert材质Shader分析

一、经典光照模型&#xff1a;Phong模型 现实世界的光照是极其复杂的&#xff0c;而且会受到诸多因素的影响&#xff0c;这是以目前我们所拥有的处理能力无法模拟的。经典光照模型冯氏光照模型(Phong Lighting Model)通过单独计算光源成分得到综合光照效果&#xff0c;然后添加…