py 5.11
一、函数名的应用(第一类对象)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1.打印print函数名得到的是函数名的地址。 #2.函数名可以被赋值。func = f f()等同于func(). #3.函数名相当于变量,唯一区别:函数名可以调用函数。 #4.可以被放入容器类基础数据类型中的元素,然后实现循环调用。 #5.可以作为返回值,return 函数名(不加括号等同于返回一个变量)(加括号表示要返回调用函数时被返回的值)
二、闭包
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#二、闭包 #1.调用父级(上一层、非全局)的变量,内层函数对外层函数(上一级非全局)的变量的引用。 #2.判断是否是闭包:_closure_ : 返回cell:是闭包。 返回None:不是闭包。 #3.py解释器中,当执行到函数发现其中有闭包时,函数执行结束临时名称空间不会关闭,只有一直长时间不用时,临时名称空间才会关。目的 # 是为了爬虫时不占内存。
三、装饰器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#三、装饰器: #功能:不改变原函数的基础上,给某个函数增加一些其它的功能。 #装饰器举例:加执行时间 import time def timmer(f): #形参一定是被装饰的函数中的函数名。 def inner(*args,**kwargs): #用动态参数来接收各种各样的实参。 start_time = time.time() ret = f(*args,**kwargs) #调用函数中的*和**表示把inner聚合的再次打散,然后传给自己的形参。 end_time = time.time() print('此函数的执行时间为%d' % (end_time - start_time)) return ret #666 return inner #将inner变量返回给调用者timmer(),timmer()又将值赋给变量login.login() = inner() @timmer #相当于一步变量赋值 login = timmer(login) def login(a,b): print(a,b) return 666 #将值返回给装饰器中的调用者f() print(login(2,3)) #return返回来值以后需要print才能显示出来。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# def wrapper(f): # def inner(*args,**kwargs): # '''执行被装饰函数之前的操作''' # ret = f(*args,**kwargs) # """执行被装饰函数之后的操作""" # return ret # return inner