字典相关
# 形成字典
x = ['a','b','c']
y = [1,2,3]
d = dict(zip(x,y))
# 字典键与值反转
# 第一种
{k:v for v,k in d.items()}
# 第二种
new_dict = {}
for k in d.keys():
val = d[k]
new_dict[val]=k
闭包
函数里面套用函数,就是某一个定义的函数里面还有函数。(不是递归)
def adder(x):
def wrapper(y):
return x + y
return wrapper
adder5 = adder(5)
adder5(10)
>> 15
adder5(6)
>> 11
装饰器
python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。装饰器是闭包的一个应用场景之一。
例子:给代码添加一个装饰器,使每个函数输出函数的运行时间(面试的时候被问到,一脸懵逼)
无参数情形
# 定义时间函数
import time
def time_func(func):
startTime = time.time()
func()
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
@deco
def func():
print("hello")
# 程序运行中间间隔的时间
time.sleep(1)
print("world")
deco函数就是最原始的装饰器,它的参数是一个函数,然后返回值也是一个函数.@deco表示函数被注入了即时功能。
带有参数的装饰器
#带有参数的装饰器
import time
def deco(func):
def wrapper(a,b):
startTime = time.time()
func(a,b)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
return wrapper
@deco
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
if __name__ == '__main__':
f = func
f(3,4)
含有多个参数的装饰器
#带有不定参数的装饰器
import time
def deco(func):
def wrapper(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
return wrapper
@deco
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
@deco
def func2(a,b,c):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b+c))
if __name__ == '__main__':
f = func
func2(3,4,5)
f(3,4)
#func()
#等价于:
# if __name__ == '__main__':
# f = func
# vars = {'a':3,'b':4,'c':5}
# func2(**vars)
# vars_2 = [3,4]
# f(*vars_2)
其中* args, ** kwargs:
并不是必须写成* args 和** kwargs。 只有变量前面的 (星号)才是必须的. 你也可以写成* var 和** vars. 而写成* args 和** kwargs只是一个通俗的命名约定.
*args 是用来发送一个非键值对的可变数量的参数列表给一个函数
**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs
例子:
ef test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
# 可以使用*args或**kwargs来给这个小函数传递参数。 下面是怎样做:
# 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
# 现在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
一个函数可以支持多个装饰器
#多个装饰器
import time
def deco01(func):
def wrapper(*args, **kwargs):
print("this is deco01")
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print("time is %d ms" %msecs)
print("deco01 end here")
return wrapper
def deco02(func):
def wrapper(*args, **kwargs):
print("this is deco02")
func(*args, **kwargs)
print("deco02 end here")
return wrapper
@deco01
@deco02
def func(a,b):
print("hello,here is a func for add :")
time.sleep(1)
print("result is %d" %(a+b))
if __name__ == '__main__':
f = func
f(3,4)
#func()