Python中的Lambda、Map、Filter和Reduce

Python编程中,Lambda、Map、Filter和Reduce是四个非常有用的函数式编程工具。本文将详细解释它们是什么,为什么使用它们,如何使用它们,以及何时使用它们。如果对这些概念已经很熟悉,可以直接跳到文章末尾的总结部分。

目录

Lambda

Lambda是Python中的一个关键字,用于定义匿名函数,也称为Lambda表达式。Lambda函数的语法如下:

lambda arguments: expression

通过一个例子来理解Lambda函数。假设需要一个函数来计算一个数的平方,可能会这样写:

def square(n): return n ** 2

上面的代码虽然直观,但不够Pythonic。可以使用Lambda函数来简化它:

square = lambda n: n ** 2

这里的表达式n ** 2首先被计算,然后返回值赋给标识符square。现在square可以作为一个函数使用,可以传入任何数字来计算它的平方。

Lambda函数还可以通过添加条件语句来扩展。下面是一个自解释的例子:

maxi = lambda x, y: x if x > y else y

Lambda函数的主要限制是它们可以有任意数量的参数,但只能有一个表达式。Lambda函数主要用于与Map函数一起作为内联函数使用。接下来,讨论Map函数。

Map

假设需要计算前五个奇数的平方,可能会这样写:

squares = [] for n in range(1, 10, 2): squares.append(n ** 2)

循环遍历1到10,步长为2,并将每个数的平方添加到squares列表中。这种方法可以使用列表推导式改进,但仍然会使用for循环。因此,有一种更快的方法可以在不使用显式for循环的情况下完成相同的工作。Python的Map函数可以做到这一点。Map函数的语法如下:

map(function, iterable)

Map函数接受一个函数和一个可迭代对象(如列表、元组等)作为输入,将传入的函数应用于可迭代对象的每个项目,并返回一个Map对象(一个迭代器)。让使用Map函数重新实现上述示例:

def square(n): return n ** 2 squares = map(square, range(1, 10, 2)) list(squares) # 输出: [1, 9, 25, 49, 81]

这里的square函数返回任何数字的平方。Map函数接受square函数和range(1, 10, 2)作为参数。它将square函数应用于给定范围(1, 3, 5, 7, 9),返回一个Map对象,然后转换为列表。

上面的代码比之前的版本长。因此,让使用Lambda函数使其更Pythonic。看看下面的自解释代码:

squares = list(map(lambda n: n ** 2, range(1, 10, 2)))

在这里,Lambda函数应用于给定的可迭代对象,返回一个Map对象,然后转换为列表。Map函数可以有多个可迭代对象。让通过一个快速示例来演示这一点。

num1 = [2, 4, 9] num2 = [3, 8, 5] result = list(map(lambda x, y: x + y, num1, num2)) result # 输出: [5, 12, 14]

在这里,对列表进行了逐元素相加。请注意,Map函数可以接受任何可迭代对象作为参数,而不仅仅是列表。

Filter

假设想要从一个给定的列表中找到奇数。一个快速的方法是使用for循环中的列表推导式。

nums = [1, 34, 23, 56, 89, 44, 92] odd_nums = [num for num in nums if num % 2 != 0]

循环遍历nums并存储每个奇数。这里的条件语句过滤掉偶数,只返回奇数。这种功能被称为过滤。Python的Filter函数以更快的方式做同样的事情。它与Map函数具有相同的语法:

filter(function, iterable)

它与Map函数的工作方式类似,返回一个Filter对象,而不是Map对象。让使用Filter函数重新实现上述示例:

def find_odd(x): if x % 2 != 0: return x nums = [1, 34, 23, 56, 89, 44, 92] odds = list(filter(find_odd, nums)) print(odds) # 输出: [1, 23, 89]

让将这个find_odd函数转换为Lambda函数,并重写代码以使其更短。

nums = [1, 34, 23, 56, 89, 44, 92] odds = list(filter(lambda x: x % 2 != 0, nums)) print(odds) # 输出: [1, 23, 89]

所有Lambda函数评估为True的可迭代对象中的项目将被添加到结果中。

Reduce

假设想计算前五个整数的和。可以这样写:

nums = [1, 2, 3, 4, 5] summ = 0 for num in nums: summ += num summ # 输出: 15

循环遍历nums并将所有数字相加到summ。为了使代码更Pythonic,有一个函数,即Reduce。Reduce的语法如下:

reduce(function, iterable, [, initializer])

Reduce函数累积地对可迭代对象的所有项目应用一个函数,并返回一个单一值。如果还没有理解,不用担心。让使用Reduce函数重新实现上述示例:

from functools import reduce nums = [1, 2, 3, 4, 5] summ = reduce(lambda x, y: x + y, nums) summ # 输出: 15

在这里,求和以累积/连续的方式进行:((((1 + 2) + 3) + 4) + 5)。

Lambda函数:具有多个参数但只有一个表达式的函数。它有助于使代码更Pythonic,并创建函数包装器。

Map函数:一个将给定函数应用于可迭代对象的每个项目并返回迭代器的函数。它提供了一种更快的方式来根据给定条件转换可迭代对象。它可以有多个可迭代对象。

Filter函数:它与Map函数具有相同的语法。它有助于根据给定条件从可迭代对象中提取项目。

Reduce函数:它累积/连续地对可迭代对象的每个项目应用函数,并返回一个单一值。

今天的讨论到此结束。感谢阅读本文!希望喜欢这篇文章,并且像写它时一样享受阅读。

如果认为遗漏了重要内容或想要分享想法,请在下面评论,会回复。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485