函数名:函数名可以理解为一个特殊的变量。
直接打印函数名,得到的是函数的内存地址。
def f1(): print(1211) print(f1)
函数名可以定义为一个函数的参数。
a = 1 def f1(x): print(x) f1(a)
def f1():
print(555)
def f2(x):
x()
f2(f1)
函数名可以作为容器类型的元素。
def f1(): print(1211) def f2(): print(1222) def f3(): print(1233) def f4(): print(1233) li = [f1,f2,f3,f4,] for i in li: i()
函数能作为字典的值。
函数名还可以作为函数的返回值
def f11(x): return x a = f11(5) print(a)
def f1():
print(666)
def f2(x):
return x
a = f2(f1)
a()
def wraaper():
def inner():
print(666)
return inner
ret = wraaper()
ret()
什么是闭包?
闭包,就是内层函数对外层函数(非全局)变量的引用。
内存函数对外层函数非全局变量的引用就叫闭包。
判断是不是闭包 用内层函数名.__closure__ 返回None
当执行一个函数时候,如果解释器判断此函数内部内部闭包存在,这样
python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。(用于爬虫)
def wraaper1(): name = '老男孩' def inner(): print(name) inner() print(wraaper1().__closure__) wraaper1()
输出结果:
老男孩
(<cell at 0x00000050ABD24D38: str object at 0x00000050ABDC6BC0>,)
name = '老男孩'
def wraaper2():
name1 = 'alex'
def inner():
print(name)
print(name1)
inner()
print(inner.__closure__)
wraaper2()
简单版本装饰器
改变了我原来执行函数的方式,不好。
import time def login(): time.sleep(1) print('嘻嘻更健康') def timmer(): start_time = time.time() login() end_time = time.time() print('此函数的执行时间是%s' % (end_time - start_time)) timmer()
虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码,改吧。!!!!
def login(): time.sleep(1) print('嘻嘻更健康') login() def register(): time.sleep(0.3) print('嘻嘻') register() def timmer(d): start_time = time.time() d() end_time = time.time() print('此函数的执行时间%s' % (end_time - start_time)) timmer(login) timmer(register)
def login(): time.sleep(0.3) print('洗洗更健康') login() def timmer(d): start_time = time.time() d() end_time = time.time() print('此函数执行了%s' % (end_time - start_time)) f1 = login #将login函数给了f1 login = timmer #将timmer函数给了login login(f1) # timmer(login)
初级装饰器
def timmer(f): def inner(): start_time = time.time() f() end_time = time.time() print('此函数的执行时间%s' % (end_time - start_time)) return inner @timmer def login(): time.sleep(0.3) print('嘻嘻更显康') login()
被装饰的函数带参数的装饰器
def timmer(f): def inner(): start_time = time.time() f() end_time = time.time() print('此函数的执行时间%s' % (end_time - start_time)) return inner @timmer def login(): time.sleep(0.3) print('嘻嘻更显康') login()
函数带返回值的装饰器(万能装饰器)
def timmer(f): def inner(*args,**kwargs): start_time = time.time() ret = f(*args,**kwargs) end_time = time.time() print('此函数执行时间为%s' % (start_time - end_time)) return inner @timmer def login(a,b): print(a,b) time.sleep(0.3) print('洗洗更健康') return 666 print(login(2,3))
装饰器
def wrapper(f): def inner(*args,**kwargs): '''执行被装饰函数之前的操作''' ret = f(*args,**kwargs) """执行被装饰函数之后的操作""" return ret return inner