使用map和lambda函数发送两个参数并返回两个值

时间:2016-01-28 14:54:39

标签: python caffe pycaffe

我想在函数中发送两个参数并接收两个值

我想修改这段代码,以便我能够发送两个参数并接收两个

list_value = [ 1, 2,0,-1,-9,2,3,5,4,6,7,8,9,0,1,50]
hnd = map(lambda (valua): function_f(valua), list_value)

function_f是一个函数返回1或0的数字。

上面的代码可以在发送一个参数时完成工作,但我想发送两个而不是。 所需函数的第一个参数是list_value,第二个参数是模型“使用caffe的网络模型训练”

所以我想编写一个函数,它可以完成前一个函数的相同工作,但是返回两个参数,一个是[0或1],另一个是修改过的模型,该函数已修改过。

2 个答案:

答案 0 :(得分:5)

由于您说您只需要一个模型,而不是每个值的新模型,因此这非常简单。变化:

hnd = map(lambda (valua): function_f(valua), list_value)

为:

model = ... initialize a model that will be passed to every call ...
hnd = map(lambda valua: function_f(valua, model), list_value)

确保function_f同时返回新值和模型,例如如果它以前做过:

def function_f(val, model):
    ... calculate newval and make newmodel ...
    return newval

只需将其更改为:

def function_f(val, model):
    ... calculate newval and make newmodel ...
    return newval, newmodel

注意:如果需要使用lambda来使用map,请不要使用map;它没有任何收获(在大多数情况下,生成器表达式或列表理解将以相同的速度运行甚至更快,其中映射函数不是内置的CPython)。也就是说,在您的特定情况下,您不需要lambda,例如,您可以这样做:

from future_builtins import map  # Only on Py2; Py3 map is good

from itertools import repeat

model = ... initialize a model that will be passed to every call ...
hnd = map(function_f, list_value, repeat(model))

或者只是使用生成器表达式(除非该函数是用C实现的Python内置函数,map基本上永远不会获得性能;如果你不想考虑是否{{1} }是合适的,总是使用list comprehensions / generator expresssions而不是map是个好主意):

map

答案 1 :(得分:1)

通过使用zip,您可以使用具有此类功能的地图。我提供了一个示例代码,因为您要求演示

ls1 = [1,2,3,4,5]
ls2 = [1,2,3,4,5]
>>> def func(x,y):
    return x+1,y+1

>>> map(lambda (v1, v2): func(v1, v2), zip(ls1, ls2))
[(2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]