10分钟学习函数式Python


10分钟学习函数式Python

文章插图
 
在这篇10分钟的文章中,您将学习Python中的函数式范型 。您还将学习列表推导式 。
目录
  1. 函数式范式
  2. Python的map函数是如何运行的
  3. Python中的lambda表达式
  4. Python中的reduce函数
  5. filter函数
  6. Python中的高阶函数
  7. 带有函数的部分应用
  8. 函数编程不是Python化
  9. 列表推导式
  10. 任何可迭代对象的推导式
  11. 结论
函数式范式在命令式编程范式中,我们通过给计算机一个任务序列来执行任务,然后计算机会执行这些任务 。在执行它们时,计算机可以改变状态 。例如,我们设A = 5,然后改变A的值 。因为我们的A是变量,所以它内部的值是变化的 。
在函数式编程范式中,我们不告诉计算机去做什么,而是告诉它是什么东西 。一个数的最大公约数是什么,等等 。
变量不会变化 。一旦我们设置了一个变量,它就会永远保持这种状态 。因此,函数在函数式范型中没有副作用 。副作用就是函数改变了它外部的东西 。让我们来看一个例子:
10分钟学习函数式Python

文章插图
 
输出是5 。在函数式范型中,改变变量是一个很大的禁忌,而让函数影响它们范围之外的东西也是一个大大的禁忌 。函数唯一能做的就是计算某些东西并返回它 。
现在您可能会想“没有变量,就没有副作用?为什么这很好?”问得好,读这篇文章的古怪陌生人 。
如果一个函数使用相同的参数被调用两次,那么它肯定会返回相同的结果 。如果您学过数学函数,您就会喜欢这一点 。我们称之为函数的引用透明性 。由于函数没有副作用,如果我们构建一个计算程序,我们就可以加快该程序的速度 。如果程序知道func(2)等于3,我们可以将其存储在一个表中 。这将防止程序在我们已经知道答案的情况下去运行相同的函数 。
通常,在函数式编程中,我们不使用循环,我们使用递归 。递归是一个数学概念,它意味着“自食其力” 。对于递归函数,该函数将自己作为一个子函数进行调用 。下面是Python中递归函数的一个很好的例子:
10分钟学习函数式Python

文章插图
 
一些编程语言也很懒 。这意味着他们直到最后一秒才开始计算或做任何事情 。如果我们编写一些代码来执行2 + 2,一个函数式程序只会在我们需要使用结果时才会计算这个结果 。我们很快就会探讨Python中的惰性 。
Python的map函数是如何运行的为了理解映射,让我们首先看看什么是可迭代对象 。一个可迭代对象是我们可以迭代的任何东西 。这些是列表或数组,但是Python有许多不同的可迭代对象 。我们甚至可以通过实现魔术方法来创建我们自己的可迭代对象 。一个魔术方法就像一个API,它可以帮助我们的对象变得更Python化 。要使一个对象成为一个可迭代对象,我们需要实现2个魔术方法:
10分钟学习函数式Python

文章插图
 
第一个魔术方法是__iter__,或者叫特殊iter(双下划线)方法,它会返回迭代对象,我们通常在循环开始时使用它 。特殊next方法,__next__,会返回下一个对象是什么 。
让我们来看看这个:
10分钟学习函数式Python

文章插图
 
这将输出:
10分钟学习函数式Python

文章插图
 
在Python中,迭代器是一个对象,它只有一个简单的__iter__魔术方法 。这意味着我们可以访问该对象中的位置,但不能遍历该对象 。有些对象有魔术方法__next__,但没有__iter__魔术方法,如sets(将在本文后面讨论) 。对于本文,我们将假设我们接触的所有东西都是一个可迭代的对象 。
现在我们知道了什么是可迭代对象,让我们回到map函数 。
map函数允许我们将一个函数应用到一个可迭代对象中的每个项 。我们希望将一个函数应用到一个列表中的每个项,但是要知道这对大多数可迭代对象来说都是可行的 。map的语法接受两个输入,即要应用的函数和可迭代的对象 。
10分钟学习函数式Python

文章插图
【10分钟学习函数式Python】 
假设我们有一个像这样的数字列表:
10分钟学习函数式Python


推荐阅读