当我使用Python map(Fn,Iterable)时如何在Fn中传递多个参数?

时间:2016-06-30 03:55:13

标签: python dictionary

至于random.choice,我的map(Fn, Iterable)正在崩溃:

Fn()

但是,如果我想在def Fn(x, k): return x+k 中使用Fn(),则代码无法理解:

map()

这意味着如果我想使用参数map(Fn(Iterable, k), Iterable) 该怎么办? THX!

1 个答案:

答案 0 :(得分:0)

以下是一些可能性

def fn(x,k):
   return x+k 

In [1095]: k=10  # in global space

In [1096]: map(lambda x: fn(x,k), [1,2,3])
Out[1096]: <map at 0xb263e04c>   # ops, py3, need

In [1097]: list(map(lambda x: fn(x,k), [1,2,3]))
Out[1097]: [11, 12, 13]

我更喜欢列表推导来映射:

In [1100]: [(lambda x: fn(x,k))(x) for x in [1,2,3]]
Out[1100]: [11, 12, 13]

In [1101]: [fn(x,k) for x in [1,2,3]]
Out[1101]: [11, 12, 13]

或者如果x和k都来自iterables,我们可以用zip连接它们:

In [1102]: [fn(x,k) for x,k in zip([1,2,3],[10,20,30])]
Out[1102]: [11, 22, 33]

我打算建议functools.partial,但我不认为我可以使用第二个位置参数。我可以用它来部分定义第一个参数(在这种情况下无关紧要)。

In [1107]: from functools import partial

In [1111]: [partial(fn, 1)(k) for k in [10,20,30]]
Out[1111]: [11, 21, 31]

In [1112]: list(map(partial(fn, 1),[10,20,30]))
Out[1112]: [11, 21, 31]

如果我更改fn,那么k会成为关键字参数

def fn(x,k=0):
    return x+k

In [1114]: [partial(fn, k=10)(x) for x in [1,2,3]]
Out[1114]: [11, 12, 13]

同样适用于map

如果我定义fn所以它需要一个元组,我可以使用zip和map:

def fn(args):
   x,k=args
   return x+k

In [1117]: list(map(fn,zip([1,2,3],[10,20,30])))
Out[1117]: [11, 22, 33]