在 Python 中映射多个参数,包括一个具有默认值的参数

map in Python with multiple arguments, including one with a default value

我正在使用 Python3.6 并试图找出我们可以使用带有多个参数的 map 的方法。

当我运行、

def multiply(x, y, z):
    return x * y * z

products = map(multiply, [3,6], [1,8], [3,5])

list(products) returns [9, 240] 符合预期

但是,当我为 z 指定默认值时,

def multiply(x, y, z = [3,5]):
    return x * y * z

products = map(multiply, [3,6], [1,8])

list(product) returns

[[3, 5, 3, 5, 3, 5],
 [3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5,
  3,
  5]]

为什么 Python 在两种情况下 运行 和 map 的方式不同?

尝试:

l=iter([3,5])
def multiply(x, y, z = l):
    return x * y * next(z)

products = map(multiply, [3,6], [1,8])

那么 list(products) 将是:[9, 240]

解释:

您的代码不起作用,因为您将一个数字与一个列表相乘(因此基本上它将是一个重复 n 次的列表),您需要始终获取下一个值,next到列表

iter

参见:Python: next() function

当您在使用 map 执行期间设置 z 的默认值时,会发生这种情况:

3 * 1 * [3,5]
6 * 8 * [3,5]

因此您的输出,为了使 map 按您的预期工作,您应该明确地将列表作为它的参数之一,并且在您的情况下,z 的默认值不是 map 的直接参数。希望这是有道理的。

我觉得应该用reduce而不是map。用reduce应该是

import functools
expected=functools.reduce(lambda acc,current:[acc[0]*current[0],acc[1]*current[1]],([3,6], [1,8], [3,5]))
print(expected) # [9, 240]

根据这个 doc.reduce 大致等同于:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value