我们大多数人都是作为一种面向对象的语言介绍给Python的,但是Python函数对于数据科学家和程序员也是有用的工具。虽然类和对象很容易开始使用,但是还有其他方式可以编写Python代码。诸如Java之类的语言很难摆脱面向对象的思考,但是Python使其变得容易。
鉴于Python促进了不同的代码编写方法,一个逻辑上的后续问题是:什么是不同的代码编写方式?尽管对该问题有多个答案,但是最常见的替代代码编写方式称为函数式编程。函数式编程的名称源于编写函数,函数提供了程序中逻辑的主要来源。
在大数据分析Python函数和函数式编程中,我们将:
1)通过与面向对象编程进行比较来解释功能编程的基础。
2)阐述为什么您可能希望将函数式编程合并到自己的代码中。
3)向您展示Python如何允许您在两者之间进行切换。
比较面向对象和功能
引入函数式编程的最简单方法是将其与我们已经意识到的东西进行比较:面向对象的编程。假设我们要创建一个行计数器类,该类接收一个文件,读取每一行,然后计算文件中的行总数。使用class,看起来可能类似于以下内容:
虽然不是最佳实现,但它确实提供了对面向对象设计的了解。在该类中,有一些熟悉的方法和属性的概念。这些属性设置并检索对象的状态,然后这些方法操纵该状态。
为了使这两个概念同时起作用,对象的状态必须随时间变化。lines调用read()方法后,状态的这种改变在属性中显而易见。例如,这是我们使用此类的方a:
一个对象的不断变化的状态既是它的祝福也是诅咒。为了理解为什么将变化的状态视为负面状态,我们必须引入另一种选择。另一种方法是将线路计数器构建为一系列独立的功能。
使用纯函数
在前面的示例中,我们只能使用函数来计算行数。当我们仅使用函数时,我们将一种函数式方法应用于编程,这很自然地称为函数式编程。函数式编程背后的概念要求函数是无状态的,并且仅依赖于其给定的输入来产生输出。
满足以上条件的函数称为纯函数。这是一个突出纯函数与非纯函数之间区别的示例:
使用纯函数优于不纯函数(非纯函数)的好处是减少了副作用。如果在函数的操作范围内执行了超出其范围的更改,则会发生副作用。例如,当我们更改对象的状态,执行任何I / O操作甚至调用时,它们就会发生print():
程序员减少了代码中的副作用,使其更易于跟踪,测试和调试。代码库的副作用越多,遍历程序并理解其执行顺序就越困难。
尝试消除所有副作用是很方便的,但通常使用它们来简化编程。如果我们要禁止所有副作用,那么您将无法读取文件,调用print甚至无法在函数中分配变量。函数式编程的倡导者理解这种折衷,并在不牺牲开发实现时间的情况下,尝试消除副作用。
Lambda表达
代替def函数声明的语法,我们可以使用lambda表达式编写Python函数。lambda语法紧随其后def,但不是1对1映射。这是构建一个将两个整数相加的函数的示例:
该lambda表达式采用逗号分隔的输入序列(例如def)。然后,紧接在冒号之后,它不使用显式的return语句而返回表达式。最后,在将lambda表达式分配给变量时,它的行为完全类似于Python函数,并且可以使用函数调用语法进行调用new_add()。
如果我们未分配lambda变量名,则将其称为匿名函数。这些匿名函数非常有用,尤其是在将它们用作另一个函数的输入时。例如,该sorted() 函数接受一个可选key参数(一个函数),该参数描述应如何对列表中的项目进行排序。
地图功能
尽管将函数作为参数传递的能力并不是Python独有的,但这是编程语言的最新发展。允许这种行为的函数称为一等函数。包含一流功能的任何语言都可以以功能样式编写。
功能范例中通常使用一组重要的一流功能。这些函数采用Python可迭代,并且sorted()对列表中的每个元素都应用一个函数。在接下来的几节中,我们将研究其中的每个功能,但它们都遵循的一般形式function_name(function_to_apply, iterable_of_elements)。
我们将使用的第一个功能是该map()功能。该map()函数接受一个可迭代的(即list),并创建一个新的可迭代对象,即一个特殊map对象。新对象将一流的功能应用于每个元素。
这是我们可以使用map添加10或添加20到列表中每个元素的方法:
请注意,将返回值强制转换map()为list对象很重要。map如果期望返回的对象像一样运行,则很难使用它list。首先,打印它不会显示每个项目,其次,您只能对其进行一次迭代。
过滤功能
我们将使用的第二个功能是该filter()功能。该filter()函数接受一个Iterable,创建一个新的Iterable对象(再次是一个特殊map对象),以及一个必须返回bool值的一流函数。新map对象是返回的所有元素的过滤后迭代True。
这是我们如何从列表中过滤奇数或偶数的方法:
约简功能
我们要看的最后一个函数是包中的reduce()函数。该函数接受一个可迭代对象,然后将可迭代对象减小为单个值。Reduce与和有所不同,因为采用具有两个输入值的函数。functoolsreduce()filter()map()reduce()
这是一个示例,说明如何使用reduce()求和法对列表中的所有元素求和。
一个有趣的注意,使的是,你不必须在在第二个值操作lambda的表达。例如,您可以编写一个始终返回可迭代对象的第一个值的函数:
用列表理解进行重写
因为我们最终会转换为列表,所以我们应该改用list comprehension 重写map()and filter()函数。这是编写它们的更Python化的方式,因为我们利用Python语法来创建列表。您可以按照以下方式翻译map()和filter()列出理解的示例:
从示例中,您可以看到我们不需要添加lambda表达式。如果您想在自己的代码中添加map()或filter()函数,通常是推荐的方法。但是,在下一节中,我们将提供一个案例,让您仍然使用map()and filter()函数。
编写功能部分
有时,我们想使用函数的行为,但要减少其使用的参数数量。目的是“保存”输入之一,并创建一个新功能,该功能使用保存的输入来默认行为。假设我们想编写一个函数,该函数总是将2加到任何数字上:
该add_two函数类似于通用函数$ f(a,b)= a + b $,只是它默认了一个参数($ a = 2 $)。在Python中,我们可以使用partial模块从functools包中设置这些参数的默认值。该partial模块接收一个函数,并从第一个参数开始“冻结”任意数量的args(或kwarg),然后返回具有默认输入的新函数。
部分函数可以接受任何函数,包括标准库中的函数。
下一步
在大数据分析Python函数和函数式编程中,我们介绍了函数式编程的范例。我们了解了Python中的lambda表达式,重要的功能函数以及局部函数的概念。总体而言,我们表明Python为程序员提供了轻松在函数式编程和面向对象编程之间进行切换的工具。
查看其他资源,您可能会发现有帮助:
1)Python教程 —我们不断扩展的数据科学Python教程列表。
2)数据科学课程 -直接在浏览器中通过完全交互式的编程,数据科学和统计课程将您的学习提升到一个新的水平。
填写下面表单即可预约申请免费试听!怕钱不够?可先就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可推荐就业!
©2007-2022/ www.aaa-cg.com.cn 北京漫动者数字科技有限公司 备案号: 京ICP备12034770号 监督电话:010-53672995 邮箱:bjaaa@aaaedu.cc