【问题标题】:Using multiple functions in Python 3 map()在 Python 3 map() 中使用多个函数
【发布时间】:2020-03-29 14:31:32
【问题描述】:

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

map(function, iterable..)

但是,代替可迭代对象,您可以传递多个函数,并且以某种方式将它们视为可迭代对象。不知何故,这条线正在使用函数 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']

*编辑 Martijn 回答了这个问题。这段代码做同样的事情,但将它从 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']

【问题讨论】:

    标签: python python-3.x functional-programming map-function


    【解决方案1】:

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

    (add, square, str)
    

    这是一个元组,元组是可迭代的。 inside 是什么并不重要,在 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,因此 123 等。所以您看到的实际输出是反复使用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']

    【讨论】:

    • 我希望这本书能解释清楚。现在说得通了。了解函数实际上只是可迭代(元组)中的对象后,我对其进行了修改,并且效果也很好。
    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 2015-02-21
    • 1970-01-01
    • 2019-06-09
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多