map(function, arguments)
相当于
for argument in arguments:
function(argument)
是否可以使用地图功能来执行以下操作?
for arg, kwargs in arguments:
function(arg, **kwargs)
map(function, arguments)
相当于
for argument in arguments:
function(argument)
是否可以使用地图功能来执行以下操作?
for arg, kwargs in arguments:
function(arg, **kwargs)
您可以与拉姆达:
map(lambda a: function(a[0], **a[1]), arguments)
,或者你可以用生成器表达式或列表的理解,这取决于你想要什么:
(function(a, **k) for a, k in arguments)
[function(a, **k) for a, k in arguments]
在Python 2,map()
返回一个列表(所以列表理解是等效的),在Python 3中,map()
是一个生成器(因此生成器表达式可以替代它)。
没有直接执行此操作的内置或标准库方法;用例过于专业化。
你只需要记住,map将参数作为一个元组传递给函数,而不是单独的参数。如果你不能改变你原有的功能,你可以用一个辅助函数调用它:
def f(tup):
args, kwargs = tup
function(args, **kwargs)
map(f, arguments)
对于只有位置参数的情况下,你可以使用itertools.starmap(fun, args)
:
返回一个迭代器,其值从使用从给定序列中获取的参数元组进行评估的函数返回。
例子:
from itertools import starmap
def f(i, arg):
print(arg * (i+1))
for _ in starmap(f, enumerate(["a", "b", "c"])):
pass
打印:
a
bb
ccc
我一直运行到相同的需求,并最终作出了以下功能:
def kwarg_map(element_constructor, **kwarg_lists):
"""
A helper function for when you want to construct a chain of objects with individual arguments for each one. Can
be easier to read than a list expansion.
:param element_constructor: A function of the form object = fcn(**kwargs)
:param kwarg_lists: A dict of lists, where the index identifies two which element its corresponding value will go.
:return: A list of objects.
e.g. Initializing a chain of layers:
layer_sizes = [784, 240, 240, 10]
layers = kwarg_map(
Layer,
n_in = layer_sizes[:-1],
n_out = layer_sizes[1:],
activation = ['tanh', 'tanh', 'softmax'],
)
is equivalent to:
layers = [Layer(n_in=784, n_out=240, activation='tanh'), Layer(n_in=240, n_out=240, activation='tanh'), Layer(n_in=240, n_out=10, activation='softmax')]
"""
all_lens = [len(v) for v in kwarg_lists.values()]
assert len(kwarg_lists)>0, "You need to specify at least list of arguments (otherwise you don't need this function)"
n_elements = all_lens[0]
assert all(n_elements == le for le in all_lens), 'Inconsistent lengths: %s' % (all_lens,)
return [element_constructor(**{k: v[i] for k, v in kwarg_lists.iteritems()}) for i in xrange(n_elements)]
这两件事情都没有当量。 'map()'建立函数调用返回值的列表(或3.x,一个生成器)。如果你不想使用这些值,不要使用'map()',只需使用正常的循环。 –
map是一个函数(返回一个列表),循环是没有返回值的代码。它们不相同。 –