美文网首页
LearnPython-01

LearnPython-01

作者: EwanRenton | 来源:发表于2018-07-26 16:41 被阅读0次

    [图片上传失败...(image-c2e851-1532594474148)]


    函数式编程

    • 变量可以指向一个函数
    • 高阶函数
      • 能接收函数作为参数的函数
    #x,y为数值,f为函数
    import math
    def and(x,y,f)
        return f(x)+f(y)
    print and(25,9,math.sqrt)
    

    闭包

    def calc_sum(lst):
        def lazy_sum():
            return sum(lst)
        return lazy_sum
    

    发现没法把 lazy_sum 移到 calc_sum 的外部,因为它引用了 calc_sum 的参数 lst。

    像这种内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包(Closure)。

    闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。举例如下:

    # 希望一次返回3个函数,分别计算1x1,2x2,3x3:
    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    

    你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果全部都是 9(请自己动手验证)。

    原因就是当count()函数返回了3个函数时,这3个函数所引用的变量 i 的值已经变成了3。由于f1、f2、f3并没有被调用,所以,此时他们并未计算 i*i,当 f1 被调用时:

    >>> f1()
    9     # 因为f1现在才计算i*i,但现在i的值已经变为3
    

    因此,返回函数不要引用任何循环变量,或者后续会发生变化的变量。


    相关文章

      网友评论

          本文标题:LearnPython-01

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