2017-09-03 13 views
0

isPalidrome (mystr)を - mystrはそうpalidrome、Falseある場合Trueを返します。この関数は機能します。1行の条件文(C++スタイル)

今、私はそうのような単純な主な機能があります。

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 

私は上記の私のロジックを複製すると非常に接近して同様のスレッドを確認しました(ちょうどどこでも関数としてラムダを呼び出さない)。

Conditional statement in a one line lambda function in python?

しかし、答えのいずれもが、それは構文エラーである理由を説明しません。 PEP 8を無視すると、ifと同じ行にelseを含めることができない限り、構文は有効です。

ヘルプ、オプション、代替の検討事項はありますか? BTW:私は、この単純なプログラムを書いて、はるかに大きなモジュールのロジックサイズを減らすためにこの機能をチェックしました。 isPalindromeの中の回文が機能しているかどうかを調べることができます。それは私の質問のポイントではない。

+1

@DYZ:以前の編集で投稿されたエラーメッセージが無効になったので、ロールバックしました。 –

+0

[Pythonには三項条件演算子がありますか?](https://stackoverflow.com/questions/394809/does-python-have-a-ternary-conditional-operator) –

答えて

3

あなたの条件を1行に確実に収めることができます。これがあなたがPythonでやる方法です。

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

確かに、lambdaはグローバル変数で動作させることができますが、それは私がそれを行うことを推奨する方法ではありません。うまく書かれたラムダは純粋な関数でなければなりません。つまり、パラメータを渡します。さらに、lambdaは暗黙のうちにreturnを必要としません。さて、次のようなあなたのラムダを呼び出す必要があります:

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 arguments:式 は、関数オブジェクトを生成します。無名のオブジェクトがで定義された関数 オブジェクトのように振舞う:

デフ(引数): return式

だから、あなたは、ラムダに式を渡す必要があります。 Conditional expressions(if/elseキーワードを使用)は有効な式です。 if/else文だけを渡すことはできません。有効なコードは次のようになります。

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

ありがとうございました - 1)C++の考え方 - 私はラムダを自分の関数式ではなく#defineと考えていました2)if - if "if ..."の特殊な形式を忘れてしまった3)if文にセミコロンが含まれていました:) – ssscld

+0

@ssscld喜んで助けてください。 –