在Python中,map
使我有些困惑。 map
的函数接受2个参数:`map(function,variables)。
为什么下面的代码可以将multiply
和add
当作变量,而第二个代码却不能呢?在通常情况下,multiply
应该作为函数传入,请检查范围。
def multiply(x):
return x * x
def add(x):
return x + x
funcs = [multiply, add]
for i in range (1, 5):
value = list(map(lambda x: x(i), funcs))
print(value)
这是第二个代码:
def multiply(x):
return x * x
def add(x):
return x + x
funcs = (add, multiply)
multi_func = (multiply)
for i in range (1, 5):
value = list(map(lambda x: x(i), multi_func))
print(value)
是否可以使用1个功能并且仍在范围内使用?
使用范围:
map(multiply, range(1, 5))
答案 0 :(得分:3)
map
将其第一个参数(即函数)应用于可迭代的每个元素(即第二个参数)。该功能是延迟应用的。这意味着只有在您遍历地图对象时(例如,在创建它的列表时),它才会完成。
让我们看一下您的第一个代码。 funcs = [multiply, add]
创建一个可迭代的两个元素的列表。这两个元素都是功能。这在Python中很正常,因为函数只是常规对象,并且可以传递,分配,具有属性等。循环
for i in range (1, 5):
value = list(map(lambda x: x(i), funcs))
print(value)
重复形式1到4。在每次迭代中,它将lambda x: x(i)
映射到funcs
中的函数。当i = 1
时,地图最终完成multiply(1), add(1)
。 i = 2
是multiply(2), add(2)
,依此类推。
由于输入错误,第二个代码不起作用。 (x)
只是x
,但是(x,)
是一个单元素元组,其第一个元素是x
。 map
需要第二个参数是可迭代的,因此传递函数不会这样做。如果要映射到单个函数,则需要提供一个具有以下元素的可迭代对象:multi_func = (multiply,)
。
更正后,第二版将在multiply(1)
时打印i = 1
,在multiply(2)
时打印i = 2
,等等。
类似list(map(multiply, range(1, 5)))
这样的东西实际上将是编写第二个版本的更容易的方法。您还可以使用zip
对第一个代码执行类似的操作:
zip(map(func, range(1, 5)) for func in funcs)