Python学习笔记(九):

  1. 装饰器(函数)
  2. 内置函数

1. 装饰器

1. 作用域

2. 高阶函数

3. 闭包

  • 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).
def outer():
x = 10
def inner(): # 条件一:inner是内部函数
print(x) # 条件二:外部环境的一个变量
return inner() # 结论:内部函数inner就是一个闭包
# 两种调用inner的方法
outer()()
f = outer()
f()
# 闭包=内部函数+定义函数时的环境

4. 装饰器

代码示例:

import time

def show_time(f):			# 装饰器函数
def inner(): # 通过闭包实现的装饰器
start = time.time()
f()
end = time.time()
print(start - end)
return inner @show_time
def foo(): # 功能函数
print("foo...")
time.sleep(2) foo()

图示:

Python学习笔记(九)-LMLPHP

扩展:

  1. 功能函数加参数

代码示例:

def show_time(f):		# 装饰器函数
def inner(*args): # 通过闭包实现装饰
start = time.time()
f(*args)
end = time.time()
print("spend %s"%(end - start))
return inner @show_time
def add(*args): # 功能函数
sums = 0
for i in args:
sums += i
print(sums)
time.sleep(1) add(1,2,3,4,5)
  1. 装饰器函数加参数

代码示例:

def logger(flag=''):		# 给装饰器函数再嵌套一层函数并传参
def show_time(f): # 装饰器函数
def inner(*args): # 通过闭包实现装饰效果
start = time.time()
f(*args)
end = time.time()
print("spend %s"%(end - start))
if flag == 'true': # 通过闭包传入装饰器的参数
print("日志")
return inner
return show_time @logger('true') # = @show_time
def add(*args):
sums = 0
for i in args:
sums += i
print(sums)
time.sleep(1) add(1,2,3,4,5) @logger()
def bar():
print("bar...")
time.sleep(2)
05-06 16:28