pythonPython中的函数式编

Python中的函数式编程:何时以及如何使用它-第三篇

从迭代器中选择元素filter()

filter()允许您基于给定功能的评估从迭代中选择或筛选项目。它的调用方式如下:

filter(f,iterable)实用功能f到的每个元素iterable,并返回该产生的所有项目,其一个迭代f是truthy。相反,它会过滤掉所有f虚假的项目。

在以下示例中,greater_than_(x)如果为真,则为真x:

在这种情况下,greater_than_()对项目truthy,和,因此这些项目依然存在,而1,2和3被丢弃。与前面的示例一样,它greater_than_()是一个短函数,您可以将其替换为lambda表达式:

下一个示例功能range()。range(n)产生一个迭代器,该迭代器生成从0到的整数n-1。下面的示例用于filter()从列表中仅选择偶数,并过滤掉奇数:

这是一个使用内置字符串方法的示例:

从前面的教程记住的字符串的方法是s.isupper()返回True,如果所有的字母字符s是大写字母,False否则。

用reduce()

reduce()将一项功能一次应用于两个可迭代项,并将它们逐步组合以产生单个结果。

reduce()曾经是Python中的内置函数。吉多·范·罗苏姆(GuidovanRossum)显然颇为不满reduce(),他主张将其从语言中完全删除。这是他不得不说的:

所以现在reduce()。实际上,这是我一直最讨厌的一个,因为除了涉及到+或的几个示例外*,几乎每次我看到reduce()带有非平凡函数参数的调用时,我都需要拿笔和纸来画出实际被喂食的东西进入该功能之前,我不知道reduce()应该做什么。因此,在我看来,的适用范围reduce()几乎仅限于关联运算符,在所有其他情况下,最好显式地写出累加循环。

实际上倡导消除所有三个reduce(),map()和filter()在Python。一个人只能猜测他的理由。碰巧的是,前面提到的列表理解涵盖了所有这些功能以及更多功能所提供的功能。

如您所见,map()并filter()保留在Python中的内置函数。reduce()不再是内置函数,但可以从标准库模块导入,如下所示。

要使用它reduce(),您需要从名为的模块中导入它functools。这可以通过多种方式实现,但是以下是最简单的方法:

之后,解释器将reduce()放入全局名称空间并使其可用。您将在下面看到的示例假设是这种情况。

调用reduce()有两个参数

最简单的reduce()调用需要一个函数和一个可迭代的函数,如下所示:

reduce(f,iterable)使用f,它必须是一个正好包含两个参数的函数,以逐步组合中的元素iterable。首先,reduce()调用f的前两个元素iterable。然后将该结果与第三个元素组合,然后将该结果与第四个元素组合,依此类推,直到列表用尽。然后reduce()返回最终结果。当Guido说最直接的应用reduce()是使用关联运算符的应用时,他是对的。让我们从加号(+)开始:

此调用从列表中reduce()产生结果,如下所示:15[1,2,3,4,5]

这是对列表中的数字求和的一种相当round回的方式!尽管这很好用,但是还有一种更直接的方法。Python的内置sum()函数以可迭代的方式返回数字值的总和:

请记住,二进制加号运算符还会连接字符串。因此,该示例也将逐步将列表中的字符串连接起来:

同样,有一种方法可以使大多数人更典型地考虑使用Pythonic。这正是这样str.join()做的:

现在考虑使用二进制乘法运算符(*)的事例。正整数的阶乘n定义如下:

您可以使用reduce()和来实现阶乘函数range(),如下所示:

再一次,有一种更简单的方法可以做到这一点。您可以使用factorial()标准math模块提供的:

作为最后一个示例,假设您需要在列表中找到最大值。Python提供了内置函数max()来执行此操作,但是您也可以使用reduce():

请注意,在上面的每个示例中,传递给的函数reduce()都是单行函数。在每种情况下,您都可以使用一个lambda函数代替:

这是避免将原本不需要的函数放置到名称空间中的便捷方法。另一方面,当您使用代码lambda而不是定义单独的功能时,阅读代码来确定您的意图的人可能会更难一点。通常,这是可读性和便利性之间的平衡。

#Python知识分享#

Python学习手册(套装上下册)(原书第5版)京东月销量好评率99%无理由退换京东配送官方店¥.7购买


转载请注明:http://www.aierlanlan.com/rzfs/1448.html