欢迎关注 “小白玩转Python”,发现更多 “有趣”
引言
Python 是一种面向对象程序设计语言。但是,它提供了一些提供函数式编程风格的工具。其中一些工具包括 map()、 filter()和 reduce()函数。在文中,我们将探索reduce()函数并阐明其提供的多功能性和实用性。
使用for循环
介绍reduce()函数的最好的方式是从实际问题入手,并尝试用老式的方法解决它,即使用for循环。然后我们可以使用reduce函数尝试解决相同的问题。
假设我们有一个数字列表,我们希望将列表中的所有数字相乘,然后返回乘积。我们可以使用 for 循环来完成这个任务:
# list of numbers
num_list = [1,2,3,4,5]
# set product equal to 1
product = 1
# loop through num_list and multiply the numbers together
for num in num_list:
product = product * num
print(product) # output is 120
我们有数字列表num_list。我们希望将该列表中的数字相乘并得到它们的乘积。我们创建变量product并将其设置为1。然后使用for循环遍历num_list,然后将每个数字乘以上一次迭代的结果。遍历num_list之后,product的值为120,这是列表中所有数字的乘积。
Reduce函数
事实上,我们可以使用reduce函数来完成上述任务。Reduce函数可以接受三个参数,其中两个是必需的。这两个必需的参数是: 一个函数(它本身包含两个参数)和一个迭代对象(例如一个列表)。第三个参数是初始化,是可选的,我们将在后面讨论它。
reduce(function, iterable[, initializer])
导入 reduce函数
reduce函数位于functools模块中,该模块包含高阶函数。高阶函数是作用于或返回其他函数的函数。因此,为了使用reduce函数,我们要么需要导入整个functools模块,要么只能从functools中导入reduce函数:
import functools
from functools import reduce
注意: 如果我们导入functools,我们需要像下面这样访问reduce函数: functools.reduce (参数)。如果只从functools模块中导入reduce函数,只需输入reduce (arguments)即可访问 reduce函数。
探索reduce函数
如上所述,reduce函数接受两个必需的参数: 一个函数和一个迭代对象。Reduce的第一个参数本身必须接受两个参数。Reduce将这个函数累积地应用于迭代(从左到右)的元素,并将其减少为单个值。
让我们来看一个例子:
假设我们使用的迭代对象是一个列表,比如开头例子中的 num_list:
num_list = [1,2,3,4,5]
我们用作reduce的第一个参数的函数本体如下:
def prod(x, y):
return x * y
这个 prod 函数接受两个参数: x 和 y,然后返回他们的乘积。
让我们分别将prod函数和num_list作为函数和可迭代对象代入reduce中:
from functools import reduce
product = reduce(prod, num_list)
我们的迭代对象是 num_list,它是list: [1,2,3,4,5]。我们的函数prod接受两个参数x和y,首先接受 num_list 的前两个元素1和2,然后将它们作为x和y参数传递给prod函数。Prod 函数返回他们的乘积2。Reduce将使用这个累积值2作为新的x值,并使用 num_list中的下一个元素3作为新的y值。然后它将这两个值(2和3)作为x和y发送给prod函数,然后prod函数返回它们的乘积6。然后,这个6将用作新的x值,num_list中的下一个元素将用作新的y值,即4。然后它将6和4作为x和y值发送给prod函数,该函数返回24。因此,我们的新x值是24,新y值是 num_list的下一个元素。这两个值作为x和y值传递给prod函数,prod返回它们的乘积24 * 5=120。
第三个参数
还记得我们说过reduce可以接受可选的第三个参数,即初始化吗?其默认值为“None”。如果我们传入一个初始化,它将通过reduce用作第一个x值(而不是可迭代的第一个元素)。因此,如果我们在上面的示例中将数字2传递为初始化程序:
product = reduce(prod, num_list, 2)
print(product) #240
那么x和y的前两个值或参数分别是2和1。所有后续步骤都是相同的。
使用 Lambda 表达式
我们可以使用lambda表达式来简化代码:
product = reduce(lambda x,y: x*y, num_list)
使用Reduce函数的其他例子
还有很多其他的场景可以使用 reduce。
例如,我们可以在对列表中数字求和:
num_list = [1,2,3,4,5]
sum = reduce(lambda x,y: x + y, num_list)
print(sum) #15
或者我们可以找到列表中的最大值:
num_list = [1,2,3,4,5]
max_num = reduce(lambda x,y: x if x > y else y, num_list)
print(max_num) #5
或者列表中的最小数字:
num_list = [1,2,3,4,5]
min_num = reduce(lambda x,y: x if x < y else y, num_list)
print(min_num) #1
还有很多其他的应用!
注意: Python 确实有一些内置函数,比如 max ()、 min ()和 sum () ,这些函数对于这三个示例来说更容易使用。但是,我们的目标是展示如何使用 reduce ()来完成许多不同的任务。
总结
在本文中,我们学习了如何在python中导入和使用reduce函数。然后我们看到了如何将lambda表达式作为参数传入reduce。最后我们看到了一些如何使用reduce的例子。
· END ·
HAPPY LIFE