目录
1.闭包:
1.闭包: 嵌套函数 闭包(closure)是一个函数以及其捆绑的周边环境状态( lexical environment , 词法环境 )的引用的组合, 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量, 所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 (内层函数引用外层函数的的变量(捆绑环境),内层函数作为返回值返回给外层函数)
例:嵌套函数
data = "global" def outer(): data = "outer" print(data) def inter(): data = "inter" print(data) return inter inter = outer() # outer 只会执行打印outer并且返回inter inter() # inter 若没有inter = outer()则无法调用inter print(data) # global 此时data对应的global为全局变量
定义一个嵌套函数求平均值
def outer_avg(): sum_list = [] def avg(num): sum_list.append(num) print(sum(sum_list) / len(sum_list)) return avg avg = outer_avg() avg(10) # 10.0 avg(11) # 10.5 avg(12) # 11.0
2.装饰器:
语法糖:@装饰器 装饰器功能:在不改变原函数的情况下,增强原函数的功能 如何去定义一个装饰器 1.装饰器是一个闭包(嵌套函数) 2.既然是一个嵌套函数,那么他会有:外层函数,内层函数。而且内层函数引用外层函数的变量(原函数) 3.将原函数作为参数传递给外层函数, 内层函数引用外层函数传递的原函数参数 4.外层函数的返回值是内层函数
在不改变函数的情况下增强print的功能
# 不使用装饰器
def print_hello(): print("Hello") def decorator(func): def inner(): print("start") func() print("end") return inner inner = decorator(print_hello) inner() ''' start Hello end '''
# 使用装饰器
def decorator(func): def inner(): print("start") func() print("end") return inner @decorator def print_hello(): print("Hello") print_hello() ''' start Hello end '''
能传参的装饰器:
def decorator(func):
def inner(arg1, arg2):
print("start")
func(arg1, arg2)
print("end")
return inner
@decorator
def print_hello(arg1, arg2):
print(arg1, arg2)
print_hello(1, 2)
给装饰器传参
使用装饰器
def decorator(arg): def outer(func): def inner(arg1, arg2): print(arg, "start") func(arg1, arg2) print(arg, "stop") return inner return outer @decorator("debug") def print_arg(arg1, arg2): print(arg1, arg2) print_arg(1, 2)
不使用装饰器
def decorator(arg): def outer(func): def inner(arg1, arg2): print(arg, "start") func(arg1, arg2) print(arg, "stop") return inner return outer def print_arg(arg1, arg2): print(arg1, arg2) outer = decorator("debug") inner = outer(print_arg) inner(1, 2)
# 计算睡眠时间
import time
before_time = time.time()
time.sleep(5)
print("after sleep")
after_time = time.time()
run_time = before_time - after_time
print(run_time)
程序睡眠/秒 import time time.sleep(秒数) print("after sleep")
import time
time.sleep(5)
print("after sleep")