web-dev-qa-db-ja.com

PythonでANDおよびNOT演算子を使用する

これは、三角形を表すカスタムクラスです。 self.aself.b、およびself.cが0より大きいかどうかを確認するコードを作成しようとしています。つまり、Angle、Angle、Angleがあります。

以下に、AとBをチェックするコードが表示されますが、self.a != 0だけを使用すると正常に機能します。 &を正しく使用していないと思います。何か案は?これが私がどのように呼んでいるかです:print myTri.detType()

class Triangle:

    # Angle A To Angle C Connects Side F
    # Angle C to Angle B Connects Side D
    # Angle B to Angle A Connects Side E

    def __init__(self, a, b, c, d, e, f):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f

    def detType(self):
        #Triangle Type AAA
        if self.a != 0 & self.b != 0:
            return self.a

        #If self.a > 10:
            #return AAA

        #Triangle Type AAS

        #Elif self.a = 0:
            #return AAS

        #Triangle Type ASA

        #Triangle Type SAS

        #Triangle Type SSS  

        #else:
            #return unknown
59
Noah Clark

あなたは書くべきです:

if (self.a != 0) and (self.b != 0) :

&」はビット単位の演算子であり、ブール演算には適していません。 Pythonでは、「&&」に相当するのは「and」です。

欲しいものをチェックする簡単な方法は、「in」演算子を使用することです:

if 0 not in (self.a, self.b) :

「in」でイテラブルの一部であるかどうかを確認できます。

  • タプル。 I.E:"foo" in ("foo", 1, c, etc)はtrueを返します
  • リスト。 I.E:"foo" in ["foo", 1, c, etc]はtrueを返します
  • 文字列。 I.E:"a" in "ago"はtrueを返します
  • 口述I.E:"foo" in {"foo" : "bar"}はtrueを返します

コメントへの回答として:

はい。Tupleオブジェクトを作成しているため、「in」の使用は遅くなりますが、実際にはパフォーマンスは問題ではなく、Pythonでは読みやすさが重要です。

三角形のチェックについては、読みやすいです:

0 not in (self.a, self.b, self.c)

より

(self.a != 0) and (self.b != 0) and (self.c != 0) 

リファクタリングも簡単です。

もちろん、この例では、実際にはそれほど重要ではなく、非常に単純なスニペットです。しかし、このスタイルはPythonicコードにつながり、大きなプログラムでより幸せなプログラマー(そして体重の減少、性生活の改善など)につながります。

120
e-satis

&はビット演算子であるため、&ではなくキーワードandを使用します。

これに注意してください... JavaとC++では、&演算子はビット演算子でもあります。これらの言語でブール比較を行う正しい方法は、&&です。同様に、|はビット演算子であり、||はブール演算子です。 Python andおよびorはブール比較に使用されます。

21
Tom

Pythonではandおよびorと呼ばれます。

11
Lennart Regebro