繁体   English   中英

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

[英]Can I write a lambda function to raise an exception?

假设我有以下python列表:

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

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

  1. 如果它是介于0到9之间的数字,则将该值复制到新列表中
  2. El如果是“ X”,则将“ None ”复制到新列表中
  3. 否则引发例外

我可以使用如下所示的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

要备份布伦登(相当正确)的答案...

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

这不仅令人恐惧,而且可能会使大多数Pythonista迷惑(不仅是使用不寻常的构造,还为什么要使用这种构造?),我还不知道该如何在不重新定义的情况下实际引发异常呢? list()工作方式。 raise当独自站在只有作品。)

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

更好地将整个想法抽象成一个功能,该功能以一种非常简单的方式准确地实现了您想要的功能,并且让“美丽的代码部分”成为人们将来通常需要阅读的,类似于:

new_list = valid_list_to_map(your_list)

使用条件表达式。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM