web-dev-qa-db-ja.com

Pythonでブール 'and'を使用する方法

C#では、次のように&&(ブール型)を使用できます。

int i = 5;
int ii = 10;
if(i == 5 && ii == 10) {
    Console.WriteLine("i is 5, and ii is 10");
}
Console.ReadKey(true);

しかし、Pythonでそれを試してください:

i = 5
ii = 10
if i == 5 && ii == 10:
    print "i is 5 and ii is 10";      

エラーが表示されます:SyntaxError: invalid syntax

単一の&を使用すると、少なくとも構文エラーは発生しません。 Pythonで&&ブール値を実行するにはどうすればよいですか?

41
Python

これを試して:

i = 5
ii = 10
if i == 5 and ii == 10:
      print "i is 5 and ii is 10"

編集:ああ、最後の行にセミコロンは必要ありません(編集してコードから削除します)。

67
Mizipzor

指摘したように、C#の場合と同様に、pythonの "&"はビット単位の演算を実行します。and&&演算子に相当します。

ブール値(i == 5Trueであり、ii == 10Trueでもある)を扱っているため、なぜこれが機能しないのか疑問に思うかもしれません(True整数量として扱われる場合でも、TrueおよびTrueはTrue値を意味する)、または例外をスローする(たとえば、ブール型のビットごとの操作を禁止する)

その理由は、演算子の優先順位です。 「and」演算子は==よりも緩やかにバインドするため、式「i==5 and ii==10」は「(i==5) and (ii==10)」と同等です。

ただし、ビット単位の&の優先順位は「==」よりも高くなっています(「a & 0xff == ch」のような式は「a & (0xff == ch)」を意味しないため)式は実際には次のように解釈されます。

if i == (5 & ii) == 10:

これは、Pythonの演算子チェーンを使用して意味しています:ii andedの5の値はiと10の両方に等しくなります。明らかにこれは決して真実ではありません。

優先順位を強制する括弧を含めた場合、実際には(一見)正しい答えが得られます。

if (i==5) & (ii=10)

ステートメントが印刷されます。しかし、それは間違ったことです-「&」は「and」とは異なるさまざまなセマンティクスを持っています-(優先順位、ショートサーキット、整数引数での振る舞いなど)、あなたが捕まったのは幸運ですこれは、明らかなバグが少なくなるまでだまされるのではなく、ここで行います。

27
Brian

使用する正しい演算子は、キーワード「or」および「and」です。この例では、これを表す正しい方法は次のとおりです。

if i == 5 and ii == 10:
    print "i is 5 and ii is 10"

詳細は、言語リファレンスの 「ブール演算」セクション で参照できます。

15
Seh Hui Leong

カップルとしてテストすることもできます。

if (i,ii)==(5,10):
    print "i is 5 and ii is 10"
7
fulmicoton

&はビット単位の比較に使用されます。代わりにandを使用してください。ところで、printステートメントの最後にセミコロンは必要ありません。

6
SilentGhost

Pythonでは、次のように&&の代わりにandを使用します。

#!/usr/bin/python
foo = True;
bar = True;
if foo and bar:
    print "both are true";

これは印刷します:

both are true
2
Tim Ottinger