dict下如何取值_年薪百万之路--第十七天 装饰器(下)和迭代器

0c66a01fb5313ca508428c7bcf723b97.png

一 有参装饰器

>带有参数的函数装饰器

为被装饰对象添加认证功能的装饰器,实现的基本形式如下

def deco(func):def wrapper(*args,**kwargs):编写基于文件的认证,认证通过则执行res=func(*args,**kwargs),并返回resreturn wrapper

如果想提供多种不同的认证方式以供选择,单从wrapper函数的实现角度改写如下

def auth(func,db_type):def wrapper(*args, **kwargs):name=input('your name>>>: ').strip()pwd=input('your password>>>: ').strip()if db_type == 'file':print('基于文件的验证')if name == 'egon' and pwd == '123':res = func(*args, **kwargs)return reselse:print('user or password error')elif db_type == 'mysql':print('基于mysql的验证')elif db_type == 'ldap':print('基于ldap的验证')else:print('不支持该db_type')return wrapper

函数wrapper需要一个driver参数,而函数deco与wrapper的参数都有其特定的功能,不能用来接受其他类别的参数,可以在deco的外部再包一层函数auth,用来专门接受额外的参数,这样便保证了在auth函数内无论多少层都可以引用到

def auth(db_type):def deco(func):def wrapper(*args, **kwargs):name = input('your name>>>: ').strip()pwd = input('your password>>>: ').strip()if db_type == 'file':print('基于文件的验证')if name == 'egon' and pwd == '123':res = func(*args, **kwargs)  # index(1,2)return reselse:print('user or password error')elif db_type == 'mysql':print('基于mysql的验证')elif db_type == 'ldap':print('基于ldap的验证')else:print('不支持该db_type')return wrapperreturn deco

想要保留原函数的文档和函数名属性,需要修正装饰器

def timer(func):def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return reswrapper.__doc__=func.__doc__wrapper.__name__=func.__name__return wrapper

上述方式来实现保留原函数属性过于麻烦,functools模块下提供一个装饰器wraps专门用来

from functools import wrapsdef timer(func):@wraps(func)def wrapper(*args,**kwargs):start_time=time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return resreturn wrapper

>带有参数的类装饰器

#参数1 : 给修饰的类添加成员属性和方法
#参数2 : 给类中的run方法变成属性class Kuozhan():ad = "我是属性"def char(self):print("我是方法")def __init__(self,num):self.num = numdef __call__(self,cls):print(cls)if self.num == 1:return self.kuozhan1(cls)elif self.num == 2:return self.kuozhan2(cls)#参数1的情况:添加成员属性和方法def kuozhan1(self,cls):def newfunc():cls.ad = Kuozhan.adcls.money = Kuozhan.moneyreturn cls()return newfunc#参数2的情况:把方法变成属性def kuozhan2(self,cls):def newfunc():if "run" in cls.__dict__:cls.run = cls.run()return cls()return newfunc
#
@Kuozhan(1)
class MyClass():def run():return "运动"
obj = MyClass()
print(obj.ad)
obj.money()#
@Kuozhan(2)
class MyClass():def run():return "运动"
obj = MyClass()
print(obj.run)

>property

可以把方法变成属性 : 可以动态的控制属性的获取,设置,删除相关操作

@property 获取属性

@方法名.setter 设置属性

@方法名.deleter 删除属性

class MyClass():def __init__(self,name):self.name = name@propertydef username(self):return self.name@username.setterdef username(self,val):self.name = valpass@username.delsterdef username(self):def self.namepass
obj = MyClass("小红")
获取指的时候自动触发@property 装饰器下的方法
res = obj.username
print(res)#设置值的时候自动触发@username.setter装饰器下的方法
obj.username = "小白"
print(obj.username)
class Myclass():def __init__(self,name):self.name = name #获取数据def get_username(self):return self.name#设置数据def set_username(self,val):self.name = val#删除数据def del_username(self):del self.name#参数的顺序:获取,设置,删除username = property(get_username, set_username, del_username)obj = MyClass("小白")
#获取值的时候,执行get_username下的相关操作
print(obj.username)
#设置值的时候,执行set_username下的相关操作
print(obj.username)
#删除值的时候,执行del_username下的相关操作
del obj.username
print(obj.username)

二 迭代器

1、什么是迭代器
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复
都是基于上一次的结果而继续的,单纯的重复并不是迭代
2、为何要有迭代器
迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型
有:列表、字符串、元组、字典、集合、打开文件

l=['egon','liu','alex']i=0while i < len(l):print(l[i])i+=1

上述迭代取值的方式只适用于有索引的数据类型:列表、字符串、元组
为了解决基于索引迭代器取值的局限性
python必须提供一种能够不依赖于索引的取值方式,这就是迭代器
3、如何用迭代器

1、可迭代的对象

从语法形式上讲,内置有__iter__方法的对象都是可迭代对象,字符串、列表、元组、字典、集合、打开的文件都是可迭代对象

2、调用可迭代对象下的__iter__方法会将其转换成迭代器对象

3、可迭代对象与迭代器对象详解
可迭代对象("可以转换成迭代器的对象"):内置有__iter__方法对象
可迭代对象.__iter__(): 得到迭代器对象
迭代器对象:内置有__next__方法并且内置有__iter__方法的对象
迭代器对象.__next__():得到迭代器的下一个值
迭代器对象.__iter__():得到迭代器的本身

4、可迭代对象:字符串、列表、元组、字典、集合、文件对象
迭代器对象:文件对象

5、for循环的工作原理:for循环可以称之为叫迭代器循环,in后可以跟任意可迭代对象

1、d.__iter__()得到一个迭代器对象
2、迭代器对象.__next__()拿到一个返回值,然后将该返回值赋值给k
3、循环往复步骤2,直到抛出StopIteration异常for循环会捕捉异常然后结束循环

6、迭代器优缺点总结
6.1 优点:
I、为序列和非序列类型提供了一种统一的迭代取值方式。
II、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
6.2 缺点:
I、除非取尽,否则无法获取迭代器的长度
II、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

三 生成器

如何得到自定义的迭代器:
在函数内一旦存在yield关键字,调用函数并不会执行函数体代码
会返回一个生成器对象,生成器即自定义的迭代器

def func():print('第一次')yield 1print('第二次')yield 2print('第三次')yield 3print('第四次')触发函数体代码的运行,然后遇到yield停下来,将yield后的值
当做本次调用的结果返回
res1=g.__next__()
print(res1)

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

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

相关文章

英雄联盟掉线怎么不显示重新连接服务器,Win7旗舰版系统玩英雄联盟掉线总是显示正在尝试重新连接如何解决...

英雄联盟这款游戏想必大家都非常熟悉吧&#xff0c;然而在玩的过程中总是会碰到一些情况&#xff0c;比如有不少win7旗舰版系统用户在玩英雄联盟的时候&#xff0c;遇到掉线了&#xff0c;总是显示正在尝试重新连接&#xff0c;该怎么办呢&#xff0c;本文就给大家讲解一下Win7…

cobaltstrike扩展_Malwarebytes:使用可变C2下发Cobalt Strike的APT攻击

6月中旬&#xff0c;Malwarebytes Labs的研究人员发现了一个伪装成简历的恶意Word文档&#xff0c;该文档使用模板注入来删除.Net Loader。研究人员认为这是与APT攻击有关的多阶段攻击的第一部分。在最后阶段&#xff0c;威胁行动者使用了Cobalt Strike’s Malleable C2功能来下…

浙江大学计算机保研条件_【如何将保研成功率提至100%】来自取得浙大等五所顶尖院校保研资格学长的干货分享(联系导师章节已更)...

一、前言写在开头&#xff1a;白驹过隙&#xff0c;距离2020年9月28日保研系统确认拟录取已经过去了四个半月了&#xff0c;期间多次有想要写下从了解&#xff0c;到准备&#xff0c;到参与&#xff0c;到录取的整个保研过程&#xff0c;同时分享一些自己踩过的雷&#xff0c;总…

怎么把BAK文件放入服务器中,BAK格式的备份文件如何导入审计软件

首先&#xff1a;电脑上得安装有SQL数据库&#xff0c;并开启&#xff1b;一般来说&#xff0c;只有以SQLSEVER数据库存储的都可以用数据库软件&#xff0c;对备份文进行取数&#xff1b;1)在审计系统里面导入bak&#xff0c;必须满足前提条件&#xff1a;自己电脑上安装有sqls…

手机显示无法接通服务器是怎么回事,手机无法接通是什么原因及如何解决【图文】...

手机&#xff0c;已经成为我们日常生活中必不可缺少的电子产品&#xff0c;不论男女老少一般都配备有一部手机&#xff0c;有些人甚至配备了两部、三部手机。手机的主要功能是通讯功能&#xff0c;给别人拨打电话或者接听别人拨打的电话。有时候我们在拨打别人电话的时候可能会…

spark算子大全glom_(七)Spark Streaming 算子梳理 — repartition算子

目录天小天&#xff1a;&#xff08;一&#xff09;Spark Streaming 算子梳理 — 简单介绍streaming运行逻辑天小天&#xff1a;&#xff08;二&#xff09;Spark Streaming 算子梳理 — flatMap和mapPartitions天小天&#xff1a;&#xff08;三&#xff09;Spark Streaming 算…

550什么意思_布草知识 | 都是羽绒,为什么价格大不同?

为什么羽绒的价格有些便宜有些这么贵呢&#xff1f;让小编来告诉你&#xff01;市面上羽绒制品这么多&#xff0c;从几百到上万都有&#xff0c;中间的区别到底在哪里呢&#xff1f;接下来&#xff0c;我们就来说说&#xff0c;它们到底贵在哪里~01暖不暖&#xff0c;看蓬松度羽…

可调整大小的div_气液增压缸运行速度的调整以及压力的调节方式

点击蓝字 关注我们增压缸的行程及吨位绝对了设备整体速度&#xff0c;以下的调整只是在原基础上起到微调的作用。(1)气液增压缸时间调整&#xff1a;增压缸四个步骤动作是依靠时间继电器来控制的&#xff0c;可根据不同的产品的需求&#xff0c;通过时间继电器来调整每个步骤的…

pytest测试实战 电子书_电子书丨Selenium 3+Python 3自动化测试项目实战:从菜鸟到高手...

▊《Selenium 3Python 3自动化测试项目实战&#xff1a;从菜鸟到高手》田春成 著电子书售价&#xff1a;39.5元2019年9月出版Selenium是目前非常流行的一种自动化测试工具。本书基于Python 3语言讲述了新的Selenium 3的基本理论与操作&#xff0c;涉及各种高级应用&#xff0c;…

phpcms移动端和pc端_移动端调试大法

文章&#xff1a;樊秀宝(北京中心—小易F8技术小组)排版&#xff1a;suny在日常项目中的开发中&#xff0c;接触移动端开发的小伙伴们免不了要和移动端调试打交道。本文总结了常用的移动端调试方法&#xff0c;欢迎大家学习和补充。01谷歌浏览器谷歌浏览器是我们前端开发中必不…

redis 中一个字段 修改map_CTO 指名点姓让我带头冲锋,熬了一个通宵,终于把Redis中7千万个Key删完了...

由于有一条业务线不理想&#xff0c;高层决定下架业务。对于我们技术团队而言&#xff0c;其对应的所有服务器资源和其他相关资源都要释放。释放了 8 台应用服务器&#xff1b;1 台 ES 服务器&#xff1b;删除分布式定时任务中心相关的业务任务&#xff1b;备份并删除 MySQL 数…

太阳花图片_长寿花扔水里,光长叶不开花?赶紧加点营养液

养个花可不简单&#xff0c;春天一到还得操心换盆、换土&#xff0c;如果你像偷懒的话&#xff0c;还不如养些能水培的花&#xff0c;给它一杯水就够了&#xff0c;实在太省心啦&#xff01;铜钱草铜钱草实在太好养了&#xff0c;摘一枝放在水杯里就能活&#xff0c;还挺有意境…

hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix

Feign默认已经整合了Hystrix&#xff0c;本节详细探讨Feign使用Hystrix的具体细节。服务降级1 加配置&#xff0c;默认Feign是不启用Hystrix的&#xff0c;需要添加如下配置启用Hystrix&#xff0c;这样所有的Feign Client都会受到Hystrix保护&#xff01;feign:hystrix:enable…

ubuntu 改屏幕分辨率命令_Ubuntu被曝严重漏洞!!!

GitHub安全研究员Kevin Backhouse发现的一个Ubuntu系统大漏洞。无需系统密码&#xff0c;就能添加新的sudo用户、获取root权限&#xff0c;事后还能删除不留痕迹。这种攻击方法非常简单&#xff0c;Backhouse在官方博客中写道&#xff1a;“使用终端中的一些简单命令&#xff0…

swag您的装置不支持_一件充满意境的中国风水墨粒子、电子屏风交互装置

不久前有人留言怎么用粒子做水墨&#xff0c;今天投石科技给大家分享个水墨粒子装置作品案例&#xff0c;大家可以发挥自己的想象去做中国风的一些东西&#xff0c;希望能对大家有些帮助吧。《墨迹》这是一个数字山水画的交互装置&#xff0c;它通过摄像头捕捉手部运动进行互动…

弱电工程集成商_弱电工程楼宇自控系统基础知识培训资料

前言&#xff1a;弱电行业里面楼宇自控系统是非常难的一个子系统&#xff0c;涉及到很多其他专业&#xff0c;楼宇自控系统的设计一般为厂家设计&#xff0c;但是也有系统集成商来设计的&#xff0c;楼宇自控系统主要学习它的控制原理&#xff0c;学习完以后学习DDC箱子的绘制&…

删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...

1 要解决的问题&#xff1a;删除某列中的空单元格/空行暂时只实现了删除一列中的空行&#xff0c;并没有实现多行的判断空行和删除方法。----之后再做更复杂的1.1 需求分析用VBA删除如下内容&#xff0c;解决思路都不同删除1列的空行&#xff08;本文要做的&#xff09;删除整个…

winpe制作u盘启动盘_怎么制作u盘启动盘 u盘启动盘制作方法【介绍】

使用u盘装系统时就需要先将u盘制作成一个启动u盘&#xff0c;这样才能够通过u盘启动装系统操作&#xff0c;那么 如何制作u盘启动盘 呢?为此&#xff0c;今天我们就为小伙伴们详细的介绍 怎样制作u盘启动盘 的操作。制作u盘启动盘准备工作&#xff1a;① 、准备一个空间容量大…

插入空行_如何一键插入表格空行,这个方法才最高级!

100万职场人都在看后台回复礼包领199元职场干货很久很久之前&#xff0c;小可教过大家如何一键删除空行&#xff0c;回顾请戳→《如何一键删除表格空行&#xff0c;这个方法才最高级&#xff01;》这次&#xff0c;小可反过来&#xff0c;教大家如何一键插入很多空行&#xff0…

的控制台主题_【12.11最新版】芯片机/大气层主题软件NXThemesInstaller

Switch的主题的安装和管理主要通过自制软件——NXThemesInstaller软件地址&#xff1a;https://github.com/exelix11/SwitchThemeInjector本文只传了工具&#xff0c;主题需要自行去下载&#xff0c;可以按照自己喜欢的更换&#xff01;&#xff01;教程简单概括如下这是最常见…