10分钟学习函数式Python( 二 )


文章插图
 
我们相对每个数字进行平方,我们可以像这样写代码:

10分钟学习函数式Python

文章插图
 
函数式Python是惰性的 。如果我们不包含list(),函数将存储该可迭代对象的定义,而不是列表本身 。我们需要告诉Python“把这个转换成一个列表”,以便我们使用它 。
在Python中突然从非惰性求值变成惰性求值是很奇怪的 。如果您更多地以函数式思维而不是命令式思维进行思考,您就会习惯它 。
现在写一个像square(num)这样的普通函数就很好了,但是它看起来不够好 。我们必须定义一个完整的函数才可以在一个映射中使用它吗?好吧,我们可以使用lambda(匿名)函数在map中定义一个函数 。
Python中的lambda表达式Lambda函数是一个只有一行代码的函数,适用于短期内使用 。我们经常将它们随同高阶函数,如filter、map和reduce函数,一起使用 。这个lambda表达式会对传给它的数字进行平方:
10分钟学习函数式Python

文章插图
 
现在我们来运行这个函数:
10分钟学习函数式Python

文章插图
 
我听到您在说:“Brandon,参数在哪里?这是什么鬼东西?它看起来一点也不像一个函数?”
嗯,这确实很令人困惑,但我可以解释它 。我们将某个东西赋值给变量square 。这部分:
10分钟学习函数式Python

文章插图
 
告诉Python这是一个lambda函数,输入被称为x 。冒号之后的任何东西都是我们对输入所执行的操作,它返回的就是这些操作的结果 。
为了将我们的平方程序简化成一行,我们可以这样做:
10分钟学习函数式Python

文章插图
 
在一个lambda表达式中,所有的参数都在左边,而我们要用它们做的事情都在右边 。没人能否认,这有点乱 。编写只有其他函数式程序员才能阅读的代码是一种乐趣 。另外,将一个函数转换成一行程序是非常酷的事情 。
Python中的reduce函数reduce是一个函数,它将给定的函数应用于一个可迭代对象并返回一个东西 。通常我们会在一个列表上进行计算,将其缩减至一个数字 。Reduce看起来是这样的:
10分钟学习函数式Python

文章插图
 
我们可以(通常也会)使用lambda表达式作为函数 。
列表的乘积是每一个数字相乘 。编写的程序是这样:
10分钟学习函数式Python

文章插图
 
但是使用reduce我们可以这样写:
10分钟学习函数式Python

文章插图
 
我们得到了相同的乘积 。代码更短,并且具有函数式编程的知识,因此更简洁 。
fileter函数filter函数接受一个iterable并过滤掉我们不希望存在于该iterable中的所有东西 。
filter接受一个函数和一个列表 。它将该函数应用于列表中的每一项,如果该函数返回True,则不执行任何操作 。如果该函数返回False,它会从该列表中删除该项 。
语法如下:
10分钟学习函数式Python

文章插图
 
让我们看一个小例子,没有filter,我们会这样写:
10分钟学习函数式Python

文章插图
 
使用filter, 这就变成了:
10分钟学习函数式Python

文章插图
 
Python中的高阶函数高阶函数可以将函数作为参数并返回函数 。一个例子是:
10分钟学习函数式Python

文章插图
 
或者第二个定义,return functions,的一个简单例子是:
10分钟学习函数式Python

文章插图
 
高阶函数使非变化变量更容易处理 。如果我们所做的只是在一系列函数中传递数据,那么我们就不需要在任何地方存储变量 。
Python中的所有函数都是一级对象 。当一个对象具有以下特性中的一个或多个时,我们将其定义为一级对象:
  • 在运行时被创建
  • 可以被赋值给一个变量或一个数据结构中的元素
  • 作为参数被传递给函数
  • 作为函数的结果被返回
因此Python中的所有函数都是一级函数,可以作为高阶函数使用 。


推荐阅读