1 函数
1.1 函数即变量
函数定义:把一个函数体作为变量赋值给一个函数名,同时函数体存放到内存中。
函数调用:根据函数名去内存中寻找对用的函数体,找到了就执行。
>>> def bar():
... pass
...
>>> bar
<function bar at 0x006BE930>
#只写函数名,打印了对应函数体的内存地址。bar()加括号,表示调用。
1.2 高阶函数
把函数名作为变量实参传给另一个函数
def bar(func):
print(func)
func()
def foo():
print('in foo')
bar(foo)
>>>
<function foo at 0x004BB6F0>
in foo
#调用bar函数,将foo函数名传参,打印foo的内存地址,然后执行foo函数。
函数返回值为函数
def bar(func):
start = time.time()
func()
stop = time.time()
print('cost time %f s' %(stop-start))
return func
def foo():
print('in foo')
time.sleep(3)
foo = bar(foo)
foo()
#首先运行bar(foo),在bar函数体内调用foo,然后返回foo的内存地址,赋值给foo,再运行foo。
1.3 嵌套函数
在一个函数内再次声明一个def func()
def timer(func):
def bar():
start = time.time()
func()
stop = time.time()
print('cost time %f s' %(stop-start))
return bar
def foo1():
print('in foo1')
time.sleep(3)
def foo2():
print('in foo2')
time.sleep(3)
foo1=timer(foo1)
foo2=timer(foo2)
foo1()
foo2()
#bar函数里会调用传入原函数,然后bar的内存地址会赋值给原函数名。
#foo1=timer(foo1)这一步就相当于在函数前写@timer
2 装饰器
装饰器本质是函数,用于装饰其他函数,为其他函数添加功能。
特点是不需要修改原函数代码和调用方式。就是说,对原函数,无法感知装饰器的存在,依旧按照自己的逻辑运行。
def timer(func):
def bar():
start = time.time()
func()
stop = time.time()
print('cost time %f s' %(stop-start))
return bar
@timer
def foo1():
print('in foo1')
time.sleep(3)
@timer
def foo2():
print('in foo2')
time.sleep(3)
foo1()
foo2()
以上为原函数没有参数时可用,而原函数有多少参数是未知的,所以在装饰函数的嵌套函数bar里需要填非固定参数*args,**kwargs。
def timer(func):
def bar(*args,**kwargs):
start = time.time()
func(*args,**kwargs)
stop = time.time()
print('cost time %f s' %(stop-start))
return bar
@timer
def foo1(arg):
print('in %s' %(arg))
time.sleep(3)
@timer
def foo2(arg):
print('in %s' %(arg))
time.sleep(3)
foo1('foo1')
foo2('foo2')