美文网首页机器学习与数据挖掘
Python进阶|函数的闭包

Python进阶|函数的闭包

作者: 罗罗攀 | 来源:发表于2019-10-14 19:48 被阅读0次
    前言

    函数的闭包其实和函数的嵌套很相似,大家对于函数的嵌套应该是很熟悉的,那么先写一个简单的函数嵌套案例:

    def sum():
        a = 1
        def add(b):
            all = a + b
            print(all)
        add(2)
    
    sum()
    # 3
    

    当然这样去写两个数之和的函数,没有必要,而且还增加了代码量。

    闭包

    和嵌套不同,闭包的外部函数返回是一个函数,而不是一个具体的值,我们将上面的代码改为闭包。

    def sum(a):
        def add(b):
            all = a + b
            print(all)
        return add
    

    这里外部函数返回的是add函数名,那我们怎么去调用闭包了?

    我们先调用sum函数,用type方法看看调用结果的类型:

    def sum(a):
        def add(b):
            all = a + b
            print(all)
        return add
    
    print(type(sum(1)))
    # <class 'function'>
    

    从结果可以看出,结果是一个函数类,我们需要在此基础上再进行传参,才能完成整个闭包功能。

    def sum(a):
        def add(b):
            all = a + b
            print(all)
        return add
    
    sum(1)(2)
    # 3
    
    求一个数的n次幂

    上面的求和功能中,可能使用闭包的作用不大,而且还不如定义一个函数那么来的实在。

    我们接下来计算下一个数的n次幂,用闭包写如下:

    def nth(exponent):
        def exponent_of(base):
            return base ** exponent
        return exponent_of
    
    square = nth(2)
    cube = nth(3)
    print(square(5))
    print(cube(5))
    
    # 25 5^2
    # 125 5^3
    

    当然,我们也可以通过一个函数来写这个功能:

    def nth_rewrite(base,exponent):
        return base ** exponent
    

    但是,使用闭包,可以让程序变得更加简洁易懂,我们想想,如果需要计算多个数的平方,就可以看出这两种方法调用的不同了。

    # 不用闭包
    res1 = nth_rewrite(base1,2)
    res2 = nth_rewrite(base2,2)
    res3 = nth_rewrite(base1,3)
    
    # 闭包
    square = nth(2)
    res1 = square(base1)
    res2 = square(base2)
    res3 = square(base3)
    

    显然,闭包的使用更加简洁,每次调用都少输入一个参数。

    总结
    • 闭包的定义和调用
    • 理解闭包的作用

    相关文章

      网友评论

        本文标题:Python进阶|函数的闭包

        本文链接:https://www.haomeiwen.com/subject/blbkpctx.html