装饰器&推导式
传参位置参数在前,关键词参数在后
函数不被调用内部代码不被执行
-
函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰
#经典案例
def func(num):
def inner():
print(num)
return inner
result = []
for i in range(10):
f = func(i)
result.append(f)
v1 = result[0]()
v2 = result[9]()
print(v1,v2)
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()
2.推导式
2.1列表推导式
方便生成一个列表
-
基本格式
# 变量 = [元素 for 元素 in 可迭代对象]
# 变量 = [元素 for 元素 in 可迭代对象 if 条件] **条件为True时元素才能添加到列表
lis = [i for i in 'bigox']
print(lis) lis = [i+100 for i in rang(10)]
print(lis) lis = [99 if i>5 else 66 for i in range(10)]
print(lis)
# 题
v8 = [lambda x:x*i for i in range(10)]
# 1.请问 v8 是什么?
# 2.请问 v8[0](2) 的结果是什么?
# 题
def num():
return [lambda x:i*x for i in range(4)]
# num() -> [函数,函数,函数,函数]
print([ m(2) for m in num() ]) # [6,6,6,6]
2.2集合推导式
-
参照列表推导式,注意集合不能重复
# 变量 = {元素 for 元素 in 可迭代对象}
# 变量 = {元素 for 元素 in 可迭代对象 if 条件} **条件为True时元素才能添加到列表
2.3字典推导式
-
基本格式
dic = {'k'+str(i) for i in range(10)}
小结
- 装饰器
- 书写格式
- 原理
- 应用格式
- 推导式
- 内置模块
- time.time() 获取当前时间,具有返回值
- time.sleep(秒数) 运行时驻留秒数