函数有三种形式
1.定义形式
2.对象形式(函数变量)
3.调用形式
def outer():
str1 = "我是outer函数str1"
print(str1)
def inner():
str1 = "我是inner函数str1"
print(str1)
return inner
f=outer()
f()
#结果:
#我是outer函数str1
#我是inner函数str1
函数嵌套
函数的嵌套即在函数内部定义其他的函数。
def outer():
str1 = "我是outer函数str1"
print(str1)
def inner():#此处定义的函数即为函数嵌套
str1 = "我是inner函数str1"
print(str1)
return inner
闭包
闭包:内部函数对其外部函数环境的引用。
条件一:函数要嵌套即存在内部函数和外部函数
条件二:内部函数使用其外函数的环境(即使用外部函数的变量)
条件三:内部函数在外部函数的外部使用。
对于C语言来说若外部函数结束则其内部的一切都结束并被释放,闭包即是python特有的区别去C语言的特性,若外部函数outer返回内部函数inner,且内部函数inner使用了外部函数outer的变量,则该内部函数inner和外部函数的变量str1并不会被释放而是依旧在inner中可以被使用。
装饰器
前提:装饰器是在闭包的基础上建立的。
1.装饰器本质上是一个python函数(一个返回函数的函数),它可让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象(闭包即如此)。
2.装饰器经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。即为已经存在的函数或对象添加额外的功能。
3.装饰器:一个闭包,把一个函数当做参数返回一个替代的函数。
装饰器函数步骤:
1.写外部函数,传入被修饰函数(即已有的函数或功能)
2.返回修饰后的内部函数
3.添加修饰动作(实现增加的功能),以及对被装饰函数的处理
整体可以这样理解:其实就是把被修饰函数穿了衣服变成了此处的内部函数inner
#举例:为已有函数增加打印日志时函数名输出功能
#已有函数
def hello():
print ("hello world!")
#第一步:传入被修饰函数
def outer(func):#func将为被修饰函数hello
def inner():
return func()#内部函数返回的是执行hello函数
pass
#第二步:返回内部修饰后的内部函数
def outer(func):#func将为被修饰函数
def inner():
return func()#内部函数返回的是执行hello函数
return inner
#第三步
def outer(func):#func将为被修饰函数
def inner():
print("[DEBUG]: enter {}()".format(func.__name__))
return func()#内部函数返回的是执行hello函数
return inner
#闭包
hello=outer(hello)
hello()
#装饰器
@outer
def hello():
print ("hello world!")
hello()
扫描二维码关注公众号,回复:
11208772 查看本文章