使用lambda使用* args映射函数

时间:2015-12-18 19:29:59

标签: python lambda mapping

好的,这个令人困惑。我的旧代码有点像

map(lambda x:x.func1(arg1), other_args_to_be_mapped)

现在我想制作arg1 - > *args

other_args_to_be_mapped保持不变。

func1中,参数的长度将被检查不同的操作。我的问题是

1)将检查哪个长度? arg1other_args_to_be_mapped

2)在func1中,我该如何设置默认值?就像

def func1(arg1=something)

但现在有了多个参数,我不知道如何处理初始化。我希望能够做类似

的事情
def func1(args*=something, something_else)

这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您正在寻找variable arguments。如果您遵守逻辑顺序(首先是固定参数,然后是关键字参数或变量参数),这些可以与固定参数混合使用。

例如,下面显示了如何映射到接受一个常量参数和一个变量参数的函数。如果您想要不同的行为,请提供您要完成的具体示例

import random

class Foo:

    def get_variable_parameters(self):
        return [1] if random.random() > .5 else [1,2]

    def foo( self, arg, *args ):

        print("Doing stuff with constant arg", arg)

        if len(args) == 1:
            print("Good",args)
        else:
            print("Bad",args)

list(map( lambda x : x.foo( 'Static Argument', *x.get_variable_parameters()), [Foo(),Foo(),Foo()] ))

我们不知道将有多少参数传递给foo(在这个简单的情况下,它是一两个),但是" *&#34 ;符号接受任何数量的对象传递

注意我已在map中封装list以便对其进行评估,因为在python3中它是一个生成器。 List comprehension在python中可能更惯用。也不要忘记你总是可以使用一个简单的for循环 - 混淆或复杂的map调用远不如一个明确的(但是几行)for循环,imo。

如果您尝试在地图调用中组合多个参数,我建议使用与zip函数相同的变量参数策略,例如,

def foo(a,*b): ...
map(lambda x : foo(x[0],*x[1]), zip(['a','b'],[ [1], [1,2] ]))

在这种情况下,foo将首先调用foo('a',1),然后调用foo('b',2,3)