python——闭包,装饰器【装饰者模式】

10.装饰器

  • 什么是闭包?

    闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数,内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

  • 函数闭包,和装饰器模式符合我们编程的开闭原则

  • 装饰器模式常用于函数、方法或者类的扩展

  • 函数闭包的形成条件:

  • 闭包形成条件

    1. 一个就收函数作为变量的函数
    2. 在这个函数里有第三个函数
    3. 在这个第三个函数里调用传进来的函数
    4. 将这个新的函数作为返回值进行返回
# 函数闭包

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循环跑不赢迭代
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pointer-faker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值