python三大器_python三大器(装饰器/生成器/迭代器)
1装饰器
1.1基本结构
def 外层函数(参数):
def 内层函数(*args,**kwargs);
return 参数(*args,**kwargs)
return 内层函数
@外层函数
def index()
pass
#示例:
def func(arg):
def inner():
v = arg()
return v
return inner
@func
def index():
print(123)
return 666
print(index)
@func :执行func函数把下面色函数当做参数传递,相当于:func(index)
将外层函数的返回值(内层函数)重新赋值给下面的函数名index,index = func(index)
1.2装饰器基本应用
应用场景:想要为函数扩展功能时,使用装饰器
计算运行时间
时间模块:time.time()获取当前时间
time.sleep('秒数')睡眠
# 计算函数执行时间
def wrapper(func):
def inner():
start_time = time.time()
v = func()
end_time = time.time()
print(end_time-start_time)
return v
return inner
@wrapper
def func1():
time.sleep(2)
print(123)
@wrapper
def func2():
time.sleep(1)
print(123)
func1()
1.3 带参数的装饰器
#普通装饰器基本格式
def wrapper(func):
def inner():
pass
return func()
return inner
def func():
pass
func = wrapper(func)
func()
#带参数装饰器基本格式
def w(counter):
def wrapper(func):
def inner(*args,**keargs):
lis = []
for i in range(0,counter):
a=func(*args,**keargs)
lis.append(a)
return lis
return inner
return wrapper
def func(*args,**keargs):
return 8
#面试题
# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】
def xxx(counter):
print('x函数')
def wrapper(func):
print('wrapper函数')
def inner(*args,**kwargs):
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper
@xxx(5)
def index():
return 8
v = index()
print(v)
2生成器
函数中存在yield,那么该函数为生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次驯化都会获取yield返回的值.
基本格式:
##生成器函数存在yield
def func(*args)
*args=1
yield 1
yield 2
func('a')
#函数内部代码不会执行,返回一个生成器对象
v = func('a')
#生成器是可以被for循环,一旦开始循环name函数内部代码就会开始执行.
for item in v:
print(item) #循环开始,函数运行,yield 返回值,停止第一次循环,再次循环时从上一次yield的位置开始运行
生成数字:
return 可以做终止命令,不会返回值
def func():
count = 1
while True:
yield count
count += 1
val = func()
for item in val:
print(item)
3迭代器
3.1 迭代器
迭代:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”
迭代器:帮助对某种对象(str/list/tuple类所创建的对象..)中的y元素一一获取.表象:具有__next__方法,每次迭代都返回一个值
列表转换成迭代器:
lis = iter([1,2,4,2])
lis= [1,2,4,2]._ _ iter __()
迭代器想要获取每个值就要反复调用:val = lis.__ next __()
直到报错Stopinteration取到最后一个元素
判断一个对象是否是迭代器:内部是否有__ next __方法.
v1 = [11,22,33,44]
# 列表转换成迭代器
v2 = iter(v1)
result1 = v2.__next__()
print(result1)
result2 = v2.__next__()
print(result2)
result3 = v2.__next__()
print(result3)
result4 = v2.__next__()
print(result4)
result5 = v2.__next__()
print(result5)
"""
# v1 = "alex"
# v2 = iter(v1)
# while True:
# try:
# val = v2.__next__()
# print(val)
# except Exception as e:
# break
3.2 可迭代对象
具有__inter__方法的就是可迭代对象,并且返回一个迭代器,才成为可迭代对象
v1= [11,22,33,44]
result= v1.__iter__()
能被for循环的就是可迭代对象
小结
迭代器,对可迭代对象中的元素进行逐一获取,迭代器对象的内部都有一个 __next__方法,用于以一个个获取数据。
可迭代对象,可以被for循环且此类对象中都有 __iter__方法且要返回一个迭代器(生成器)。
生成器,函数内部有yield则就是生成器函数,调用函数则返回一个生成器,循环生成器时,则函数内部代码才会执行。
生成器是特殊的迭代器(**)
python三大器_python三大器(装饰器/生成器/迭代器)相关推荐
- python三层装饰器-python开发学习day16 (三层装饰器;迭代器)
2020-06-22 目录: 一.嵌套三层的装饰器 二.迭代器 2.1 迭代器是什么 2.2 __iter__方法及其调用 2.3 可迭代的对象 2.4 迭代器对象 2.5 for循环的原理 2,6 ...
- python 装饰器 生成器 迭代器和闭包
1.1装饰器 a.装饰器本质上是python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能, 装饰器的返回值也是一个函数/类对象 b.常用的需求场景 插入日志,性能测试, 权 ...
- python三层装饰器-2020 python学习第十六天————三层装饰器与迭代器
1.2 三层装饰器 defoutter2(mode):defoutter(func):def wrapper(*args, **kwargs): inp_name=input("please ...
- python装饰器与闭包_python闭包与装饰器
本文针对: 学不会,学过即忘,学完跑路 的相关python人群. 一.Python闭包 定义: 访问了定义体以外的定义的非全局变量.(刚学时看不懂这句话太TM正常了) 定义解析: 其实就是函数里面再定 ...
- python什么是装饰器_python学习之装饰器是什么?
学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...
- python四大高阶函数_详谈Python高阶函数与函数装饰器(推荐)
一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首 ...
- [python 进阶] 第7章 函数装饰器和闭包
文章目录 7.1 装饰器基础知识 7.2 Python何时执行装饰器 7.3 使用装饰器改进"策略" 7.4 变量作用域(global) 备注 -比较字节码(暂略) 7.5 闭包 ...
- python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)
在阅读博客中,发现了类装饰器的存在,由于之前就在写类相关的专栏,这次就赶紧补上之前的内容啦.类装饰器这个词是有歧义的,因为类本身可以作为装饰器,一个类也可以被函数装饰器所装饰.今天就简单介绍一下这两种 ...
- Python小知识点(3)--装饰器
Python小知识点(3)--装饰器 (1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func):def done(*ar ...
最新文章
- python函数编程求三个数的最小公倍数_Python求三个数的最小公倍数
- 声音对比处理_厨房垃圾处理器 | 厨余垃圾分类的正确打开姿势
- 王勇DRP项目浏览器无法正常显示问题
- 解决从github上拉取代码慢的问题
- 计算机基本信息的获取
- Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍
- excel2003 java_java 读取 excel 2003 或 excel 2007
- (57)FPGA面试题-我们是否应该在敏感列表中包含组合电路的所有输入?
- 串口类QextSerialPort
- 在Vue项目中使用Echarts的一种方式
- PTA:6-3求单链表结点的阶乘和(15分)
- LDA模型理解(一)
- 展锋芒,一遇风云便化龙
- 苹果科学计算机使用方法,iPhone的计算器五大使用技巧
- c++中struct构造函数
- 双线性函数的紧凑超平面散列(Compact Hyperplane Hashing with Bilinear Functions)阅读笔记
- win10隐藏图标按钮消失的解决办法
- 资源小屋(更新ing.......)
- 电脑硬件升级——笔记本更换更大容量的固态硬盘,并进行系统迁移
- 知识图谱嵌入的Translate模型汇总(TransE,TransH,TransR,TransD