2017-10-14 54 views
-1

假設我有以下Python列表:我可以寫一個lambda函數來引發異常嗎?

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

假設我想這個名單的值複製到一個新的列表如下:

  1. 如果是0-9之間的一個數字,複製該值到新的列表
  2. 艾利芙它是「X」,複製None到新名單
  3. 否則拋出一個異常

我可以如下所示使用lambda函數嗎?如果是這樣,怎麼樣?

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

你嘗試了嗎?它有用嗎? – wwii

+0

不,很明顯,「這裏有些東西 - 但是 - 什麼」絕不會奏效。 –

+0

也許有一個令人費解的[條件表達式](https://docs.python.org/3/reference/expressions。HTML#條件表達式)和一些想法 在[本SO問答](https://stackoverflow.com/questions/8294618/define-a-lambda-expression-that-raises-an-exception) – wwii

回答

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 
+0

我喜歡短漂亮的代碼。我試圖抵制寫一個單獨的功能。但我想我將不得不這樣做。 –

+1

我也喜歡簡短漂亮的代碼。但在這種情況下,它會是短而醜陋的代碼;-)我認爲有三個條件調用它自己的函數。我發現lambda更適用於像以後可以使用的那樣創建自定義函數('x = lambda ...'),這不僅僅是因爲您不想命名函數。另外,查看@wwii給出的鏈接,實際上使得lambda拋出一個表達式就像你最初的意圖一樣真的很難看。 –

0

要備份布蘭登·的(完全正確)的答案...

實際上,你可以做與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對象。育。

更好地將這個想法抽象到一個函數後面,這個函數以一種非常簡單的方式完全符合您的需求 - 並讓「美麗的代碼部分」成爲人們通常需要在將來閱讀的位那雲是這樣的:

new_list = valid_list_to_map(your_list) 
0

要提高,你必須使用「嘗試」和「除外」語句和語句在lambda表達式允許例外。在Lambda表達式中,您只能擁有表達式,因此您無法在lambda函數中引發異常。

+0

不,你可以在任何地方「舉起」 - 如果你不寫自己的「try .. except」,它就沒有太多的機會被任何東西抓住。有時候,程序崩潰是正確的事情,因此建設。 (其實,主要是一個Erlang程序員,我傾向於認爲崩潰程序幾乎總是正確的,但這是一個完全不同的世界......) – zxq9

0

使用條件表達式。

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 
+0

要引用@ zxq9 - 'yuk'! – wwii

相關問題