装饰器、

装饰器实际就是一个函数

定义:在不改变内部代码和调用方式的基础上增加新的功能

了解装饰器需要了解3个内容:

1、函数即变量

2、高阶函数

1)、把一个函数名当作实参传给另一个函数

2)、返回值中包含函数名

例1:

def test():  #定义函数test

print('this is test func')   #打印(下方没有调用,所以不打印)

def deco(func):  #定义函数deco,赋个形参(=test)

print('this is deco')  #打印

func()  #调用test函数

returnfunc  #返回值

res = deco(test)#调用test的内存地址

print(res)  #打印test内存地址

运行结果:

例2:

importtimedeftest():

time.sleep(3) #睡3秒,期间不占内存

print('this is test func')def deco(func): #func = test

start_time = time.time() #开始执行的时间戳

func() #test()

end_time = time.time() #结束执行的时间戳

print('this is run %s' % (end_time-start_time)) #执行所用的时间

return func #把test的内存地址返回给函数

res=deco(test)print(res)

运行结果:

3、嵌套函数

嵌套函数,调用时需要,一层一层的调用

deftest():defdeco():print('this is test')

deco()

test()

运行结果:

装饰器练习

例1:普通装饰器

给下面的函数添加新功能

deftest():print('this is test')

test()

需要定义一个新函数进行添加

def deco(func): #形参

defwrapper():

func()print('新功能') #用打印代替新功能return wrapper

原函数调用新函数

deftest():print('this is test')

result= deco(test) #定义变量接收repper的内存地址

result()

为了不使原函数的调用方式更改,将变量result 换成 test接收

deftest():print('this is test')

test=deco(test)

test()

为了不更改原函数代码,用@放在原函数前,来代替函数中的“rest = drco(test)”

defdeco(func):defwrapper():

func()print('新功能')returnwrapper

@decodeftest():print('this is test')

test()

运行结果:

例2:带参数的装饰器

如果原函数带传参数的情况

deftest(name):print('my name is %s'%name)

test('aaa')

那么添加新功能时,需要添加参数

defdeco(func):def wrapper(name): #传参数

func(name) #传参数

print('新功能')return wrapper

如果原函数参数很多

deftest(name, age, job):print('my name is %s, my age is %s, my job is %s'%(name, age, job))

test('aaa', 18, 'IT')

那么我们添加功能的函数时也要添加所有的参数

defdeco(func):def wrapper(name, age, job): #传参数

func(name, age, job) #传参数

print('新功能')return wrapper

因为比较麻烦所以传参数的快捷方式,不用考虑参数个数

defdeco(func):def wrapper(*args, **kwargs):

func(*args, **kwargs)print('新功能')returnwrapper

@decodeftest(name, age, job):print('my name is %s, my age is %s, my job is %s'%(name, age, job))

test('aaa', 18, 'IT')

运行结果:

迭代器、迭代的工具

什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值

whileTrue:print('hello world')

上面这种方式只有重复,结果并不是下一次的初始,所以不是迭代

例:不用for循环,用while循环将下边几种数据类型逐个取出

字符串:s = 'helloworld'

列表:l = ['a','b','c','d','e']

元组:t = ('a','b','c','d','e')

字典:dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}

集合:set1 = {'a','b','c','d','e'}

文件:f = open('a.txt', 'w', encoding='utf-8')

整数:12345 (不能迭代)

1 =0while 1

i+= 1

如果经过上边的循环进行测试会发现:

对于序列类型的字符串,列表,元组可以依赖于索引来迭代取值,

但是字典,集合,文件却不行,所以,python必须为我们提供一种不依赖于索引取值的方法,就是迭代器

可迭代对象

判断是否是可迭代对象

可以在pycharm软件中试验,如果有"xx.__iter__"这种用法那么就是能变成可迭代对象

加"xx.__iter__"就是把一个对象变成可迭代对象"xx.__iter__"可以简写成"iter(xx)"

迭代器对象

有"xx.__iter__"和"xx__next__"这两种方法的就是迭代器对象

print(f is f.__iter__()) #f是上边的文件类型

运行结果:

由此看出,文件类型本身就是可迭代对象

next方式取值

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}

d_items= dict1.__iter__()

res= d_items.__next__()

res1= d_items.__next__()

res2= d_items.__next__()print(res)

可以调取 res,res1,res2,分别是三个key然后就可以根据key的来调取值了,"xx.__next__()"可以简写成"next()"

但是它每取一个值要多一条代码,只能一个一个取,迭代器优点:同一时间在内存里只有一个值,节省内存空间

若想一起取,所以我们要采用while方式

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}

d_items= dict1.__iter__()whileTrue:

res= d_items.__next__()print(res)

因为系统会停止迭代报错

运行结果:

异常处理:try....except +错误

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}

d_items= dict1.__iter__()whileTrue:try:

res= d_items.__next__()print(res)exceptStopIteration:break

运行结果:

,这样就可以取值了,

通过以上的步骤,我们知道了取值的原理及过程,这个原理同样也是for循环的原理

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}for i in dict1: #相当于dict1.__iter__(),即变成可迭代对象

print(i)

运行结果:

总结

可迭代对象不一定是迭代器对象

迭代器对象一定是可迭代对象

python迭代器的用法_python的装饰器,迭代器用法相关推荐

  1. python 函数装饰器_python函数装饰器的用法

    函数装饰器: 开闭原则:在面向对象编程领域中,开闭原则规定"软件中的对象(类,模块,函数等等)应该对于扩展是开放的, 但是对于修改是封闭的",这意味着一个实体是允许在不改变它的源代 ...

  2. python函数装饰器有什么用_Python @函数装饰器及用法(超级详细)

    前面介绍的 @staticmethod 和 @classmethod 的本质就是函数装饰器,其中 staticmethod 和 classmethod 都是 Python 内置的函数. 使用 @ 符号 ...

  3. python中装饰器的作用_Python中装饰器的用法

    装饰器的作用 当我们需要为函数拓展新的功能,但是又不能修改函数的内部结构时,就可以通过装饰器来完成.通过装饰器为函数拓展功能符合"对于扩展是开放的,对于修改是封闭的"这一开闭原则. ...

  4. python函数装饰函数_Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  5. python装饰器实例-Python装饰器简单用法实例小结

    本文总结分析了Python装饰器简单用法.分享给大家供大家参考,具体如下: 装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能. 比如,运行 ...

  6. python装饰器函数执行后日志_一篇文章搞懂Python装饰器所有用法

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起 ...

  7. python装饰器 property_介绍Python的@property装饰器的用法

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  8. 介绍Python的@property装饰器的用法_python_脚本之家

    介绍Python的@property装饰器的用法_python_脚本之家 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Studen ...

  9. python装饰器与闭包_Python:函数装饰器和闭包

    摘自<流畅的python> 7.1 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用 ...

最新文章

  1. [数位dp] spoj 10738 Ra-One Numbers
  2. SAP 产品一脉相承的 UI 增强思路,在 SAP Commerce Cloud(电商云) UI 增强实现中的体现
  3. 达内培训c语言,【达内C  培训教程】C语言实例 分数之和
  4. 20145227《Java程序设计》第10周学习总结
  5. java 获取mongodb的连接数
  6. 华为交换机实操系列(资源)
  7. 货币转换python代码_[Python3 练习] 003 货币转换
  8. 算法题04:分治法:求第K小元素(线性时间选择算法)
  9. 2019腾讯后台开发详细面试流程
  10. Proe3.0-5.0安装说明
  11. 2048游戏(C语言)
  12. 当年,学姐把这份Java总结给我,让我在22k的校招王者局乱杀
  13. 解决雷神笔记本风扇声音太响太吵问题
  14. HDUOJ1234开门人和关门人
  15. python简单的人脸识别系统(PCA+逻辑回归)
  16. 抖音复制微信号跳转微信的链接怎么生成的?
  17. 华为交换机替换H3C交换机-割接过程
  18. flowable 监听器
  19. 如何查看 SQL 执行频率
  20. 神器Jinja2,用 Python 快速生成分析报告!

热门文章

  1. OpenJ_Bailian - 2692 假币问题
  2. AR涂涂乐⭐五、关于“4”的部分解决方案
  3. 2019牛客暑期多校训练营(第四场)----E- triples II
  4. 怎样一次性删掉word或wps文档里的空格行
  5. win8.1中文版升级专业版
  6. IDEA使用教程(二) 快捷键
  7. 交通指示牌的特征匹配代码
  8. sRGB转CIEXYZ转CIELAB,以及色彩距离
  9. 通过域名访问路由器配置界面的功能实现
  10. Idea突然不停indexing的问题