在 Python 3 map() 中使用多个函数
Using multiple functions in Python 3 map()
我不确定下面的代码为何有效。根据文档,map 仅将一个函数作为第一个参数并将其应用于一个或多个可迭代对象,具体取决于函数采用的参数数量。
map(function, iterable..)
但是,您可以传递多个函数来代替可迭代对象,并且它们会以某种方式被视为可迭代对象。这条线以某种方式采用函数 add、square 和 str 并将它们视为可迭代对象。
如何将函数视为有效的可迭代对象?
def add(x):
return x + x
def square(x):
return x * x
nums = [1, 2, 3, 4, 5]
for i in nums:
vals = list(map(lambda x: x(i), (add, square, str)))
print(vals)
returns:
[2, 1, '1']
[4, 4, '2']
[6, 9, '3']
[8, 16, '4']
[10, 25, '5']
*编辑
马丁回答了这个问题。此代码执行相同的操作,但将其从 lambda 函数中分离出来,显示 add, square, str
是如何迭代函数的。
def add(x):
return x + x
def square(x):
return x * x
def act_on_iter(iter_obj, i):
return iter_obj(i)
nums = [1, 2, 3, 4, 5]
for i in nums:
vals = list(map(act_on_iter, (add, square, str), [i] * 3))
print(vals)
returns一样
[2, 1, '1']
[4, 4, '2']
[6, 9, '3']
[8, 16, '4']
[10, 25, '5']
您正在传递一个 可调用对象的可迭代对象:
(add, square, str)
那是一个元组,而且元组是可迭代的。 inside 可迭代对象是什么并不重要,在 Python 中,函数是 first-class 对象,就像字符串和整数以及 class es和实例。您可以传递函数,包括将它们存储在元组中。
然后你有一个 lambda
可调用:
lambda x: x(i)
它获取可迭代对象中的每个项目,并将它们也视为可调用对象。 x
设置为 add
,然后设置为 square
,然后设置为 str
,lambda
调用每个传入 i
。同样,函数只是另一种类型的对象,您可以将一个函数作为参数值传递给另一个函数,这里接收函数对象的参数被命名为 x
。表达式 x(i)
然后调用分配给 x
.
的任何内容
如果将 lambda
替换为 print
(没有 ()
括号,我们引用的是函数对象),那么您会看到:
>>> list(map(print, (add, square, str)))
<function add at 0x11645a670>
<function square at 0x11645a790>
<class 'str'>
[None, None, None]
[None, None, None]
列表是调用 print()
三次的结果,该函数总是 returns None
。有趣的部分是 [None, None, None]
之前的输出,这些是 (add, square, str)
元组中三个函数中每一个的字符串表示形式。
在您的示例代码中,您在 nums
上有一个 for
循环,将每个值分配给 i
,因此 1
、2
、3
,等等。所以你看到的实际输出是通过重复使用 map()
产生的,因为 i
变化:
i = 1
, -> [add(1), square(1), str(1)]
-> [2, 1, '1']
i = 2
, -> [add(2), square(2), str(2)]
-> [4, 4, '2']
i = 3
, -> [add(3), square(3), str(3)]
-> [6, 9, '3']
i = 4
, -> [add(4), square(4), str(4)]
-> [8, 16, '4']
i = 5
, -> [add(5), square(5), str(5)]
-> [10, 25, '5']
我不确定下面的代码为何有效。根据文档,map 仅将一个函数作为第一个参数并将其应用于一个或多个可迭代对象,具体取决于函数采用的参数数量。
map(function, iterable..)
但是,您可以传递多个函数来代替可迭代对象,并且它们会以某种方式被视为可迭代对象。这条线以某种方式采用函数 add、square 和 str 并将它们视为可迭代对象。
如何将函数视为有效的可迭代对象?
def add(x):
return x + x
def square(x):
return x * x
nums = [1, 2, 3, 4, 5]
for i in nums:
vals = list(map(lambda x: x(i), (add, square, str)))
print(vals)
returns:
[2, 1, '1']
[4, 4, '2']
[6, 9, '3']
[8, 16, '4']
[10, 25, '5']
*编辑
马丁回答了这个问题。此代码执行相同的操作,但将其从 lambda 函数中分离出来,显示 add, square, str
是如何迭代函数的。
def add(x):
return x + x
def square(x):
return x * x
def act_on_iter(iter_obj, i):
return iter_obj(i)
nums = [1, 2, 3, 4, 5]
for i in nums:
vals = list(map(act_on_iter, (add, square, str), [i] * 3))
print(vals)
returns一样
[2, 1, '1']
[4, 4, '2']
[6, 9, '3']
[8, 16, '4']
[10, 25, '5']
您正在传递一个 可调用对象的可迭代对象:
(add, square, str)
那是一个元组,而且元组是可迭代的。 inside 可迭代对象是什么并不重要,在 Python 中,函数是 first-class 对象,就像字符串和整数以及 class es和实例。您可以传递函数,包括将它们存储在元组中。
然后你有一个 lambda
可调用:
lambda x: x(i)
它获取可迭代对象中的每个项目,并将它们也视为可调用对象。 x
设置为 add
,然后设置为 square
,然后设置为 str
,lambda
调用每个传入 i
。同样,函数只是另一种类型的对象,您可以将一个函数作为参数值传递给另一个函数,这里接收函数对象的参数被命名为 x
。表达式 x(i)
然后调用分配给 x
.
如果将 lambda
替换为 print
(没有 ()
括号,我们引用的是函数对象),那么您会看到:
>>> list(map(print, (add, square, str)))
<function add at 0x11645a670>
<function square at 0x11645a790>
<class 'str'>
[None, None, None]
[None, None, None]
列表是调用 print()
三次的结果,该函数总是 returns None
。有趣的部分是 [None, None, None]
之前的输出,这些是 (add, square, str)
元组中三个函数中每一个的字符串表示形式。
在您的示例代码中,您在 nums
上有一个 for
循环,将每个值分配给 i
,因此 1
、2
、3
,等等。所以你看到的实际输出是通过重复使用 map()
产生的,因为 i
变化:
i = 1
, ->[add(1), square(1), str(1)]
->[2, 1, '1']
i = 2
, ->[add(2), square(2), str(2)]
->[4, 4, '2']
i = 3
, ->[add(3), square(3), str(3)]
->[6, 9, '3']
i = 4
, ->[add(4), square(4), str(4)]
->[8, 16, '4']
i = 5
, ->[add(5), square(5), str(5)]
->[10, 25, '5']