《Spark数据分析:基于Python语言 》 —1.3 Python函数式编程
1.3 Python函数式编程
Python是一门非常有用的语言,涵盖了从自动化到网络服务再到机器学习的方方面面应用。如今Python已经上升为最广为使用的编程语言之一。
作为一种多范式编程语言,Python结合了命令式编程和面向过程的编程范式,也对面向对象和函数式编程范式提供了完整支持。
接下来将介绍Python里的函数式编程的概念和要素,这些内容对于使用Spark的Python编程接口(PySpark)是不可或缺的,也是本书主要内容Spark编程的基础。具体内容包括匿名函数、常见的高阶函数以及不可变和可迭代的数据结构等。
1.3.1 Python函数式编程中的数据结构
Spark里的Python RDD表示的就是Python对象的分布式集合,因此理解Python中各种可用的数据结构尤为重要。
1.列表
Python中的列表(list)是值可变的序列,第一个元素下标为0。可以删除或替换列表中的元素,也可以在列表末尾添加元素。程序清单1.2是Python中列表的一个简单示例。
程序清单1.2 列表
如程序清单1.2所示,可以访问列表中的每个元素,将元素的序号放在方括号内即可。
重点来了,列表支持函数式编程的三个重要的函数map()、reduce()和filter(),还支持其他一些内建函数,比如count()和sort()等。在本书中,我们会花相当一部分时间和Spark RDD打交道,它本质上就是Python列表的一种表示。程序清单1.3提供了使用Python列表的map()函数的一个基本示例,操作一个输入列表,返回一个新列表。稍后会进一步介绍这个函数。这个示例是用纯Python编写的。PySpark里面等价的操作的语法略有不同。
程序清单1.3 Python中的map()函数
尽管在Python里,列表默认是值可变的,然而在Spark里面,Python RDD所包含的列表对象是值不可变的,这一点和Spark RDD里面的其他对象都是一样的。
集合是Python中一种类似于列表的对象类型,只不过集合是基于数学里的集合概念的抽象。集合是无序且无重复的数据集,支持数学中常见的集合操作,比如union()和intersection()等。
2.元组
元组(tuple)是由对象组成的一个不可变的序列,尽管元组包含的对象本身可以是不可变的,也可以是可变的。元组可以包含不同类型的对象,比如混合字符串、整型和浮点型对象,也可以包含其他的序列类型,比如集合或者另一个元组。
为了便于理解,不妨把元组看作近似于不可变列表。不过,元组和列表其实是完全不同的底层结构,使用场景也不一样。
元组和关系型数据库里数据表的记录类似,每条记录都有结构,而这个结构里每个序号的位置对应的字段都有固定的含义。而列表对象内部的顺序则很单纯,因为列表的值是可变的,列表内部的顺序和列表结构没有直接的关系。
元组是把至少一个以逗号分隔的值用圆括号包起来。访问Python元组中的元素和访问列表中的元素是相似的:在方括号内通过具体元素对应的从零开始数的下标来访问。
元组对象提供了和别的元组对象进行比较的方法,还有返回元组长度(元组中元素的个数)的方法。在Python中,你可以使用tuple(list)函数把列表转为元组。
程序清单1.4展示了原生Python中元组的创建和使用。
程序清单1.4 元组
如程序清单1.4所示,分清楚方括号和圆括号很重要,因为它们代表着截然不同的数据结构。
元组是Spark中不可或缺的对象,它们通常用于表示键值对,而键值对是Spark编程中数据的基本单位。
3.字典
Python里的字典(Dictionary或者dict)是由键值对组成的无序集合。字典对象通过花括号({})表示,比如如果要创建一个空的字典,只需执行my_empty_dict = {}这样的一条命令。与列表和元组不同的是,列表和元组内的元素可以通过它在原始顺序中的位置(下标)进行访问,而字典中的元素要通过键进行访问。键和对应值之间用冒号(:)分隔,而字典里的不同的键值对之间用逗号进行分隔。
字典的用处在于,字典中的元素都是自描述的,无需依赖预先定义的结构或者顺序。字典对象通过键进行访问,如程序清单1.5所示。这个清单还展示了如何对字典添加或者删除元素,还有其他一些字典方法,包括keys()、values()、cmp()和len()。
程序清单1.5 字典
字典可以在Python RDD中作为不可变对象使用。
- 点赞
- 收藏
- 关注作者
评论(0)