首页 文章 精选 留言 我的

精选列表

搜索[Python],共10000篇文章
优秀的个人博客,低调大师

python实现顺序查找和哈希查找算法

顺序查找 顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法,顺序查找是最简单的搜索算法,其实现如下: defsequential_search(items,item): foriinitems: ifi==item: returni else: returnFalse 适用于线性表的顺序存储结构和链式存储结构,该算法的时间复杂度为O(n)。 缺点:是当n 很大时,平均查找长度较大,效率低; 优点:是对表中数据元素的存储没有要求。另外,对于线性链表,只能进行顺序查找。 哈希查找算法 哈希查找算法,依赖哈希表这种数据结构,它是以键值对的形式存储数据,对于哈希查找算法来说,其时间复杂度为O(1),Redis数据表中也有哈希存储,储存形式是键

优秀的个人博客,低调大师

python设计模式(十九):备忘录模式

备忘录,定义是:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。简单来说在运行过程中我们可以记录某个状态,当遇到错误时恢复当前状态,这在业务流程中是用设计来处理异常情况。 示例code: classAddNumber: def__init__(self): self.start=1 defadd(self,number): self.start+=number print(self.start)classMemento: """备忘录""" defbackups(self,obj=None): """ 设置备份方法 :paramobj: :return: """ self.obj_dict=copy.deepcopy(obj.__dict__) print("备份数据:{}".format(self.obj_dict)) defrecovery(self,obj): """ 恢复备份方法 :paramobj: :return: """ obj.__dict__.clear() obj.__dict__.update(self.obj_dict) returnobjif__name__=='__main__': test=AddNumber() memento=Memento() foriin[1,2,3,'n',4]: ifi==2: memento.backups(test) try: test.add(i) exceptTypeErrorase: print(e) print(test.start) memento.recovery(test) print(test.start) --------------------2 备份数据:{'start':2}47 unsupportedoperandtype(s)for+=:'int'and'str'7112 上面案例是不严谨的,意在阐述备忘录的思想,实际中完整的备忘录应该有三个重要角色: 1.Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。 2.Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。 3.Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。 备忘录模式的优点和缺点 一、备忘录模式的优点 1、有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时, 使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。 2、本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需 要的这些状态的版本。 3、当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。 二、备忘录模式的缺点: 1、如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。 2、当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。 3、当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。

优秀的个人博客,低调大师

python设计模式(二十):观察者模式

观察者模式,核心抽象对象管理所有依赖他的其他类,并在设计中使其在发生变动时,主动通知并更新其他类;也叫模型-视图模式、源-收听者模式、从属者模式。 该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。 我们设计一种应用场景:当客户减少到阀值时,销售通知工厂减少生产、人力资源开始裁人,反之则增加 示例code: classObserver: """观察者核心:销售人员,被观察者number数据""" def__init__(self): self._number=None self._department=[] @property defnumber(self): returnself._number @number.setter defnumber(self,value): self._number=value print('当前客户数:{}'.format(self._number)) forobjinself._department: obj.change(value) print('------------------') defnotice(self,department): """相关部门""" self._department.append(department)classHr: """人事部门""" defchange(self,value): ifvalue<10: print("人事变动:裁员") elifvalue>20: print("人事变动:扩员") else: print("人事不受影响")classFactory: """工厂类""" defchange(self,value): ifvalue<15: print("生产计划变动:减产") elifvalue>25: print("生产计划变动:增产") else: print("生产计划保持不变")if__name__=='__main__': observer=Observer() hr=Hr() factory=Factory() observer.notice(hr) observer.notice(factory) observer.number=10 observer.number=15 observer.number=20 observer.number=25 当前客户数:10 人事不受影响 生产计划变动:减产 ------------------ 当前客户数:15 人事不受影响 生产计划保持不变 ------------------ 当前客户数:20 人事不受影响 生产计划保持不变 ------------------ 当前客户数:25 人事变动:扩员 生产计划保持不变 ------------------ 其中实现检测值的核心方法是通过property将方法伪装成属性,封装了内部的逻辑处理,而这逻辑中就包含更新相关对象的方法。 使用场景: 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 一个对象必须通知其他对象,而并不知道这些对象是谁。 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

优秀的个人博客,低调大师

python设计模式(二十一):状态模式

状态模式,当对象的内部状态改变的时候,允许对象执行不同的流程,看起来就像改写了一个对象,核心的方法是把复杂状态变化情况下的流程抽象出来,简化复杂情况状态的判断。 我们设计一个应用场景:当状态是CPU使用率,在不同状态下的自动化运维脚本执行不同的操作 示例code: classBase: defexecutor(self,value): self.run(value)classLow(Base): def__init__(self): self.name="较低占用率状态" defrun(self,value): print("当前:{}值:{}".format(self.name,value)) print("无应急情况执行")classLarge(Base): def__init__(self): self.name="较高占用率状态" defrun(self,value): print("当前:{}值:{}".format(self.name,value)) print("发送警报邮件")classStatu: def__init__(self): self.value=0.1 self.low=Low() self.large=Large() self.ststu=None defmonitor(self): ifself.value<0.5: self.ststu=self.low else: self.ststu=self.large self.ststu.executor(self.value)if__name__=='__main__': test=Statu() test.monitor() test.value=0.9 test.monitor() 当前:较低占用率状态值:0.1 无应急情况执行 当前:较高占用率状态值:0.9 发送警报邮件 优点: 1、封装了转换规则。 2、枚举可能的状态,在枚举状态之前需要确定状态种类。 3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。 缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。 使用场景:1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。 注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。

优秀的个人博客,低调大师

python设计模式(二十二):策略模式

策略模式,让一个类的行为或其算法可以在运行时更改,策略是让实例化对象动态的更改自身的某些方法使用的是types.MethodType绑定。 说起策略的动态更改方法,就不得不对比一下元类的动态增加方法,元类是类的抽象,它负责一个抽象类创建、实例化,是通过type函数来绑定方法。 假设这样的一个应用场景:一个人旅游,在不同的国家说不通的语言。 示例code: importtypesclassPeople: def__init__(self,func=None): iffunc: self.speak=types.MethodType(func,self) defspeak(self): print("说中文")defspeak_english(self): print('说英语')defspeak_german(self): print('说德语')if__name__=='__main__': test1=People() test2=People(speak_english) test3=People(speak_german) [func.speak()forfuncin[test1,test2,test3]] 说中文 说英语 说德语 使用场景:1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册