《Spark数据分析:基于Python语言 》 —1.3.3 Python函数式编程基础
1.3.3 Python函数式编程基础
Python的函数式编程包括函数式编程范式中你所期待的全部特性,如下所列:
函数是一等公民,是编程的基本单元。
函数都是给定一个输入就有一个输出,且输出仅取决于输入的纯函数(不允许使用会产生副作用的语句)。
支持高阶函数。
支持匿名函数。
接下来的几个小节会介绍一些函数式编程概念及其在Python中的实现方式。
1.匿名函数与lambda语法
匿名函数(anonymous function)是Lisp、Scala、JavaScript、Erlang、Clojure、Go等函数式编程语言都有的特性。
Python中的匿名函数使用lambda结构定义,而不是使用具名函数的def关键字。匿名函数接受任意数目的输入参数,但是只返回一个值。这个返回值可以是另一个函数,一个标量值,也可以是列表等数据结构。
程序清单1.8展示了两个相似的函数,一个是具名函数,另一个则是匿名函数。
程序清单1.8 Python中的具名函数与匿名函数
如程序清单1.8所示,具名函数plusone保留了对函数名的引用,而匿名函数plusonefn所引用的函数名是<lambda>。
具名函数可以包含print这样的语句,而匿名函数只能包含单条或者复合的表达式,这个表达式也可以调用作用域内的另一个具名函数。具名函数中也可以使用return语句,而匿名函数不支持。
当你了解到map()、reduce()和filter()等高阶函数,并且开始把单用途的函数串在一起形成处理流水线时,匿名函数就有真正的用武之地了,你会在使用Spark时经常用到它。
2.高阶函数
高阶函数接收函数作为参数,并且可以返回函数作为结果。map()、reduce()和filter()都是高阶函数。这些函数接受函数作为参数。
程序清单1.9中的flatMap()、filter()、map()和reduceByKey()等函数都是高阶函数的例子,因为它们预期接受匿名函数作为输入。
程序清单1.9 Spark中高阶函数的例子
以函数作为返回值的函数也被称为高阶函数。异步编程中的回调函数正是使用这种特性定义的。
不要紧张……我们会在第4章详细介绍这些函数。目前暂时只需要理解高阶函数的概念就行了。
3.闭包
闭包(closure)是包含初始化时的环境的函数对象。这个环境可以包括函数创建时的任何外部变量或者用到的函数。闭包通过附带环境,“记住”了这些变量或者函数的值。
程序清单1.10是Python中闭包的一个简单的例子。
程序清单1.10 Python中的闭包
在程序清单1.10中,函数ret_message()是闭包,而形参concept的值包括在了该函数内。你可以使用__closure__函数的成员来查看闭包的相关信息。这个函数中包含的引用存储在一个由cell类型组成的元组中。你可以使用cell_contents函数访问cell的内容,如本程序清单所示。为了验证闭包的概念,你可以删除外层的函数generate_message,然后发现引用了它的函数call_func仍然可以使用。
掌握闭包的概念很重要,因为闭包在分布式的Spark应用程序中可以提供很大的帮助。不过,所用函数的构建和调用方式也会导致闭包拖累应用表现。
- 点赞
- 收藏
- 关注作者
评论(0)