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')