簡體   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