《Spark数据分析:基于Python语言 》 —1.3.3 Python函数式编程基础

举报
华章计算机 发表于 2020/02/12 17:43:45 2020/02/12
【摘要】 本节书摘来自华章计算机《Spark数据分析:基于Python语言 》 一书中第1章,第1.3.3节,作者是[澳] 杰夫瑞·艾文(Jeffrey Aven) ,王道远 译。

1.3.3 Python函数式编程基础

Python的函数式编程包括函数式编程范式中你所期待的全部特性,如下所列:

函数是一等公民,是编程的基本单元。

函数都是给定一个输入就有一个输出,且输出仅取决于输入的纯函数(不允许使用会产生副作用的语句)。

支持高阶函数。

支持匿名函数。

接下来的几个小节会介绍一些函数式编程概念及其在Python中的实现方式。

1.匿名函数与lambda语法

匿名函数(anonymous function)是Lisp、Scala、JavaScript、Erlang、Clojure、Go等函数式编程语言都有的特性。

Python中的匿名函数使用lambda结构定义,而不是使用具名函数的def关键字。匿名函数接受任意数目的输入参数,但是只返回一个值。这个返回值可以是另一个函数,一个标量值,也可以是列表等数据结构。

程序清单1.8展示了两个相似的函数,一个是具名函数,另一个则是匿名函数。

程序清单1.8 Python中的具名函数与匿名函数

 image.png

如程序清单1.8所示,具名函数plusone保留了对函数名的引用,而匿名函数plusonefn所引用的函数名是<lambda>。

具名函数可以包含print这样的语句,而匿名函数只能包含单条或者复合的表达式,这个表达式也可以调用作用域内的另一个具名函数。具名函数中也可以使用return语句,而匿名函数不支持。

当你了解到map()、reduce()和filter()等高阶函数,并且开始把单用途的函数串在一起形成处理流水线时,匿名函数就有真正的用武之地了,你会在使用Spark时经常用到它。

2.高阶函数

高阶函数接收函数作为参数,并且可以返回函数作为结果。map()、reduce()和filter()都是高阶函数。这些函数接受函数作为参数。

程序清单1.9中的flatMap()、filter()、map()和reduceByKey()等函数都是高阶函数的例子,因为它们预期接受匿名函数作为输入。

程序清单1.9 Spark中高阶函数的例子

 image.png

以函数作为返回值的函数也被称为高阶函数。异步编程中的回调函数正是使用这种特性定义的。

不要紧张……我们会在第4章详细介绍这些函数。目前暂时只需要理解高阶函数的概念就行了。

3.闭包

闭包(closure)是包含初始化时的环境的函数对象。这个环境可以包括函数创建时的任何外部变量或者用到的函数。闭包通过附带环境,“记住”了这些变量或者函数的值。

程序清单1.10是Python中闭包的一个简单的例子。

程序清单1.10 Python中的闭包

 image.png

 image.png

在程序清单1.10中,函数ret_message()是闭包,而形参concept的值包括在了该函数内。你可以使用__closure__函数的成员来查看闭包的相关信息。这个函数中包含的引用存储在一个由cell类型组成的元组中。你可以使用cell_contents函数访问cell的内容,如本程序清单所示。为了验证闭包的概念,你可以删除外层的函数generate_message,然后发现引用了它的函数call_func仍然可以使用。

掌握闭包的概念很重要,因为闭包在分布式的Spark应用程序中可以提供很大的帮助。不过,所用函数的构建和调用方式也会导致闭包拖累应用表现。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。