在Python编程中,Lambda、Map、Filter和Reduce是四个非常有用的函数式编程工具。本文将详细解释它们是什么,为什么使用它们,如何使用它们,以及何时使用它们。如果对这些概念已经很熟悉,可以直接跳到文章末尾的总结部分。
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函数。
假设需要计算前五个奇数的平方,可能会这样写:
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函数可以接受任何可迭代对象作为参数,而不仅仅是列表。
假设想要从一个给定的列表中找到奇数。一个快速的方法是使用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的可迭代对象中的项目将被添加到结果中。
假设想计算前五个整数的和。可以这样写:
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函数:它累积/连续地对可迭代对象的每个项目应用函数,并返回一个单一值。
今天的讨论到此结束。感谢阅读本文!希望喜欢这篇文章,并且像写它时一样享受阅读。
如果认为遗漏了重要内容或想要分享想法,请在下面评论,会回复。