Python 学习笔记-9

Python学习笔记-9:

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

1. 装饰器

1. 作用域

2. 高阶函数

3. 闭包

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

4. 装饰器

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()

图示:
图示

扩展:

  1. 功能函数加参数

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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. 装饰器函数加参数

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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)