美文网首页
(十一)函数<3>闭包

(十一)函数<3>闭包

作者: 费云帆 | 来源:发表于2019-01-04 11:01 被阅读0次

    抛砖引玉---"闭包"

    # 函数引用外部变量是没有任何问题的
    a=3
    def foo():
        print('a={}'.format(a))
    foo()
    >>>
    a=3
    # 函数内部定义的变量,用在外部,就报错啦...
    def foo():
        a=1
        return a
    print(a)
    >>>
    Traceback (most recent call last):
      File "C:\Users\wcw\Desktop\Testing.py", line 10, in <module>
        print(a)
    NameError: name 'a' is not defined
    

    用内嵌函数修改下:

    def foo():
        a=3
        def bar():
            return a
        return bar
    
    f=foo()
    print(f())
    >>>
    3
    # 之前的例子再修改下
    def foo():
        a=1
        def bar():
            return a
        return bar
    print(foo()())
    """
    bar()就是我们所定义的闭包,具有两个特点:
    <1>是嵌套函数
    <2>引用外部函数的自由变量(实例中,a就是自由变量,和bar()互相独立)
    
    通过闭包,我们得以在外部访问函数内部的变量
    """
    
    • 抛物线实例
    def parabola(a,b,c):
        def para(x):
            return a*x**2+b*x+c
        return para
    # p实际上是parabola()的一个实例对象
    p=parabola(2,3,4)
    # 使用p(5)是否更为简洁,5即为x的值
    print(p(5))
    

    装饰器的本质,实际上也是闭包的一种应用.
    目前个人的理解,闭包和装饰器还是有明显区别的...


    review---"递归":函数不断调用自身的行为

    def fib(n):
        if n==0:
            return 0
        elif n==1:
            return 1
        else:
            # 这里就是递归
            return fib(n-1)+fib(n-2)
    if __name__=='__main__':
        f=fib(10)
        print(f)
    >>>
    55
    

    相关文章

      网友评论

          本文标题:(十一)函数<3>闭包

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