Python 高阶函数(Map)
我对python中的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),
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(即函数)