python实现链表的删除_Python中 为我们提供了一些独特的解决方案的方法特性

实际上,在日常的工作中,我们很多需求,无论是常见的、还是不常见的,Python 都为我们提供了一些独特的解决方案,既不需要自己造轮子,也不需要引入新的依赖(引入新的依赖势必会增加项目的复杂度)。

但是 Python 有太多功能和特性被我们忽略了,导致我们在遇到问题的时候,没法第一时间作出良好的决策。

50aff9ee0eea7eca83483043a7478438.png

所以,干脆来一起扫清这些被我们忽略的 Python 死角。

装饰器的妙用

我们经常会想完成一些注册&调用的功能,比如我们有四个函数:

afe9d58d2dcdb3c3d9803b751627a881.png

现在我们想将这四个函数和 +、-、*、/ 四个操作符绑定,那么我们该怎么做?

可能我们第一反应是这样:

3261c62dc6c01d3dd097c767c530aafc.png

但这样写起来,有一个很大的问题就是太不美观了。因为直接对于 dict 的操作从实际上来讲可维护性是很差的,那么我们这个地方应该怎么做?

在改进这段代码之前,我们首先要明确 Python 中一个很重要的概念,即:函数/方法是:First Class Member 。用不精确的话来讲,就是函数/方法可以作为参数被传递、被使用。

举个例子:

3f28bd7d64775e7fdd7d5f661a2cabda.png

大家可以看到我们将 print_func 这个函数作为参数传递给 execute 函数并被调用。

那么我们来改造下之前的代码:

29ec7226de82b5cd0192bd25b8436343.png

好了,大家看看,目前整体代码的可读性以及可维护性是不是改了很多?

但是我们现在的问题在于,每次都需要在单独调用一次 register_operator 函数,这样也太烦了吧!要不要再改进一下?要得。我们可以用装饰器来改进一下。

首先,看一个最简单的装饰器例子:

a908c0a7b328faed8882474c57386646.png

我们能看到这段函数的意义是计算函数的执行时间。那么这个原理是什么?

实际上装饰器是一个语法糖,具体可以参见 PEP318 Decorators for Functions and Methods。

简而言之,实际上是 Python 替我们做了一个替换过程。以上面的例子为例,这个替换过程就是 add=execute(add) 。

好了,我们就用这个知识点来改进下之前的代码:

db56eae96ee1a7eb96b158b4efe29c91.png

这样我们这段代码的注册过程是不是就显得更优雅了?

嗯,是的!实际上 Python 中有很多特性会帮助我们的代码更简洁,更优美。

接下来这个例子很可能帮我们减轻工作量。

聊聊 OrderedDict

dict 是我们经常使用的一种数据解构。但是在 Python 3.6 之前 dict 都是无序的,即我插入的顺序,和数据在 dict 中存放的顺序并无关联(笔者注:Python 3.6 dict 有序只是新版实现的顺带产物,Python 3.7 正式作为 feature 被固定下来)。

但是很多时候,比如在验签等场景,我们需要保证 dict 数据存放顺序,和我们插入顺序是一致的。那么我们该怎么办?

老板有需求下来了,我们肯定不能告诉老板这个需求没法做。那我们就自己实现一个 ordereddict 吧。于是,想了想,写了如下的代码:

7c1780587b815e5a78d98d9462dd75a2.png

通过额外维护一个 list 来维护 key 插入的顺序。这段代码,看似完成了我们的需求,但是实则存在很大问题。大家可以猜猜问题在哪?

3,2,1!

揭晓答案,这段代码利用 list 来保证 key 的有序性,在删除的时候, list 的删除操作,是一个时间复杂度 O(n) 的操作。换句话说,我们的删除操作随着内部数据的增多,所需的删除时间也变得越长。这对于某些性能敏感的场景是无法接受的。

那要怎么办呢?事实上,Python 在很早之前就已经内置了有序字典,即很多人可能都用过的 collections.OrderedDict 。

在 OrderedDict 中, Python 维护了一个双向链表解构,来保证插入的有序性,如下图所示:

69cb3d26c431d2977dc1cfbf3572fc8f.png

在最左侧维护一个卫兵节点,卫兵节点的 next 指针恒指向于数据中最后插入的节点。那么插入新的数据时,我们将新的数据插入到卫兵节点之后,从而达成维护插入顺序的目的。

在删除的时候,通过额外维护的一个字典找到待删除的 key 所对应的节点。这个操作是 O(1) 的复杂度,然后大家都知道,双向链表删除一个节点的时间复杂度也是 O(1) 。通过这样保证我们在即便有大量数据的情况下,也能保证相应的性能。

好了,我们按照这个思路来做一个最简单的实现:

d7df235483612bfc766af43ae7e262e3.png

这只是一个 OrderedDict 的简化版,如果想完成一个完整的 OrderedDict 还有很多很多的 corner case 要去处理。不过现在,我们可以使用内置的数据结构去完成我们需求。怎么样,是不是有了一种幸福的感觉?

喜欢小编文章的可以点个赞关注小编哦,小编每天都会给大家更新文章。

我自己是一名从事了多年的Python老程序员,小编为大家准备了新出的python编程学习资料,免费分享给大家!

如果你也想学习Python,那么帮忙转发一下然后再关注小编后私信“01”可以得到我整理的这些Python资料了(私信方法:点击我头像进我主页有个上面有个私信按钮)

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

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

相关文章

打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例

2019独角兽企业重金招聘Python工程师标准>>> 今年6月SAP发布C/4HANA之后,有顾问朋友们在公众号后台留言,询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来,从而打通企业的前后端业务,帮助企业实现数字化转型。 有…

爬虫的重要思想

1.理论上讲只要网页上面能够看到的数据都是可以爬取的,因为所有看到的网页上的数据都是服务器发送到我们电脑上面的,只是有的数据加密过,很难解密。 2.在网页上无法看到或者无法获取的数据,爬虫同样不可能拿到,比如一…

python web环境傻瓜搭建_python——web 环境搭建

1.安装引用第三方库 selenium pip install selenium 2.下载浏览器驱动(驱动版本和浏览器版本要对应参考链接 http://npm.taobao.org/mirrors/chromedriver/) 查看浏览器驱动对应关系,本次已最新驱动版本作为教材讲解 版本2.42 发布时间2018.9…

项目管理十大知识领域,为何不含

问:项目管理十大知识领域,为何不含以下几项:立项管理,合同管理,文档管理,变更管理? 答: 立项完了才有项目; 合同管理包含在采购管理; 变更管理在整体管理&am…

在职场遇到一个总是说话带刺的同事怎么相处?

网友: 带刺的人如果总是扑空,或者总是戳进一团棉花,你说他,她还能坚持多久。职场重心是工作,是做事,不要为这些无聊的人事太费心,刺猬带着刺到处转,最后结果不会好的。 网友&#xf…

postgresql 怎么读_大数据采集和抽取怎么做?这篇文章终于说明白了!

本文来源于公众号【胖滚猪学编程】,转载请注明出处! 关于数据中台的概念和架构,我们在大白话 六问数据中台和数据中台全景架构及模块解析!一文入门中台架构师!两篇文章中都说明白了。从这一篇文章开始分享中台落地实战…

ZooKeeper应用——解决分布式系统单点故障

1.单点故障问题什么是分布式系统中的单点故障:通常分布式系统采用主从模式,就是一个主控机连接多个处理节点。主节点负责分发任务,从节点负责处理任务,当我们的主节点发生故障时,那么整个系统就都瘫痪了,那…

生活之难:生活到底难在哪里

生活之难:生活到底难在哪里 一、总结 一句话总结:难在天性,难在竞争,难在积累,难在追求,难在自己 难在天性 人的天性就是好吃懒做好玩不动脑的,但是生存的压力(食物,房子…

python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别

原博文 2016-08-16 15:25 − Python中有3种內建的数据结构:列表、元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。 列表中的项目应该包括在方括号中,这样Python就知道你是指明一个…

Intellij IDEA展示类中的方法树形结构

在intellij Idea中叫Structure(结构体),如下图; 也可以直接AltF7快捷键,这样默认会把Structure显示在屏幕下方,如下图操作就可以移动到右侧。 效果如下:

时间计算题100道_2019四校及分校自招开放日情况汇总(含时间安排、考试内容难度、到场人数等)...

点击上方“上海初升高”,选择“星标公众号”回复“加群”就能加入上万家长信赖的升学群受到疫情的影响,今年各市重点的自招开放日报名迟迟没有提上日程。但不管怎样,自招应该是不会取消的,以下是去年四校及分校自招开放日情况汇总…

linux I/O 栈 预习(上)

二、预习 在我们进去device mapper的dm dedup学习之前,我们先要预习一下,什么是device mapper,和为什么device mapper能够做块重删。 1、device mapper照旧,我们先看一下维基百科对它的介绍。The device mapper is a framework pr…

springboot controller 访问 404

两种解决方式: 1、因为SpringBoot的项目启动类,会只扫描该包下的文件或者改包下所有子包内的文件,只要你把该文件移动到启动类的相同目录报下就可以。 2、就是在该类上面加者在启动类上添加注解 ComponentScan(basePackages {"com.boota…

fegin需要实现类_【第24条】静态成员类优于非静态成员类

第24条静态成员类优于非静态成员类嵌套类(nested class)是指定义在另一个类的内部的类。嵌套类存在的目的应该只是为它的外围类(enclosing class)提供服务。如果嵌套类将来可能会用于其他的某个环境中,它就应该是顶层类(top-level class)。嵌套类有四种:…

Springboot 多线程的使用

直接上代码 线程配置类 package zengmg.nbpi.com.thread;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework…

vlookup函数练习_为什么职场要学excel函数?看这个案例演示:自动计算快递价格...

在上一篇文章里面,我们讲了如何整理完成一个规范化的表格,以便于下一步的函数计算。最初的信息内容如图所示。经过整理,我们得到了表2这样的规范化表格。现在,我们就通过表2来实现快递费用自动计算,最终实现图中这样的…

蓝牙芯片排行_7月TWS 全球品牌出货量排行榜出炉

数据铸造影响力撰文 / 旭日大数据编辑 / 柏序旭日大数据公布了2020年7月全球TWS品牌销量排行榜,与上期数据相比,全球品牌七排名TOP20汰换率为15%,其中DOSS,万魔、BOSE跌出前20,广州由我,Tzumi登榜&…

project 打印的时候上面的表格和下面的图例中间有个很大的空白,这块东西怎么能去掉呢?

“打印预览”的“页面设置”里面,“页面”选项卡里的“缩放”项设为1页宽,1页高就可以了, 当然如果你的任务项比较少的话,怎么调也不容易去掉下面的空白 操作如下图(下图的任务太少,去不掉空白的&#xf…

加密机工作原理_端子机压力检测装置工作原理

上期我们介绍了端子机压力管理装置的使用常识,这期我们介绍端子机压力管理装置的工作原理,端子机压接管理装置,有单通道压力监测和双通道压力监测二种,双通道压力监测装置,一般用于双头端子压接机上,一台主…

win10解决java多版本java -version问题

电脑环境 先安装了Jdk8,后安装了jdk11.(发现Jdk11没有单独的jre,官网也不提供下载,集成在一起了) Java -version 将环境变量切换为 JDK11 后 javac -version 是 java编译环境是jdk11了,但 java -versio…