10分钟学会python函数式编程

简介: 10分钟学会python函数式编程

在这篇文章里,你将学会什么是函数范式以及如何使用Python进行函数式编程。你也将了解列表推导和其它形式的推导。


函数范式


在命令式范式中,通过为计算机提供一系列指令然后执行它们来完成任务。在执行这些指令时,可以改变某些状态。例如,假设你最初将A设置为5,然后更改A的值。这时在变量内部值的意义上,你改变了A的状态。


在函数式范式中,你不用告诉计算机做什么而是告诉他这个东西是什么。比如数字的最大公约数是什么,从1到n的乘积是什么等等。


因此,变量不能变化。一旦你设置了一个变量,它就永远保持这种状态(注意,在纯函数式语言中,它们不是变量)。因此,函数式编程没有副作用。副作用指的是函数改变它自己以外的东西。让我们看一些典型Python代码的示例:


0cf3d9af8bec473f9346c28a39e6a481.png


这段代码的输出是5。在函数式范式中,改变变量是一个很大的禁忌,并且具有影响其范围之外事物的功能也是一个很大的禁忌。函数唯一能做的就是计算一些东西并将其作为结果返回。


现在你可能会想:“没有变量,没有副作用?为什么这样好?“这个问题问得好,我相信大多数人对此感到疑惑。


如果使用相同的参数调用函数两次,则保证返回相同的结果。如果你已经学习了数学函数,你就会知道这个好处。这称为参照透明度。由于函数没有副作用,如果你正在构建一个计算某些事情的程序,你可以加速程序。如果每次调用func(2)都返回3,我们可以将它存储在表中,这可以防止程序重复运行相同的功能。


通常,在函数式编程中,我们不使用循环。我们使用递归。递归是一个数学概念,通常意味着“自我调用”。使用递归函数,该函数将其自身作为子函数重复调用。这是Python中递归函数的一个很好的例子:


6539d02e99434d9aa7e35178b90f7336.png


有些编程语言也具有惰性。这意味着他们直到最后一秒才计算或做任何事情。如果你编写一些代码来执行2 + 2,函数程序只会在你真正需要使用结果时计算出来。我们很快就会在Python中探索惰性。


Map


为了理解,我们先来看看迭代是什么。通常可以迭代的对象是列表或数组,但Python有许多不同的类型可以迭代。你甚至可以创建自己的对象,这些对象可以通过实现魔术方法进行迭代。魔术方法就像是一个API,可以帮助你的对象变得更加Pythonic。您需要实现2个魔术方法才能使对象成为可迭代的:


b184cc561cb6448699599f7a790994af.png


第一个魔术方法“__iter__”(注:这里是双下划线)返回迭代对象,这通常在循环开始时使用。”__next__“返回下一个对象。


让我们快速进入一个终端调用上面的代码:


cb844f4901444b1a95ccd2f34888ac47.png


运行将会打印出


391afc1c2bc44c23a656d5b182cfb990.png


在Python中,迭代器是一个只有__iter__魔术方法的对象。这意味着您可以访问对象中的位置,但不能遍历该对象。一些对象将具有魔术方法__next__而不是__iter__魔术方法,例如集合(在本文后面讨论)。对于本文,我们假设我们接触的所有内容都是可迭代的对象。


现在我们知道什么是可迭代对象了,让我们回到map函数。 map函数允许我们将函数应用于iterable中的每一项。 Map需要2个输入,它们分别是要应用的函数和可迭代对象。


ed30921a46d24c058b82879613f507b7.png


假设我们有一个数字列表,如下所示:


d8b0413bd14c42968783932b3eb87b9b.png


我们想要对每个数字进行平方,我们可以编写如下代码:


6d1e520aca114067b3e8c06ee262272f.png


Python中函数式的函数是具有惰性的。如果我们不使用“list”,该函数将存储iterable的定义,而不是列表本身。我们需要明确告诉Python“把它变成一个列表”供我们使用。


在Python中突然从非惰性求值转向惰性求值有点奇怪。如果你在函数式思维方式中考虑得更多,而不是命令式思维方式,那么你最终会习惯它。


现在写一个像“square(num)”这样的普通函数虽然很好,但却是不对的。我们必须定义一个完整的函数才能在map中使用它?好吧,我们可以使用lambda(匿名)函数在map中定义一个函数。


Lambda表达式


lambda表达式是一个只有一行的函数。举个例子,这个lambda表达式对给定的数字进行平方:


4cd4826dd7e641a1be131165e58d5d5d.png


让我们运行它:


eb98d2e00c1240da871651b57c1dc721.png


这看起来不像一个函数吗?


嗯,这有点令人困惑,但可以解释。我们将一些东西分配给变量“square”。那这个呢:


d04422d393ca4142a607b7c34fa7e5ac.png



告诉Python这是一个lambda函数,输入叫做x。冒号之后的任何内容都是您对输入所做的操作,它会自动返回结果。


简化我们的square程序到只有一行代码,我们可以这样做:


40062eabf95a471ea8ac3c7ecbed9c36.png


所以在lambda表达式中,所有参数都在左边,你要用它们做的东西在右边。它有点乱。但事实是,编写只有其他函数式程序员才能阅读的代码会有一定的乐趣。此外,使用一个函数并将其转换为一行代码是非常酷的。


Reduce


Reduce是一个将迭代变成一个东西的函数。通常,你可以在列表上使用reduce函数执行计算以将其减少到一个数字。 Reduce看起来像这样:


我们经常会使用lambda表达式作为函数。


列表的乘积是每个单独的数字相乘。要做到这一点你将编写如下代码:


2e184056b9c745cf881758810e35bc89.png


但是使用reduce你可以这样写:


df706b6e3f694de388d5ec7d41ac77cc.png


获得相同的功能,代码更短,并且在使用函数式编程的情况下更整洁。(注:reduce函数在Python3中已不是内置函数,需要从functools模块中导入)


Filter


filter函数采用可迭代的方式,并过滤掉你在该可迭代中不需要的所有内容。


通常,filter需要一个函数和一个列表。它将函数应用于列表中的每一项,如果该函数返回True,则不执行任何操作。如果返回False,则从列表中删除该项。


语法如下:


5d4d4d7241304ca2bc6fef824c1c1845.png


总结


函数式编程美观而纯粹。函数式代码可以很干净,但也可能很乱。一些Python程序员不喜欢Python中的函数式编程。但我认为,你应该在解决问题时,使用最佳工具。

相关文章
|
1月前
|
开发者 Python
Python中的函数式编程:理解map、filter和reduce
【2月更文挑战第13天】 本文深入探讨了Python中函数式编程的三个主要工具:map、filter和reduce。我们将详细解释这些函数的工作原理,并通过实例来展示它们如何使代码更简洁、更易读。我们还将讨论一些常见的误解和陷阱,以及如何避免它们。无论你是Python新手还是有经验的开发者,本文都将帮助你更好地理解和使用这些强大的函数。
|
2月前
|
Python
解释Python中的函数式编程的概念,并举例说明。
【2月更文挑战第6天】【2月更文挑战第14篇】解释Python中的函数式编程的概念,并举例说明。
|
1月前
|
Python
函数式编程在Python中的应用与实践
本文探讨了函数式编程的基本概念及其在Python中的实现。通过实例和代码,我们将深入了解如何利用高阶函数、闭包、装饰器等函数式编程特性来提高代码的可读性、可维护性和灵活性。
8 0
|
1月前
|
测试技术 Python
Python中的装饰器与函数式编程
在Python编程中,装饰器是一种强大的工具,它能够增强函数的功能而不改变其核心代码结构。本文将深入探讨Python装饰器的原理和应用,以及如何利用装饰器实现函数式编程的思想。
|
1月前
|
存储 Python
Python中的函数式编程
【2月更文挑战第10天】函数式编程是一种不同于面向对象编程的程序设计范式,它强调函数的应用和组合。Python作为一种灵活多变的语言,也提供了函数式编程的支持。本文将介绍Python中的函数式编程,包括Lambda表达式、高阶函数、闭包等内容。
|
1月前
|
测试技术 开发者 Python
探索Python中的函数式编程范式
【2月更文挑战第10天】 本文将深入探讨Python编程语言中的函数式编程范式,介绍其背景、特点以及在实际项目中的应用场景。通过对函数式编程的原理和优势进行分析,帮助读者更好地理解如何利用函数式编程思想提高代码质量和可维护性。
|
1月前
|
Serverless 开发者 Python
Python编程中的函数式编程思想探究
【2月更文挑战第10天】传统的程序设计是以过程为中心,而函数式编程则将函数视为基本构建块,强调函数的纯洁性和不变性。本文将从Python编程语言的角度探讨函数式编程思想在实践中的应用,介绍函数式编程的概念、特点以及在Python中的具体实现方式,帮助读者更好地理解和运用函数式编程范式。
18 0
|
2月前
|
算法 数据处理 开发者
Python编程中的函数式编程思想探究
【2月更文挑战第8天】传统的面向对象编程思想在Python中被广泛应用,但函数式编程作为另一种范式,在Python中同样具有重要意义。本文将深入探讨Python中函数式编程的原理和应用,帮助读者更好地理解并运用函数式编程思想解决实际问题。
|
2月前
|
人工智能 Python
Python中的函数式编程
【2月更文挑战第5天】函数式编程(Functional Programming)是一种思想方式,它强调函数的纯粹性和不可变性,它可以帮助开发人员写出更加简洁、高效且易于维护的代码。本文将介绍Python中的函数式编程相关知识。
|
2月前
|
Python
介绍Python中的函数式编程中的“纯函数”概念。
介绍Python中的函数式编程中的“纯函数”概念。