至于random.choice
,我的map(Fn, Iterable)
正在崩溃:
Fn()
但是,如果我想在def Fn(x, k):
return x+k
中使用Fn()
,则代码无法理解:
map()
这意味着如果我想使用参数map(Fn(Iterable, k), Iterable)
该怎么办? THX!
答案 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]