[英]Higher Order of Function (Map)
我对python中的map
有点困惑。 map
的函数接受2个参数:`map(函数,变量)。
为什么下面的代码能够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))
map
将第一个参数(一个函数)应用于iterable的每个元素,即第二个参数。 该功能懒洋洋地应用。 这意味着只有在迭代地图对象时才会完成它,例如,当您创建它的列表时。
我们来看看你的第一个代码吧。 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
要求第二个参数是可迭代的,所以传入一个函数是行不通的。 如果要映射到单个函数,则需要提供具有一个元素的iterable: 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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.