LearnPython-01

[图片上传失败...(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

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


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,509评论 0 6
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,698评论 0 13
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 10,907评论 6 53
  • 血 压 由于高血压是引起心、脑、肾、血管疾病的重要危险因素,因而严重地威胁着人类的生命健康。我们讲,心脏就像一个泵...
    保健养生阅读 2,860评论 0 5
  • 程瑞林 著 《红石河畔的少年》目录 ——瑞麟2008-2-16 15:52风吹柳,流水起波纹;白鹭飞,蓝天飘白云。...
    云中瑞麟阅读 1,313评论 0 0