python 11
# 一、闭包 # # 判断:函数名.__closure__ # 若返回cell,则是闭包,返回None则不是闭包。 # # 闭包:内层函数对外层函数非全局变量的引用就叫闭包。 def func1(x): def func2(): print(x) func2() print(func2.__closure__) return x name = '小明' func1(name) # 以上这个函数,其实在执行func1(x)的时候,创建了一个x = '小明'的变量,所以,判断为闭包。 # 用处:当执行一个函数时,如果解释器判断此函数内部存在闭包,这样python就触发一个机制,闭 # 包的所在的临时名称空间不会随着函数的执行完毕而消失。(爬虫可以抓一次数据多次读取。)
# 二、装饰器 import time def timmer(f): def inner(): str_time = time.time() f() end_time = time.time() print('此函数执行时间为:%s' % (end_time - str_time)) return inner def login(): time.sleep(3) print('洗洗更健康...') login = timmer(login) # 在函数上一行加入 @装饰器函数名 ,等同于执行了 函数名 = 装饰器函数名(函数名) import time def timmer(f): def inner(): str_time = time.time() f() end_time = time.time() print('此函数执行时间为:%s' % (end_time - str_time)) return inner @timmer def login(): time.sleep(3) print('洗洗更健康...')
# 在优化一下,让装饰器可以接受多个值,并且返回该函数的返回值。 import time def timmer(f): def inner(*args, **kwargs): str_time = time.time() ret = f(*args, **kwargs) end_time = time.time() print('此函数执行时间为:%s' % (end_time - str_time)) return ret return inner @timmer def login(a, b): time.sleep(3) print('洗洗更健康...%s, %s' % (a, b)) return 666