在 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
我正在使用 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