CSIC_716_20191113【装饰器进阶以及迭代器】
装饰器的进阶主要包含叠加装饰器和有参装饰器
叠加装饰器:在一个被装饰的对象中,添加多个装饰器。
为什么要用叠加装饰器的原因: -每一个新的功能都应该写一个新的装饰器,否则会导致,代码冗余,结构不清晰,可扩展性差。
理解叠加装饰器的工作原理:装饰的时候就近原则,从下到上装饰,将函数包装起来。调用的时候自上往下执行最后,在最上层装饰器中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【装饰器进阶以及迭代器】的更多相关文章
- day13.装饰器进阶,迭代器
1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...
- day4之装饰器进阶、生成器迭代器
装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...
- Python函数--装饰器进阶
开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...
- day 12 - 1 装饰器进阶
装饰器进阶 装饰器的简单回顾 装饰器开发原则:开放封闭原则装饰器的作用:在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质:闭包函数 装饰器的模式 def wrapper(func): ...
- Python装饰器进阶
装饰器进阶 现在,我们已经明白了装饰器的原理.接下来,我们还有很多事情需要搞清楚.比如:装饰带参数的函数.多个装饰器同时装饰一个函数.带参数的装饰器和类装饰器. 装饰带参数函数 def foo(fun ...
- (转)python装饰器进阶一
Python装饰器进阶之一 先看例子 网上有很多装饰器的文章,上来说半天也没让人看明白装饰器到底是个什么,究竟有什么用,我们直接来看几个例子. Python递归求斐波那契数列 def fibonacc ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- python学习笔记-(八)装饰器、生成器&迭代器
本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
随机推荐
- B. Light bulbs(2019 ICPC上海站)
There are NN light bulbs indexed from 00 to N-1N−1. Initially, all of them are off. A FLIP operation ...
- 令人清爽的异步函数async、await
1.什么是async.await? async用于声明一个函数是异步的.而await从字面意思上是"等待"的意思,就是用于等待异步完成.并且await只能在async函数中使用; ...
- python 编写暴力破解mysql用户名密码
本文摘自别人的,自己运行调试了一下#!/user/bin/env python#-*- coding:utf-8 -*- import pymysql#导入连接数据库的模块import sys cla ...
- .nett Core之路由配置
//配置路由 app.UseMvc(buider => { buider.MapRoute("Default", "{controller=home}/{actio ...
- 全球首个开放应用模型 OAM 开源
业界要闻 全球首个开放应用模型 OAM 开源 2019 年 10 月 17 日,阿里巴巴合伙人.阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应 ...
- NX二次开发-UFUN获取点在面上的向量方向UF_MODL_ask_face_props【转载】
1 NX11+VS2013 2 3 4 #include <uf.h> 5 #include <uf_ui.h> 6 #include <uf_modl.h> 7 ...
- NX二次开发-UFUN工程图表格注释写入文本内容UF_TABNOT_set_cell_text
NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...
- [JZOJ 5819] 大逃杀
题意:求一个树上背包~~ 先贴代码存一下,好像打挂了. #include <bits/stdc++.h> using namespace std; const int maxn = 400 ...
- 【开篇】基于C#+EmguCV的机器视觉平台开发
市面上关于通用的机器视觉平台已有不少,一些大的视觉产品.设备制造商都有开发自己的一套系统.其通用性也都有一些行业局限,难以囊括所有可能性,一些需要经过二次开发,这也是难以攻克的问题.本人水平有限,再加 ...
- flutter 插件
flutter_spinkit loading动画