概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能
def 外层函数(参数)
def 内层函数(*args,**kwargs)
#函数执行之前
data= 参数(*args,**kwags)
#函数执行之后
return data
return 内层函数
用法示例:
def func(arg):
def inner():
v = arg()
return v
return inner
# 第一步:执行func函数并将下面的函数当做参数进行传递, 相当于:func(index)
# 第二步: 将func返回的值重新赋值给下面的函数名 index = func(index)
@func #@装饰器的语法
def index():
print(123)
return 666
print(index)
应用示例
#示例:计算函数执行时间
import time
def base(func):
def inner():
start_time = time.time() --->#函数执行之前
v= func()
end_tme = time.time() ---->#函数执行之后
print(end_time-start_time)
return v
return inner
@base
def func1():
time.sleep(2) # 函数执行延缓2秒
print(123)
@base
def func2():
time.sleep(1)
print(456)
关于返回值
def base(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
@x1
def index():
print(123)
return 666
v1 =index()
print(v1)
#func函数带括号,执行index函数,先打印'123',先将666返回给data,data再返回给v1
关于前后
def base(func):
def inner(*args,**kwargs)
print('函数调用之前')
data = func(*args,**kwargs) #执行原函数并获取返回值
print('调用原函数之后')
return data
return inner
@base
def index()
print(123)
index()
基本格式
def base(counter):
def wrapper(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper
@base(9)
def index():
pass
#先执行base函数,然后将返回值wrapper返回,变成不带参数的装饰器
用法示例
#写一个带参数的函,实现:参数是多少,被装饰的函数就要执行多少次,返回最后一次执行的结果
def base(counter):
def wrapper(func):
def inner(*args,**kwargs):
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数并获取返回值
return data
return inner
return wrapper
@base(5)
def index():
return 好难啊
v = index()
print(v)
概念:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数,会返回一个生成器,生成器只有被for循环时,生成器内部代码才会执行,每次循环都会获取yield返回的值
生成器函数 : 内部是否包含yield
def func():
print('F1')
yield 1
print('F2')
yield 2
print('F3')
#函数内部代码不会执行,返回一个生成器对象
v1 = func()
#生成器可以被for 循环,一旦开始循环函数内部代码就开始执行
for item in v1:
print(item)
# F1 1 F2 2 F3
特殊的迭代对象
def func():
yield 1
v = func()
result = v.__iter__()
print(result)
概念:对某种对象(str/lsit/tuple/dict/set类创建的对象)中的元素进行逐一获取,表象:具有__nest__
方法且每次调用都获取可迭代对象中的元素
列表转换成迭代器
v1 = iter([1,2,3,4])
v2 = [1,2,3,4].__iter__
()
迭代器想要获取每个元素 : 反复调用val = v1.__next__
()
v1 = "alex"
v2 = iter(v1)
while True:
try:
val = v2.__next__()
print(val)
except Exception as e:
break
直到报错:stoplteration错误,表示迭代已经完毕
如何判断一个对象是否是迭代器 : 内部是否有__next__
方法
for 循环
v1 = [11,22,33,44]
# 1.内部会将v1转换成迭代器
# 2.内部反复执行 迭代器.__next__()
# 3.取完不报错
for item in v1:
print(item)
可迭代对象
内部具有_iter__
方法且返回一个迭代器
可以被for 循环
列表推导式(也叫列表生成式)
基本格式
v1 = [i for i in 可迭代对象]
v2 = [i for i in 可迭代对象 if 条件] #条件为true才进行append
#示例
v1 = [99 if i>5 else 66 for i in range(10)]
v2 = [lambda : 100 for i in range(10)]
result = v5[9]() # 100
v3 = [lambda :i for i in range(10)]
result = v7[5]() # 9
v4 = [lambda x:x*i for i in range(10)]
# 1.请问 v4 是什么?
函数地址
# 2.请问 v4[0](2) 的结果是什么?
18
def num():
return [lambda x:i*x for i in range(4)]
# num() -> [函数,函数,函数,函数]
print([ m(2) for m in num() ]) # [6,6,6,6]
#####筛选#####
v = [i for i in range(10) if i > 5]
集合推导式
v1 = { i for i in 'alex' }
字典推导式
v1 = { 'k'+str(i):i for i in range(10) }
生成器推导器
def func():
for i in range(10):
yield i
v2 = func()
#或者
v2 = (i for i in range(10)) # 生成器推导式(不是元组推导式),创建了一个生成器,内部循环为执行。
for item in v2:
print(item)