effective python学习笔记_推导与生成

news2024/11/17 5:41:16

用推导取代map和filter

序列推导可取代map和filter,优越性有:1可读性强2不需要map的函数

控制推导逻辑的子表达式不要超过2个

推导的for层数最多建议两层,多了可读性会下降,反而用for循环会清晰

一层for内可连接多个if,if的关系为and:[i for i in range(20) if i % 2 ==0 if i % 3 == 0]

用赋值表达式消除推导中重复代码

序列推导中能定义变量的地方只有for内部,如果希望用if判断的结果,需要重写一遍if的内容,如果if用函数判断,那这个函数则要执行2次,用之前的知识可以通过海象运算符解决,可将函数调用次数只调一次

序列推导中海象运算符需要在for或if中先定义,如果在推导式中产生新值的地方(for前面)定义,然后在if引用,会报错变量未定义

如果在序列推导中没有if,然后在新值部分用了赋值表达式,那赋值表达式的变量会泄漏(类似于for i in range(5)),执行完后i是4,称这种叫泄漏。所以建议赋值表达式在序列推导中最好定义在if中

总结 1序列推导使用赋值运算符可简化代码提高可读性 2赋值运算符在序列推导里的定位位置建议优先在if中定义

函数不应该直接返回列表而是逐个生成列表里的值

当函数返回结果个数较多时,需要在函数构造返回列表并对列表append,消耗了一定代码,而且append是业务无关代码,体现不出业务,此时可用生成器,即yield,可避免结果列表的构造和append调用还能节省代码行还能节省构造列表产生的内存开销和列表操作时间开销

用yield注意点就是只能调用一次,再次调用需要重新调用函数,而不是把调用结果存到一个变量,下次调这个变量

小心迭代函数收到的参数

背景:当函数传入参数是生成器时,但函数内部又对这个生成器多次遍历,则只有第一次遍历会成功,其余遍历没有内容,可能会产生bug。但这样写的本意是减少对列表的构造,直接用序列

解决方法:在函数内部开始将生成器list化,但这样就起不到用生成器的优点了

解决方法1:改变函数的入参,不传入现成的生成器,而是传入产生生成器的函数,这样每次需要生成器时调用这个生成器函数,比如可以传入一个lambda匿名函数或者已经定义好的函数。这个方案的缺点是入参函数可读性可能较差,尤其是用lambda传入时

解决方法2:自定义一个实现__iter__方法的容器类,然后传参这个容器类的实例而不是解决方案1的入参函数。这样函数内每次遍历容器类时会调__iter__,每次调都会产生一个新的生成器。这个方案的缺点是每次构造生成器需要重新组装数据存在开销

综合解决方案:1先对入参校验类型,如果是自定义容器类可继续,如果是生成器则异常,判断生成器可用iter(generator) == generator实现,如果是生成器,iter(generator)会返回generator本身,让这个判别式为True,判断生成器类型也可使用collections.abc.Iterator类,然后用isinstance判断

用生成器表达式改写数据量较大的序列

数据量大时如果用列表生成则容易耗尽内存,此时建议用生成器,比较省内存

生成器也可以嵌套使用,即这个生成器定义时的数据来源可以是其他生成器

注意点是生成器只能用一次,多次使用时可以重新定义或调用其产生函数

用yield from连接多个生成器

连续使用多个生成器时,可能代码比较多

可以使用yield from优化,yield from后直接跟生成器,免去了for访问生成器,也节省代码行

不要用send给生成器注入数据

先快速理解send怎么玩

怎么理解:可理解为一个原子操作为先send再yield,而第一个yield前面需要有一个赋值,需要一个send,所以send None(因为send非None报错不知道为啥),后面正常操作即可

作用 生成器的send方法可实现对生成器双通道操作,即yield是生成器向外部传东西,而send是从外部向生成器内部传东西。使用yield很简单,对生成器迭代赋值即可,在生成器内部使用外部send进来的变量句法类似于a = yield b,最后a的值是外部send的传参而不是b,b是yield到外部的值

上面例子局限性 1看代码很难看懂,只有理解yield的人才能看懂 2多次调用时,总需要处理第一次send值为None的情况

解决方法 不用send了,send预期的结果可以通过向函数传递send参数列表组成的生成器实现,即避免了句法难懂和首次None的处理,功能也能ok

不要通过throw变换生成器的状态

原理 对生成器迭代时,可调用生成器的throw方法抛异常,此时如果成功抛异常,生成器下次next直接stopiteration,如果生成器处理了异常没有抛出,则next可继续往后迭代

好处 双通道

坏处 难懂,且要为生成器捕获异常写代码行,需要一些if else嵌套结构作为代码行开销

解决方法 不要通过throw给生成器注入,通过支持迭代(__iter__)的容器类作为解决方法,参数和异常通过类属性和类方法实现

考虑用itertools连接迭代器和生成器

迭代器连接方法

itertools.chain 首尾连接迭代器和生成器

itertools.repeat 构造元素重复指定次数的迭代器

itertools.cycle 迭代时循环返回入参的参数

itertools.tee 创多个平行迭代器

itertools.zip_longest zip压缩的多个迭代器长度不相同时,迭代次数为最长的那个迭代器,缺失值可提供参数fillvalue='xxx'实现

过滤迭代器元素

itertools.isslice(sequence, start_index, end_index, stride) 类似于序列切片

itertools.takewhile(sequence, take_condition)

itertools.dropwhile(sequence, drop_condition)

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

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

相关文章

为什么要使用大模型

随着OpenAI引领的超大模型风潮,大模型的发展日新月异,如同雨后春笋般茁壮成长。在现今的科技舞台上,每周,甚至每一天,我们都能见证到一个全新模型的开源,这些模型的创新性和实用性不断超越前作,…

激光雷达技术:科技之眼,照亮前行

在科技与人文关怀的交响乐章中,一项名为“蝙蝠避障”使用了激光雷达技术原理及应用的创新成果,正悄然改变着视障朋友们的生活方式,为他们的日常出行铺设了一条充满希望的光明之路。今天,让我们一起深入探讨这项技术如何成为盲人出…

关于Java Chassis 3的契约优先(API First)开发

契约优先(API First)开发是指应用程序开发过程中,将API设计作为第一优先级的任务。契约优先开发随着Web Services概念的发展而不断得到重视,特别是微服务架构出现以后,API设计成为影响功能开放、性能优化等问题的关键因…

企业外贸邮箱有哪些?国内五大外贸邮箱排行榜

外贸公司在进行跨国业务的时候,需要一个稳定安全的企业邮箱。国内的企业外贸邮箱提供商有很多,目前排行在前五的有Zoho Mail企业邮箱、阿里企业邮箱、网易企业邮箱、腾讯企业邮箱、新浪企业邮箱,今天我们就来详细了解下这些邮箱产品。 一、Z…

球形帐篷:低碳环保的未来多功能建筑—轻空间

球形帐篷是一种创新的建筑形式,以其环保、可持续的特点,正在逐渐成为未来多功能建筑的新趋势。通过采用气膜技术和轻量化材料,球形帐篷将为观众带来与众不同的观影、展览等体验,同时彰显了科技创新与环保共生的理念。 创新科技与环…

VTK数据的读写--Vtk学习记录1--《VTK图形图像开发进阶》

读和写操作是VTK可视化管线两端相关的类--Reader和Writer类 Reader:将外部数据读入可视化管线,主要步骤如下 s1:实例化Reader对象 s2:指定所要读取的文件名 s3:调用Update()促使管线执行 对应的Writer: s1:实例化Writer对象 s2输入要写的数据以及指定写入的文…

N个行业看板组态数据可视化大屏,海量模板库不用代码拖拉就行

芯软云设备管理大数据平台。 芯软云设备管理大数据平台,提供MES工艺模板、能源管理模板、智慧水务模板、智慧农业模板、实际产量、设备管理模板、布局模板等。用户可以选择自己喜欢并适合的模板进行场景构建。平台还提供除模板外,共五大类场景资源&…

IP地址证书的详细申请步骤

IP地址证书申请的条件有两个,一个是此IP必须是公网IP,另一个是IP的80和443端口必须允许短暂开放。满足这两个条件才能为其部署SSL证书。 IP地址ssl证书申请网址链接https://www.joyssl.com/certificate/select/ip_certificate.html?nid16 1 访问提供IP…

【PyTorch实战演练】使用CelebA数据集训练DCGAN(深度卷积生成对抗网络)并生成人脸(附完整代码)

文章目录 0. 前言1. CelebA数据集1.1 核心特性与规模1.2 应用与用途1.3 获取方式1.4 数据预处理 2. DCGAN的模型构建2.1 生成器模型2.2 判别器模型 3. DCGAN的模型训练(重点)3.1 训练参数3.2 模型参数初始化3.3 训练过程 4. 结果展示4.1 loss值变化过程4…

前端基础知识-ES6解构赋值(将数组内元素、字符串内字符、对象内属性值快速赋值给其他变量)

前言: 将数组、字符串、对象进行展开,并将展开的数据赋值给指定变量,以达到语法简化的目的,日常开发中可以大大提升我们的效率。 主要语法: 一、[变量1,变量2。。。]目标数组 将数组里面的内容赋给其他变量 场景1…

Linux流程控制

if语句 基本格式 if condition thencommand1 fi 写成一行 if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi if-else语句 格式 if condition thencommand1 command2...commandN elsecommand fi if else- if else if condition1 th…

3月空气净化器市场数据分析,热门品牌排行榜揭晓!

三月上旬以来,中国空气净化器行业的规模持续扩大,市场规模和消费需求也在不断提升,消费者对高质量空气的需求增加。智能化是当前空气净化器市场的一个重要发展方向,这类产品集成了空气过滤、监测等功能,满足了现代消费…

信创 | 信创基础设施建设:国内外对比分析研究

信创基础设施建设在国内外的比较分析涉及到多个方面,包括政策支持、产业发展现状、技术进步、市场应用等。通过综合分析,我们可以得出以下结论: 政策支持与发展方向:中国自2019年以来,陆续出台了一系列政策支持信创产业…

[C++基础编程]----预处理指令简介、typedef关键字和#define预处理指令之间的区别

目录 引言 正文 01-预处理指令简介 02-typedef关键字简介 03-#define预处理指令简介 04-#define预处理指令和typedef关键字的区别 (1)原理不同 (2)功能不同 &#xf…

贪心+线段树,CF720A. Closing ceremony

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 720A - Codeforces 二、解题报告 1、思路分析 如果人都在左上角…

顶级SCI优化!24年新算法冠豪猪算法CPO优化无人机集群三维路径规划!先用先发!

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 结果展示 原理讲解 一、路径长度成本 F1 …

斯坦福大学的在线密码学课程

密码学是保护计算机系统信息不可或缺的工具。在本课程中,您将了解密码系统的内部工作原理,以及如何在实际应用中正确使用它们。课程首先将详细讨论当强大的对手窃听和篡改流量时,拥有共享密钥的双方如何进行安全通信。我们将研究许多已部署的…

EtherCAT运动控制器Delta机械手应用

ZMC406硬件介绍 ZMC406是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。 ZMC406支持6轴运动控制,最多可扩展至32轴&#…

【数据库原理及应用】期末复习汇总高校期末真题试卷08

试卷 一、选择题(每题 2 分,共 30 分)    1. ___ ____是长期存储在计算机内的有组织,可共享的数据集合. A.数据库管理系统 B.数据库系统 C.数据库 D.文件组织 2. 数据库类型是按照 来划分…

【ITK配准】第十期 进化优化配准样例

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK配准中的进化优化配准样例,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 进化优化配准 …