-
什么是闭包?
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数,内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
-
函数闭包,和装饰器模式符合我们编程的开闭原则
-
装饰器模式常用于函数、方法或者类的扩展
-
函数闭包的形成条件:
-
闭包形成条件
- 一个就收函数作为变量的函数
- 在这个函数里有第三个函数
- 在这个第三个函数里调用传进来的函数
- 将这个新的函数作为返回值进行返回
# 函数闭包
def fun1(c):
a = 10
b = 20
print(c)
print("我是fun1")
def fun2(fun):
a = "a"
c = "c"
def fun3():
fun(c)
print("我是fun3")
print("我是fun2")
return fun3
funx = fun2(fun1) # 我是fun2 这里通过fun2让fun1可以访问到fun2的变量,并进行了功能的扩展,这样的一个函数我们就称之为闭包
"""
闭包形成条件
1.一个就收函数作为变量的函数
2.在这个函数里有第三个函数
3.在这个第三个函数里调用传进来的函数
4.将这个新的函数作为返回值进行返回
"""
print("=" * 20)
funx() # 调用这个新生成的函数
"""
c
我是fun1
我是fun3
"""
- 装饰器,是python的一个语法糖,其本质就是闭包原理
- 如下是闭包与装饰器做对比
# 函数闭包
def fun1(c):
a = 10
b = 20
print(c)
print("我是fun1")
def fun2(fun):
a = "a"
c = "c"
def fun3():
fun(c)
print("我是fun3")
print("我是fun2")
return fun3
funx = fun2(fun1) # 我是fun2 这里通过fun2让fun1可以访问到fun2的变量,并进行了功能的扩展,这样的一个函数我们就称之为闭包
"""
闭包形成条件
1.一个就收函数作为变量的函数
2.在这个函数里有第三个函数
3.在这个第三个函数里调用传进来的函数
4.将这个新的函数作为返回值进行返回
"""
print("=" * 20)
funx() # 调用这个新生成的函数
"""
c
我是fun1
我是fun3
"""
"""
装饰器的使用必须要有一个闭包
"""
print("=" * 30)
@fun2 # 这个就是装饰器 @闭包的形式挂在在函数、方法或者类上,装饰器的个数是不受限制的
def fun4(c):
print("我是fun4")
fun4()
- 装饰器在python的编程中极为常见,也使得python的扩展性变得非常强大
- 装饰器应用案例一
from time import time
from math import sqrt
def timer(fun):
def newFun():
start = time()
fun()
print("这个函数执行了%.2f秒" % (time() - start))
return newFun
# 作为演示这里写了几种不同的求10000以内质数的函数
@timer
def fun1():
# 暴力迭代法
for i in range(2, 10000):
if i == 2:
print(i)
continue
for j in range(2, i):
if i % j == 0:
break
if j == i - 1:
print(i)
@timer
def fun2():
# 最小因数法
for i in range(2, 10000):
if i == 2 or i == 3:
print(i)
continue
count = 2
while count < sqrt(i):
if i % count == 0:
break
if count + 1 > sqrt(i):
print(i)
count += 1
@timer
def fun3():
# 二分法
for i in range(2, 10000):
if i == 2 or i == 3:
print(i)
continue
count = 2
while count < i/2:
if i % count == 0:
break
if count + 1 > i/2:
print(i)
count += 1
fun1() # 这个函数执行了0.61秒
fun2() # 这个函数执行了0.05秒
fun3() # 这个函数执行了0.79秒 , 事实证明while循环跑不赢迭代