装饰器的进阶主要包含叠加装饰器和有参装饰器

叠加装饰器:在一个被装饰的对象中,添加多个装饰器。

为什么要用叠加装饰器的原因:    -每一个新的功能都应该写一个新的装饰器,否则会导致,代码冗余,结构不清晰,可扩展性差。

理解叠加装饰器的工作原理:装饰的时候就近原则,从下到上装饰,将函数包装起来。调用的时候自上往下执行最后,在最上层装饰器中return结束。

有参装饰器:

装饰中要传递参数,用三层结构的装饰器即可将参数传递。

@wrapper('参数')

有参装饰器的固定句式(一个参数)

# _*_ coding: gbk _*_
# @Author: Wonder
def certified(paramater): #这里只试验一个参数
def wrapper(func):
def inner(*args,**kwargs):
if('# 对paramater做个判断'):
#做一波条件成立的操作
res = func(*args, **kwargs)
return res
else:
#做条件不成立的操作
res = func(*args, **kwargs)
return res
return inner
return wrapper @certified('paramater') # 传参数,这里只试验一个参数
def func():
print('做一波func的操作')
return func( ) # 调用

  传多个参数的时候,在装饰器内部写入多种判断情况。可以拷贝被装饰对象,并在其上方添加参数不同的装饰器,即可实现多种判断。


wraps:是一个修复工具,修复的是被装饰对象的空间。在装饰过程中,将装饰器中的闭包函数加入
导入from functools import wraps,用法:在装饰器闭包函数上面
#6.请实现一个装饰器,限制该函数被调用的频率,如10秒一次

import time
from functools import wraps runed_time = [0]
def wrapper(func):
@wraps(func)
def inner(*args, **kwargs):
hz = int(time.time())
if hz - runed_time[0] > 10: # 查看当前执行时间和上次执行时间之差
print('没等')
res = func(*args, **kwargs)
runed_time[0] = hz
return res
else:
print('登陆中...')
p = 10 - (hz - runed_time[0])
time.sleep(p)
runed_time[0] = hz
print(f'else等候了{p}秒')
res = func()
return res return inner @wrapper
def drug():
print('执行一次') while True:
input('>>>')
drug() 
# 函数对象.__doc__: 查看函数内部的注释

迭代器 

迭代:迭代指的是重复迭代,每一次迭代都是基于上一次的结果而来的。

迭代器:迭代器指的是迭代取值的工具,它可以迭代取值

可迭代对象,字符串str、列表list、元组tuple、字典dict、集合set、文件f

可迭代对象可以通过  .__iter__()变成迭代器对象。

迭代器对象可以通过 .__next__()取值。

可迭代对象不一定是迭代器对象。   只有文件f是迭代器对象,其他都不是迭代器对象。

迭代器对象都是可迭代对象。

迭代器取值示范:

# _*_ coding: gbk _*_
# @Author: Wonder
list1 = [0, 1, 2, 3, 4]
iter_list1 = list1.__iter__() # 可迭代对象变迭代器对象
while True:
try:
print(iter_list1.__next__())
except StopIteration: # 捕获异常
break

  

迭代器的优点:

1.节省内存空间

2.提供了一种不依赖索引取值的方式

缺点:

1.无法通过len()方法计算长度

2.取指定位置的值非常麻烦

3.每次取值都从第一位开始,不可以索引取值

for循环的原理

for i in 可迭代对象
in的操作 将可迭代对象.__iter__()转变为迭代器对象,
再将迭代器对象.__next__(),对迭代器对象取值。

可迭代对象不一定都是迭代器对象,因为除文件之外的可迭代对象都不是迭代器对象
迭代器对象都是可迭代对象。

可迭代对象都有 .__iter__( )方法
迭代器对象都有.__next__( )的取值方法

CSIC_716_20191113【装饰器进阶以及迭代器】的更多相关文章

  1. day13.装饰器进阶,迭代器

    1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...

  2. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  3. Python函数--装饰器进阶

    开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...

  4. day 12 - 1 装饰器进阶

    装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...

  5. Python装饰器进阶

    装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...

  6. (转)python装饰器进阶一

    Python装饰器进阶之一 先看例子 网上有很多装饰器的文章,上来说半天也没让人看明白装饰器到底是个什么,究竟有什么用,我们直接来看几个例子. Python递归求斐波那契数列 def fibonacc ...

  7. Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)

    本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...

  8. python学习笔记-(八)装饰器、生成器&迭代器

    本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...

  9. Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化

    一.装饰器 一.装饰器的知识储备 1.可变长参数  :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...

随机推荐

  1. chrony实现局域网时间同步

    chrony基于cs架构实现,配置一台服务主机与其他客户主机即可 服务端 #yum install chrony --RHEL7默认已安装chrony,而没有安装ntpd. #systemctl st ...

  2. html5本地存储(二)--- SQLList

    html5内置了2种本地数据库,一是被称为“SQLLite”,可以通过SQL语言来访问文件型SQL数据库.二是被称为“indexedDB” 的NoSQL类型的数据库 这篇主要讲SQLLite 在js中 ...

  3. hdu6395 /// 分块矩阵快速幂

    题目大意: F(1)=A, F(2)=B,  F(i)=C*F(i-2)+D*F(i-1)+p/i(向下取整) 给定A B C D p n 求F(n) 构造 矩阵A *   矩阵B        =  ...

  4. CSIC_716_20191207【并发编程---进程与线程】

    僵尸进程与孤儿进程 ........... 守护进程 from Multiprocessing  import Process 在 suboprocess.start( ) 的上一行,增加 subpr ...

  5. CSIC_716_20191203【 socket网络编程,以及沾包问题的高级解决方式】

    AF_UNIX(本机通信) AF_INET(TCP/IP – IPv4) AF_INET6(TCP/IP – IPv6) SOCK_STREAM(TCP流) SOCK_DGRAM(UDP数据报) 远程 ...

  6. Spring Boot 2.X 对 web 的开发支持(二)

    Spring Boot 2.X 对 web 的支持开发 上章节的 Spring Boot 的入门案例,我们感受到 Spring Boot 简单的配置即可运行项目. 今天了解 Spring Boot 对 ...

  7. 关于a标签的href属性值的区别

    一.href="javacript:;"  这种用法不正确,这么用的话会出现浏览器访问“javascript:;”这个地址的现象: 二.href="javacript:v ...

  8. CSS——标签显示模式(display)

    非洲黑人: 皮肤内黑色素含量高,以吸收阳光中的紫外线,保护皮肤内部结构免遭损害,头发象羊毛一样卷曲,使每根卷发周围都有许多空隙,空隙充满空气,卷发有隔热作用. 欧洲白人: 生活寒带或着是说常年温度较低 ...

  9. NX二次开发-NX+VS写代码设断点调试技巧

    在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对. ...

  10. 良田高拍仪集成vue项目

    一.硬件及开发包说明: 产品型号为良田高拍仪S1800A3,集成b/s系统,适用现代浏览器,图片使用BASE64数据.开发包的bin文件下的video.flt文件需要和高拍仪型号的硬件id对应,这个可 ...