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

用推导取代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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LifeCycle之ProcessLifeCycleOwner

问题:想要知道应用程序当前处在前台、后台、或从后台回到前台,想要知道应用的状态, LifeCycle提供了ProcessLifeCycleOwner的类,方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…

初学者理解Transformer,本文is all you need

要问现在AI领域哪个概念最热,必然是openAI推出chatGPT之后引发的大模型。然而这项技术的起源,都来自一篇google公司员工的神作“Attention Is All You Need”——本文标题也是一种致敬^_^,目前已有近12万的引用(还在增长)。 在“Attention Is…

【qt】容器的用法

容器目录 一.QVertor1.应用场景2.增加数据3.删除数据4.修改数据5.查询数据6.是否包含7.数据个数8.交换数据9.移动数据10.嵌套使用 二.QList1.应用场景2.QStringList 三.QLinkedList1.应用场景2.特殊点3.用迭代器来变量 四.QStack1.应用场景2.基本用法 五.QQueue1.应用场景2.基本…

【设计模式】JAVA Design Patterns——Abstract-document

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

【Linux】在Linux中执行命令ifconfig, 报错-bash:ifconfig: command not found解决方案

一、报错信息 ifconfig 报错-bash:ifconfig: command not found 同时,通过ip addr查看,也看不到IP信息 二、解决方案 找到ifcfg-ens0文件,此文件的目录在/etc/sysconfig/network-scripts目录下 命令:cd /etc/sysconfig/network…

89C52单片机+ESP8266做的物联网+反馈 e4a手机客户端源程序

资料下载地址:89C52单片机ESP8266做的物联网反馈 e4a手机客户端源程序 MCU是89C52单片机 WiFi模块是ESP8266 其他 8路继电器 电源模块 使用贝壳物联做服务器 还有客户端。 也可以用花生壳做内网穿透,8266做服务器,也可以实现物联以及反馈&a…

vue多选功能

废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <template><div class"duo-xuan-page"><liv-for"(item, index) in list":key"index"click"toggleSelection(item)":class"{ active: sel…

[前后端基础]图片详解

[前后端基础]图片传输与异步-CSDN博客 https://juejin.cn/post/6844903782959022093#heading-3 base64、file和blob用JS进行互转的方法大全【前端】_js base64转blob-CSDN博客 后端存储方式 对于第一种存储方式&#xff0c;我们前端直接将存储路径赋值给 src 属性即可轻松显示。…

react项目中封装一个通用的边界Boundary

# Boundary 通用的边界,同时是一个Suspense 和一个 ErrorBoundary 正常情况不直接用,使用一下几个封装好的: -Boundary.FullSizeLoading: 占满父容器全部高度,居中显示等待动画; -Boundary.Loading: 占满一行,显示一个普通尺寸的等待动画; -Boundary.Blank: 什么都不显示…

Hadoop3:HDFS的Shell操作(常用命令汇总)

一、简介 什么是HDFS的Shell操作&#xff1f; 很简单&#xff0c;就是在Linux的终端&#xff0c;通过命令来操作HDFS。 如果&#xff0c;你们学习过git、docker、k8s&#xff0c;应该会发现&#xff0c;这些命令的特点和shell命令非常相似 二、常用命令 1、准备工作相关命令…

let命令

let 命令 let 与 var 二者区别&#xff1a; 作用域不同&#xff1a;变量提升&#xff08;Hoisting&#xff09;&#xff1a;临时性死区重复声明&#xff1a; 联系&#xff1a;举例说明&#xff1a; 块级作用域 块级作用域的关键字使用 var&#xff08;无块级作用域&#xff09;…

x64dbg中类似于*.exe+地址偏移

在CE和xdb中&#xff0c;形如*.exe数字偏移形式的地址被称为模块地址&#xff0c;CE附加到进程后点击查看内存&#xff0c;显示如下图 这种地址学名叫做模块地址&#xff0c;在x64dbg中显示如下图&#xff1a; CE中可以关闭&#xff0c;从而显示绝对的虚拟地址&#xff0c;如下…

Hive-URL解析函数

Hive-URL解析函数 1.实际工作需求 2.URL的基本组成 3.Hive中的Url解析函数 parse_url函数 parse_url_tuple函数

VScode通过ssh远程连接服务器被拒绝:permission denied, please try again

使用场景&#xff1a; 使用windows系统下的vscode远程连接服务器的linux系统&#xff0c;终端提示permission denied, please try again,但是使用cmd是可以远程登录的。 解决办法&#xff1a; 前提条件windows端的vscode安装了ssh远程连接的相关插件Remote - SSH&#xff0c;…

红米Turbo3小米平板6SPro澎湃OS系统强解BL锁-跳小米社区绑定-刷ROOT权限

红米Turbo3小米平板6SPro这2款设备都出厂为澎湃OS系统&#xff0c;官方提供都是小米社区申请解锁权限&#xff0c;然后自己答题解锁&#xff0c;门槛非常高&#xff0c;想要玩机root的用户&#xff0c;都在堵在门外。还在这目前这两款机型官方并没有加入强制验证&#xff0c;在…

何为基差?股指期货的升水和贴水又怎么理解?

基差是一个金融术语&#xff0c;它指的是现货价格和期货价格之间的差额。在股指期货市场中&#xff0c;现货就是指实际的股票指数&#xff0c;而期货则是基于这个指数未来某个时间点的价格预期。基差可以是正的或负的&#xff0c;具体取决于期货价格是高于还是低于现货价格。 1…

机器人种类分析

2000年前&#xff0c;机器人主要应用于工业生产&#xff0c;俗称工业机器人&#xff0c;由示教器操控&#xff0c;帮助工厂释放劳动力&#xff0c;此时的机器人并没有太多智能而言&#xff0c;完全按照人类的命令执行动作&#xff0c;更加关注电气层面的驱动器、伺服电机、减速…

Springboot集成Netflix-ribbon、Consul实现负载均衡调用-09

Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康检查、键值存储等功能。 核心功能 服务发现&#xff1a;Consul通过DNS…

JavaScript百炼成仙自学笔记——13

函数七重关之六&#xff08;“new”一个函数&#xff09; 看个代码&#xff1a; function hello(){console.log(this); } 1、this&#xff1a;也是JavaScript中的一个关键字&#xff0c;永远指向当前函数的调用者 解释一下,有两层意思&#xff1a; ①this要嘛不出现&#…

基于SSM的“环卫工管理平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“环卫工管理平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体设计图 注册 首页 后台登录 后台页面 环卫工管理 摘…