我可以写一个lambda函数来引发异常吗?

时间:2017-10-14 05:05:52

标签: python lambda

假设我有以下python列表:

my_list = [1, 2,'X', 'Y', 0]

假设我想将此列表的值复制到新列表中,如下所示:

  1. 如果是0-9之间的数字,请将该值复制到新列表中
  2. 如果是'X',请将None复制到新列表中
  3. 否则提出例外
  4. 我可以使用lambda函数执行此操作,如下所示吗?如果是这样,怎么样?

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

4 个答案:

答案 0 :(得分:1)

为什么不写一个能做你想做的事的函数并把它放在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

答案 1 :(得分:1)

支持Brenden(非常正确)回答...

你实际上可以用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',)]

不仅可怕而且可能会混淆大多数Pythonistas(不仅仅是使用不寻常的结构,而是为什么你会使用这种结构吗?),我不知道什么在没有重新定义list()工作方式的情况下,实际上提出异常。 (raise仅在独立时才有效。)

所以现在我们有一个令人困惑的lambda,它有条件地允许成员进入新的地图构造或包含ValueError对象。育。

更好地将这个整个想法抽象出一个功能,这个功能以一种非常简单的方式完成你想要的功能 - 并且让#34;漂亮的代码成​​为其中的一部分。人们将来通常需要阅读的内容如下:

new_list = valid_list_to_map(your_list)

答案 2 :(得分:1)

使用条件表达式。

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>替换1/0

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

答案 3 :(得分:0)

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

相关问题