2017-09-03 22 views
0

我試圖複製C++式單線條件語句在Python像這樣:單行條件句

我有一個函數定義:isPalidrome (mystr) - 返回True如果mystr是palidrome,False否則。該功能起作用。

現在我有一個簡單的主要功能如下所示:

mystr ='' 
isitapalindromealready = lambda : if isPalindrome(mystr) ==True: return "" else return 'not' 
while mystr != 'quit': 
    mystr = input("enter a string: ") 
    print ('{} is {} a palindrome'.format(mystr, isitapalindromealready()) 

,但我得到一個語法錯誤 -

File "scratch1.py", line 45 
    isitapalindromealready = lambda : if isPalindrome(mystr) ==True: return "" else return 'not' 
            ^
SyntaxError: invalid syntax 

我做了檢查非常接近複製我上面的邏輯類似的線程(它只是不會將lambda作爲函數的任何地方)。

Conditional statement in a one line lambda function in python?

但是,沒有一個答案解釋了爲什麼這是一個語法錯誤。如果忽略PEP 8,則語法有效,除非您不能在與if相同的行中包含else

任何幫助,選項,替代考慮? 順便說一句:我寫了這個簡單的程序來檢查此功能,以減少更大的模塊的邏輯大小。我非常清楚,如果在isPalindrome函數中檢查其迴文是否可以脫身。那不是我的問題的重點。

+1

@DYZ:請注意,您的上一次編輯使發佈的錯誤消息無效,所以我將其回滾。 –

+0

[Python是否有三元條件運算符?](https://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator) –

回答

3

你可以將你的條件放在一行上,當然。這是你如何在Python中做到這一點。

isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 

當然,你可以讓lambda使用全局變量,但這不是我推薦的做法。一個寫得很好的lambda應該是一個純函數,這意味着你可以將參數傳遞給它。此外,暗示lambda不需要return。現在,你必須致電lambda作爲這樣的:

isitapalindromealready(mystr) 

isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 
while mystr != 'quit': 
    mystr = input("enter a string: ") 
    print ('{} is {} a palindrome'.format(mystr, isitapalindromealready(mystr)) 
-1

我希望他的解釋幫助你。從doc

lambda_expr :: =「拉姆達」 [parameter_list]:表達

lambda_expr_nocond :: =「拉姆達」 [parameter_list]:expression_nocond

Lambda表達式(有時稱爲拉姆達形式)用於創建 匿名函數。表達式lambda參數:表達式 產生一個函數對象。該不願透露姓名的對象表現如同定義的函數 對象:

DEF(參數): 返回表達式

所以,你必須將表達式傳遞給拉姆達。 A Conditional expressions(使用if/else關鍵字)是一個有效的表達式。你不能只傳遞一個if/else句子。一個有效的代碼可能是:

isitapalindromealready = lambda x: "" if isPalindrome(x) else "not" 
+0

感謝它的工作 - 我犯的錯誤 - 是1)用C++來思考 - 我在想lambda是一個#defines而不是它們自己的函數表達式2)忘記if的特殊形式 - 「」if ... 3)在if語句中包含分號:)。 – ssscld

+0

@ssscld很高興能夠提供幫助。 –