假設我有以下Python列表:我可以寫一個lambda函數來引發異常嗎?
my_list = [1, 2,'X', 'Y', 0]
假設我想這個名單的值複製到一個新的列表如下:
- 如果是0-9之間的一個數字,複製該值到新的列表
- 艾利芙它是「X」,複製
None
到新名單 - 否則拋出一個異常
我可以如下所示使用lambda函數嗎?如果是這樣,怎麼樣?
new_list = map(lambda(x): something-here-but-what??, my_list)
假設我有以下Python列表:我可以寫一個lambda函數來引發異常嗎?
my_list = [1, 2,'X', 'Y', 0]
假設我想這個名單的值複製到一個新的列表如下:
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
我喜歡短漂亮的代碼。我試圖抵制寫一個單獨的功能。但我想我將不得不這樣做。 –
我也喜歡簡短漂亮的代碼。但在這種情況下,它會是短而醜陋的代碼;-)我認爲有三個條件調用它自己的函數。我發現lambda更適用於像以後可以使用的那樣創建自定義函數('x = lambda ...'),這不僅僅是因爲您不想命名函數。另外,查看@wwii給出的鏈接,實際上使得lambda拋出一個表達式就像你最初的意圖一樣真的很難看。 –
要備份布蘭登·的(完全正確)的答案...
實際上,你可以做與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)
要提高,你必須使用「嘗試」和「除外」語句和語句在lambda表達式允許例外。在Lambda表達式中,您只能擁有表達式,因此您無法在lambda函數中引發異常。
不,你可以在任何地方「舉起」 - 如果你不寫自己的「try .. except」,它就沒有太多的機會被任何東西抓住。有時候,程序崩潰是正確的事情,因此建設。 (其實,主要是一個Erlang程序員,我傾向於認爲崩潰程序幾乎總是正確的,但這是一個完全不同的世界......) – zxq9
使用條件表達式。
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
要引用@ zxq9 - 'yuk'! – wwii
你嘗試了嗎?它有用嗎? – wwii
不,很明顯,「這裏有些東西 - 但是 - 什麼」絕不會奏效。 –
也許有一個令人費解的[條件表達式](https://docs.python.org/3/reference/expressions。HTML#條件表達式)和一些想法 在[本SO問答](https://stackoverflow.com/questions/8294618/define-a-lambda-expression-that-raises-an-exception) – wwii