Python 高阶函数(Map)

Python 高阶函数(Map),python,python-3.x,higher-order-functions,map-function,Python,Python 3.x,Higher Order Functions,Map Function,我对python中的map有点困惑。map的函数接受两个参数:`map(函数,变量) 为什么下面的代码能够将乘法和相加作为变量,但第二个代码不能?在通常情况下,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),

我对python中的
map
有点困惑。
map
的函数接受两个参数:`map(函数,变量)

为什么下面的代码能够将
乘法
相加
作为变量,但第二个代码不能?在通常情况下,
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
时,映射将执行
乘法(1),加法(1)
。当
i=2
时,它是
乘(2),加(2)
,依此类推

由于输入错误,第二个代码无法工作
(x)
只是
x
,但是
(x,)
是一个单元素元组,其第一个元素是
x
map
要求第二个参数是iterable,因此传入函数是不行的。如果要映射到单个函数,则需要提供一个包含一个元素的iterable:
multi\u func=(multiply,)

一旦纠正,第二个版本将在
i=1
时打印
multiply(1)
,在
i=2
时打印
multiply(2)
,等等

类似于
list(map(multiply,range(1,5)))
的东西实际上是编写第二个版本的更简单的方法。您还可以使用
zip
,对第一个代码执行类似的操作:

zip(map(func, range(1, 5)) for func in funcs)

试试
multi_func=(乘法)
它可以工作!但为什么它不在映射参数的左侧,因为它是一个函数?我想是因为它作为元组接收?但我仍然对它如何能够交换位置感到震惊。(当我看到使用range方法时)map接受一个callable和一个iterable参数。你给它的可调用函数,
lambda x:x(i)
只是调用它的参数,你试图给它的iterable是一个可调用函数的iterable(即函数)