什么是函数
将一段代码逻辑,通过特殊的语法组织起来,可以有参数,可以有返回值,能够在别的地方被调用
def是关键字,my_sum是函数名,x,y是参数
res=x+y 是函数体
return res 返回语句
函数是可以有参数,也可以没有,可以有返回值,也可以没有,默认返回None
什么是装饰器?
装饰器就是一种函数!本质上就是个函数。
装饰器的作用?
用来装饰别的函数,给其他的函数附加新的功能。
原则:1. 不能修改被装饰的函数的源代码
2. 不能改变被装饰函数的调用方式
应用场景:
比如,插入日志,性能测试,处理事务
//有一个功能,要测试一个函数的运行时间
//运行时间
//有返回值
//完美的
//终极的
理解装饰器之前,还需要理解三句话
1、函数即变量
函数也可以作为参数,函数也可以作为返回值
2、高阶函数
以函数作为参数,或者返回值是函数的函数
3、函数嵌套
函数里面定义函数
装饰器 = 高阶函数 + 嵌套函数
如果一个函数有需要加两个功能
多重装饰
从里到外一次装饰
需要耗时先输出,日志后输出
输出日志的时候,我们需要内容可以自定义
传入我们自定义的内容
闭包:
内层函数访问外层函数的变量!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
课堂习题
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import time
#计算两个数的和
# def my_sum(x,y):
# res=x+y
# return res
# #调用
# print(my_sum(1,2))
#装饰器
def log(func):
def wrapper(*args,**kw): #动态参数
print('begin call%s'%func.__name__)
temp = func(*args,**kw)
print('after call %s'%func.__name__)
return temp
return wrapper
#有一个功能,要测试一个函数的运行时间
@log
def f():
print('i am f')
time.sleep(2)
n=f
n()
# def new_f():
# s_time=time.time()
# f()
# e_time=time.time()
# print('耗时%s秒'%(e_time-s_time))
#new_f()
#f()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
#一个标准装饰器#
import functools
def log(text):
def decorator(func):
#@functools.wraps(func)
def wrapper(*args,**kw):
#print('begin call %s'%func.__name__)
print('%s %s():'%(text,func.__name__))
func(*args,**kw)
#print('after call %s'%func.__name__)
return func(*args,**kw)
return wrapper
return decorator
@log('excute')
def f():
print('i am f')
f()
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
def my_time(func):
def wrapper():
s_time =time.time()
func()
e_time = time.time()
print ('%s耗时%s秒'%(func.__name__,(e_time-s_time)))
return wrapper
@my_time #=> f = my_time(f)
def f():
print('i am f')
time.sleep(2)
# n = my_time(f)
# f=n
f()
def my_time(func):
def wrapper(*args,**kw):
#s_time =time.time()
temp=func(*args,**kw)
#e_time = time.time()
#print ('%s耗时%s秒'%(func.__name__,(e_time-s_time)))
return temp
return wrapper
@my_time #=> f = my_time(f)
def f(x,y):
return x,y
#time.sleep(2)
n=f('i am jerry',"12")
print('n=',n)