gpt4 book ai didi

python - 在 Python 3 map() 中使用多个函数

转载 作者:行者123 更新时间:2023-12-02 16:49:48 25 4
gpt4 key购买 nike

我不确定下面的代码为何有效。根据文档,map 仅将一个函数作为第一个参数并将其应用于一个或多个可迭代对象,具体取决于该函数采用的参数数量。

map(函数,可迭代..)

但是,您可以传递多个函数来代替可迭代对象,并且它们会以某种方式被视为可迭代对象。这条线以某种方式采用函数 add、square 和 str 并将它们视为可迭代对象。

如何将函数视为有效的可迭代对象?

def add(x):
return x + x


def square(x):
return x * x


nums = [1, 2, 3, 4, 5]

for i in nums:
vals = list(map(lambda x: x(i), (add, square, str)))

print(vals)

返回:

[2, 1, '1']
[4, 4, '2']
[6, 9, '3']
[8, 16, '4']
[10, 25, '5']

*编辑马丁回答了这个问题。此代码执行相同的操作,但将其从 lambda 函数中分离出来,显示 add、square、str 是如何迭代的函数。

def add(x):
return x + x


def square(x):
return x * x


def act_on_iter(iter_obj, i):
return iter_obj(i)


nums = [1, 2, 3, 4, 5]

for i in nums:
vals = list(map(act_on_iter, (add, square, str), [i] * 3))

print(vals)

返回相同的

[2, 1, '1']
[4, 4, '2']
[6, 9, '3']
[8, 16, '4']
[10, 25, '5']

最佳答案

您正在传递一个可调用对象的迭代:

(add, square, str)

那是一个元组,而元组是可迭代的。可迭代对象内部是什么并不重要,在 Python 中,函数是一流的对象,就像字符串和整数以及类和实例一样。您可以传递函数,包括将它们存储在元组中。

然后你有一个 lambda 可调用:

lambda x: x(i)

它获取可迭代对象中的每个项目,并将它们也视为可调用对象。 x 设置为 add,然后设置为 square,然后设置为 strlambda 调用每个传入的 i。同样,函数只是另一种类型的对象,您可以将一个函数作为参数值传递给另一个函数,这里接收函数对象的参数名为 x。表达式 x(i) 然后调用分配给 x 的任何内容。

如果您将 lambda 替换为 print(没有 () 括号,我们引用的是函数对象),那么您会看到:

>>> list(map(print, (add, square, str)))
<function add at 0x11645a670>
<function square at 0x11645a790>
<class 'str'>
[None, None, None]

[None, None, None] 列表是调用 print() 三次的结果,该函数始终返回 None。有趣的部分是 [None, None, None] 之前的输出,这些是 (add, square, str) 中三个函数中每一个的字符串表示元组。

在您的示例代码中,您有一个 for 循环遍历 nums,将每个值分配给 i,因此 1, 2, 3 等。所以你看到的实际输出是通过重复使用 map() 产生的,如 i 变化:

  • i = 1, -> [add(1), square(1), str(1)] -> [2, 1, ' 1']
  • i = 2, -> [add(2), square(2), str(2)] -> [4, 4, ' 2']
  • i = 3, -> [add(3), square(3), str(3)] -> [6, 9, ' 3']
  • i = 4, -> [add(4), square(4), str(4)] -> [8, 16, ' 4']
  • i = 5, -> [add(5), square(5), str(5)] -> [10, 25, ' 5']

关于python - 在 Python 3 map() 中使用多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59181938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com