Python 我可以编写lambda函数来引发异常吗?

Python 我可以编写lambda函数来引发异常吗?,python,lambda,Python,Lambda,假设我有以下python列表: my_list = [1, 2,'X', 'Y', 0] 假设我想将此列表的值复制到一个新列表中,如下所示: 如果是0-9之间的数字,请将该值复制到新列表中 如果是“X”,则将None复制到新列表中 否则会引起一个例外 我可以用如下所示的lambda函数来实现吗?如果是,怎么做 new_list = map(lambda(x): something-here-but-what??, my_list) 为什么不写一个函数来做你想做的事情,然后把它放到lambda

假设我有以下python列表:

my_list = [1, 2,'X', 'Y', 0]
假设我想将此列表的值复制到一个新列表中,如下所示:

  • 如果是0-9之间的数字,请将该值复制到新列表中
  • 如果是“X”,则将
    None
    复制到新列表中
  • 否则会引起一个例外
  • 我可以用如下所示的lambda函数来实现吗?如果是,怎么做

    new_list = map(lambda(x): something-here-but-what??, my_list)
    

    为什么不写一个函数来做你想做的事情,然后把它放到lambda中呢?我看不出有什么理由尝试为应该不止一行的内容制作一个复杂的单行线

    my_list = [1, 2,'X', 'Y', 0]
    
    def replace(x):
        if x == 'X':
            return None
        elif type(x) == int and x <= 9 and x >= 0:
            return x
        else:
            raise ValueError('Bad value')
    
    new_list = map(lambda(x): replace(x), my_list[:-2]) # Returns [1, 2, None]
    new_list = map(lambda(x): replace(x), my_list) # Raises exception
    
    my_list=[1,2,X,Y,0]
    def更换(x):
    如果x=='x':
    一无所获
    elif类型(x)=int和x=0:
    返回x
    其他:
    提升值错误(“错误值”)
    new_list=map(lambda(x):replace(x),my_list[:-2])#返回[1,2,None]
    new_list=map(lambda(x):replace(x),my_list)#引发异常
    
    为什么不编写一个满足您需要的函数并将其放入lambda中呢?我看不出有什么理由尝试为应该不止一行的内容制作一个复杂的单行线

    my_list = [1, 2,'X', 'Y', 0]
    
    def replace(x):
        if x == 'X':
            return None
        elif type(x) == int and x <= 9 and x >= 0:
            return x
        else:
            raise ValueError('Bad value')
    
    new_list = map(lambda(x): replace(x), my_list[:-2]) # Returns [1, 2, None]
    new_list = map(lambda(x): replace(x), my_list) # Raises exception
    
    my_list=[1,2,X,Y,0]
    def更换(x):
    如果x=='x':
    一无所获
    elif类型(x)=int和x=0:
    返回x
    其他:
    提升值错误(“错误值”)
    new_list=map(lambda(x):replace(x),my_list[:-2])#返回[1,2,None]
    new_list=map(lambda(x):replace(x),my_list)#引发异常
    
    来支持布伦登(非常正确)的答案

    你可以用Python三元表达式做一些奇怪的事情。。。但结果是无法忍受的。考虑部分解决方案:

    >>> new_list = map(lambda x: x if isinstance(x, int) and (0 <= x and x <= 9) else ValueError('Bad things happened'), [1, 2, 3, "blah"])
    >>> list(new_list)
    [1, 2, 3, ValueError('Bad things happened',)]
    
    为了支持布伦登(非常正确)的答案

    你可以用Python三元表达式做一些奇怪的事情。。。但结果是无法忍受的。考虑部分解决方案:

    >>> new_list = map(lambda x: x if isinstance(x, int) and (0 <= x and x <= 9) else ValueError('Bad things happened'), [1, 2, 3, "blah"])
    >>> list(new_list)
    [1, 2, 3, ValueError('Bad things happened',)]
    

    若要引发异常,必须使用“try”和“except”语句,并且lambda表达式中不允许使用这些语句。在Lambda表达式中,只能使用表达式,因此不能在Lambda函数中引发异常。

    要引发异常,必须使用“try”和“except”语句,并且Lambda表达式中不允许使用语句。在Lambda表达式中,只能有表达式,因此不能在Lambda函数中引发异常。

    使用条件表达式

    a = list(map(lambda n: n if n in (0,1,2,3,4,5,6,7,8,9) else (None if n == 'X' else 1/0), my_list))
    
    可引发的其他异常:
    在条件表达式中,将
    1/0
    替换为

    {}[n]                                       #KeyError
    x                                           #NameError 
    (_ for _ in ()).throw(Exception('Foo')))    #any kind of exception you want
    int('x')                                    #ValueError
    

    使用条件表达式

    a = list(map(lambda n: n if n in (0,1,2,3,4,5,6,7,8,9) else (None if n == 'X' else 1/0), my_list))
    
    可引发的其他异常:
    在条件表达式中,将
    1/0
    替换为

    {}[n]                                       #KeyError
    x                                           #NameError 
    (_ for _ in ()).throw(Exception('Foo')))    #any kind of exception you want
    int('x')                                    #ValueError
    

    你试过了吗?这行得通吗?没有。显然这里的短语
    有些东西,但什么???
    永远不会行得通。也许是因为其中的一些想法很复杂,我认为这是一个有效的问题,但这可能是人们对它投反对票的原因。你试过了吗?它有用吗?没有。显然这里的短语
    有些东西,但什么东西???
    永远不会有用。可能是因为一个复杂的问题,我认为这是一个有效的问题,但它相当不和谐,这可能就是人们为什么不赞成它的原因。我喜欢简短漂亮的代码。我试图阻止编写一个单独的函数。但我想我必须这么做。我也喜欢简短、漂亮的代码。但在这种情况下,它将是简短、丑陋的代码;-)我认为有三个条件要求它有自己的功能。我发现lambda更适用于动态创建自定义函数,您以后可能会使用它(
    x=lambda…
    ),而不仅仅是因为您不想命名函数。另外,看看@wwii给出的链接,让lambda按照您最初的意图抛出一个表达式真的很难看。我喜欢简短漂亮的代码。我试图阻止编写一个单独的函数。但我想我必须这么做。我也喜欢简短、漂亮的代码。但在这种情况下,它将是简短、丑陋的代码;-)我认为有三个条件要求它有自己的功能。我发现lambda更适用于动态创建自定义函数,您以后可能会使用它(
    x=lambda…
    ),而不仅仅是因为您不想命名函数。另外,看看@wwii给出的链接,让一个lambda以你最初想要的方式抛出一个表达式真的很难看。不,你可以在任何地方
    raise
    ——如果你不编写自己的
    try。。除了
    。有时,使程序崩溃是正确的做法,因此需要进行构建。(事实上,作为一名主要的Erlang程序员,我倾向于认为破坏程序几乎总是正确的做法,但那是一个完全不同的世界……)不,你可以在任何地方提高,如果你不自己编写
    尝试,就不太可能被任何东西抓住。。除了
    。有时,使程序崩溃是正确的做法,因此需要进行构建。(事实上,作为一名主要的Erlang程序员,我倾向于认为破坏程序几乎总是正确的做法,但那是一个完全不同的世界…)引用@zxq9-
    yuk
    !引用@zxq9-
    yuk