高阶函数
原则
函数接收的参数是一个函数
函数的返回值是一个函数
示例
示例1:接收值是一个函数
def A():
print("I am A")
return
def B(x):
print("I am B")
return
B(A())
I am A
I am B
示例2:返回值是一个函数
def A():
print("I am A")
return
def B():
return A()
B()
I am A
示例3:给函数增加功能
import time
def time_con(a):
start_time = time.time()
a()
stop_time = time.time()
print("这个函数运行的时间是%s" % (stop_time - start_time))
def test():
time.sleep(3)
print("I am test!!!")
time_con(test)
I am test!!!
这个函数运行的时间是3.000800848007202
函数嵌套
将某函数作为另一函数的参数使用,这一函数就是嵌套函数
示例
def a():
print("函数第一层")
def b():
print("函数第二层")
def c():
print("函数第三层")
c()
b()
a()
函数第一层
函数第二层
函数第三层
闭包
闭包是由函数和与其相关的引用环境组合而成的实体
闭包有助于提高代码可复用性的作用
闭包,即一个完整的闭合函数
def test(x): #自定义函数
a = "您输出的是:" #函数中封装的变量
print(a,x) #函数体
return x #返回值
test("测试字符") #运行函数
您输出的是: 测试字符 #运行结果
函数变量作用域
- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内建作用域
原则
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。
示例
实例1
name = '小明' #定义变量
def foo(): #定义函数
name = '小花' #定义函数中内容
def bar(): #定义函数中子变量
name = '小黄' #定义函数自变量内容
print(name) #打印函数变量内容
return bar() #返回定义的函数内容
foo() #运行函数
小黄
实例2
name = '第一层'
def foo():
name = '第二层'
def bar():
name = '第三层'
def tt():
print(name)
return tt
return bar
foo()()()
第三层
装饰器
装饰器本质就是函数,功能是为其它函数附加功能
装饰器 = 高阶函数 + 函数嵌套 + 闭包
原则
- 不修改被修饰函数的源代码
- 不修改被修饰函数的调用方式
###演示
def 装饰器(a):
def 装饰器内容(*args,**kwargs):
print("装饰器附加内容1")
原函数执行 = a(*args,**kwargs)
print("装饰器附加内容2")
return 原函数执行
return 装饰器内容
@装饰器
def test(参数):
print('这是原有函数内容和%s!!!' %参数)
return ("原函数返回值")
print(test("测试参数"))
示例
原函数
def test():
time.sleep(3)
print('This is test!!!')
This is test!!!
用time模块建立装饰器后
import time #调用time模块儿
def time_func(a): #定义变量用于接收函数参数
def time_con(*args,**kwargs): #定义装饰器用于变更函数输出
start_time = time.time() #记录运行开始时间
res = a(*args,**kwargs) #被调用的函数赋值
stop_time = time.time() #记录函数运行结束时间
print("这个函数运行的时间是%s" %(stop_time - start_time)) #计算并打印记录时间
return res #运行函数返回值
return time_con #返回装饰器运行后值
@time_func #语法糖,相当于 test = time_func(test)
def test(a,b): #用于测试的自定义函数
time.sleep(3) #延迟执行3秒(用于测试)
print("这是个测试函数,第一个参数是%s第二个参数是%s" %(a,b)) #打印测试语句
return ('【函数运行完毕】') #函数返回值
print(test("【参数1】","【参数二】")) #执行装饰后的函数