if
条件が失敗した場合にループを中断するはずのif-else式を使用しようとしていますが、invalid syntax
エラー。
サンプルコード:
a = 5
while True:
print(a) if a > 0 else break
a-=1
もちろん、私が従来の方法で書いた場合(ワンライナーを使用しない)、それは機能します。
break
キーワードの後にelse
コマンドを使用する際の問題を教えてください。
これを実行すると、次のエラーが発生します。
... print(a) if a > 0 else break
File "<stdin>", line 2
print(a) if a > 0 else break
^
SyntaxError: invalid syntax
それの訳は
print(a) if a > 5 else break
三項演算子です。三項演算子は_if
ステートメントではありません。これらは構文で機能します:
<expr1> if <expr2> else <expr3>
これは「仮想関数」と同等です。
def f():
if <expr2>:
return <expr1>
else:
return <expr3>
つまり、else
の次の部分は式でなければなりません。 break
は式ではなく、ステートメントです。だからPythonはそれを期待していません。あなたはreturn
a break
できません。
python-2.x では、print
も関数ではありませんでした。したがって、これはprint
ステートメントでエラーになります。 python-2.x でprint
がキーワードでした。
コードを次のように書き換えることができます。
a = 5
while True:
if a > 5:
print(a)
else:
break
a -= 1
この詳細については documentation および PEP-308 を参照してください。
If
は式、break
はreturn
と同様にステートメントです。 1つの文で2つのステートメントを使用することはできません(醜いセミコロンを使用する場合を除く)。 それができれば本当にすばらしいと思いますが、悲しいかな、そうです。
少し簡単に言えば、「1行のif
ステートメント」( 項演算子 )を誤用しています。これは常に式(つまり、値)として評価されます。あれは、
_<expr1> if <condition> else <expr2>
_
_<expr1>
_がTrue
の場合は_<condition>
_と評価され、_<expr2>
_がFalse
の場合は_<condition>
_と評価されます。この結果の値は、他のPython値のように使用できます。例:
_y = 0
x = (5 if (y > 0) else 6)
print(x) # 6
_
もちろん、括弧は完全に不必要です(推奨されていません)が、うまくいけば、その行の意味を理解するのに役立ちます。
したがって、
_print(a) if a > 0 else break
_
print(a)
を評価しようとします(これは、Python 3のprint()
の定義により、常にNone
を返します–完全に有効ですが、おそらく通常は望んでいないことです)そしてbreak
は statement( 式(値) ではないため、_invalid syntax
_エラーが発生します。
したがって、条件に応じて2つのステートメントのいずれかを実行する場合は、Willem Van Onsemによって提案された複数行のソリューションが本当に必要です。 1行でハックする方法があるかもしれませんが、Pythonでは、このようなものの通常の解決策は複数行です。