功能的高阶(地图)

时间:2018-09-25 03:54:33

标签: python python-3.x higher-order-functions map-function

在Python中,map使我有些困惑。 map的函数接受2个参数:`map(function,variables)。

为什么下面的代码可以将multiplyadd当作变量,而第二个代码却不能呢?在通常情况下,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))

1 个答案:

答案 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 = 2multiply(2), add(2),依此类推。

由于输入错误,第二个代码不起作用。 (x)只是x,但是(x,)是一个单元素元组,其第一个元素是xmap 需要第二个参数是可迭代的,因此传递函数不会这样做。如果要映射到单个函数,则需要提供一个具有以下元素的可迭代对象: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)