# 作用域
# 高阶函数
# 闭包
# 闭包(closure)是函数式编程的重要的语法结构。
# 定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
# 闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境,当然这个环境可以有很多,不止一个简单的x。
# def outer():
# x = 1
#
# def inner():
# b = 6
# print(x)
#
# return inner
#
#
# # inner()#报错原因:找不到这个引用变量
# in_func = outer() # 这里其实就是一个变量赋值,将inner的引用对象赋值给in_func,类似于a=5,b=a一样
# # 有同学会想直接赋值不行吗:in_func=inner? 哥,inner不还是找不到吗,对吧
# in_func()
# 装饰器(函数)decrator
# 必须遵守开放封闭原则
#*******************************************
import time
def show_time(func): #装饰器函数
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print('spend %s' % (end_time - start_time))
return wrapper
def foo():
print('hello foo')
time.sleep(3)
foo = show_time(foo)
foo()
#******************************************
import time
def show_time(func): #装饰器函数
def wrapper():
start_time = time.time()
func()
end_time = time.time()
print('spend %s' % (end_time - start_time))
return wrapper
@show_time # foo=show_time(foo)
def foo():
print('hello foo')
time.sleep(3)
@show_time # bar=show_time(bar)
def bar():
print('in the bar')
time.sleep(2)
foo()
print('***********')
bar()
#**************************************
#带参数的装饰器函数
import time
def show_time(func):
def wrapper(a, b):
start_time = time.time()
func(a, b)
end_time = time.time()
print('spend %s' % (end_time - start_time))
return wrapper
@show_time # add=show_time(add)
def add(a, b):
time.sleep(1)
print(a + b)
add(2, 4)
#********************************************
#不定长参数
#***********************************不定长参数
import time
def show_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
end_time = time.time()
print('spend %s'% (end_time-start_time))
return wrapper
@show_time #add=show_time(add)
def add(*args, **kwargs):
time.sleep(1)
sum=0
for i in args:
sum += i
print(sum)
add(2,4,8,9)
#*********************************************
#装饰器参数
import time
def time_logger(flag=0):
def show_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
end_time = time.time()
print('spend %s' % (end_time - start_time))
if flag:
print('将这个操作的时间记录到日志中')
return wrapper
return show_time
@time_logger(3)
def add(*args, **kwargs):
time.sleep(1)
sum = 0
for i in args:
sum += i
print(sum)
add(2, 7, 5)
#
# @time_logger(3) 做了两件事:
# (1)time_logger(3):得到闭包函数show_time,里面保存环境变量flag
# (2)@show_time :add=show_time(add)
#