web-dev-qa-db-ja.com

Pythonで「if-else-break」が機能しないのはなぜですか?

if条件が失敗した場合にループを中断するはずのif-else式を使用しようとしていますが、invalid syntaxエラー。

サンプルコード:

a = 5
while True:
    print(a) if a > 0 else break
    a-=1

もちろん、私が従来の方法で書いた場合(ワンライナーを使用しない)、それは機能します。

breakキーワードの後に​​elseコマンドを使用する際の問題を教えてください。

7
Manish Goel

これを実行すると、次のエラーが発生します。

...     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.xprintがキーワードでした。

コードを次のように書き換えることができます。

a = 5
while True:
    if a > 5:
        print(a)
    else:
        break
    a -= 1

この詳細については documentation および PEP-308 を参照してください。

19

Ifは式、breakreturnと同様にステートメントです。 1つの文で2つのステートメントを使用することはできません(醜いセミコロンを使用する場合を除く)。 それができれば本当にすばらしいと思いますが、悲しいかな、そうです。

5
hspandher

少し簡単に言えば、「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を返します–完全に有効ですが、おそらく通常は望んでいないことです)そしてbreakstatement(値) ではないため、_invalid syntax_エラーが発生します。

したがって、条件に応じて2つのステートメントのいずれかを実行する場合は、Willem Van Onsemによって提案された複数行のソリューションが本当に必要です。 1行でハックする方法があるかもしれませんが、Pythonでは、このようなものの通常の解決策は複数行です。

1
orn688