2009-07-02 27 views
50

ここに私が持っている三角形を表す私のカスタムクラスがあります。 self.aself.b、およびself.cが0より大きいかどうかを確認するコードを記述しようとしています。これは、角度、角度、角度を持つことを意味します。PythonでAND演算子とNOT演算子を使用する

以下は、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 
+64

@ノア・クラーク:あなた自身がPythonを教えるためにどのような本を読んでいますか?それはあまり良くありません。私はそれに反対することができますので、私は知ってほしいと思います。 –

+364

S. Lott、私は実際にあなたを使っています!私はそれを使用して停止する必要がありますか? –

+25

今後とも皆さんに:S. Lottは明らかに彼自身の運動を認めています。 –

答えて

100

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

&は」少し賢明演算子であり、ブール演算のために適しません。 "&&"に相当するのはPythonの "and"です。何でも、それはのために働く、「中」で反復可能なの一部である場合

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

あなたがチェックすることができます:あなたが欲しいものをチェックする

短い方法は、オペレータ「で」使用することです

  • タプル。 I.E:"foo" in ("foo", 1, c, etc)はtrueを返します
  • リスト。 I.E:"foo" in ["foo", 1, c, etc]はtrueを返します
  • 文字列。 I.E:"a" in "ago"はtrueを返します
  • Dict。 、あなたはタプルオブジェクトを作成しているので、遅い「の」使用して、はい

    を、本当に性能がここでの問題ではありません:IE:"foo" in {"foo" : "bar"}コメントに答えたよう

を返します。 Pythonでは読みやすさが重要です。三角形のチェックのために

は、それが読みやすいです:

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

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

たよりそれはあまりにもリファクタリングする方が簡単です。

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

+7

なぜ "0が(self.a、self.b)にない場合:"短いですか?それは本当に慣用的なpythonですか?はい、それは少数の文字で短く、おそらく遅くなります。あなたはタプルを構築しなければなりません、そして、それは単調に見えます。 – Tom

+9

このような少々のデータの速度は問題ではありません。とにかく、Pythonの速度よりも読みやすさはしばしば重要です。その場合は、3つの角度をチェックしたい場合は、3 "と" "の場合よりもこのように書く方がきれいですので、非常に便利です。 –

+5

通常、左辺が可変である場合、次のように使います:xが(2、3、5、7)の場合... – FogleBird

20

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

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

+8

また、_standard_(つまり、Microsoft以外の;-) C++の '&&'の代わりに 'と'を使用することもできます。 –

+3

うわー!私は本当にあなたがそれをすることができるか分からなかった、アレックス。私はC++に精通した友人のいくつかに尋ねましたが、どちらも知らなかったのです!オンラインで見つけるのも簡単ではありません。しかし、確かに、私はそれを試したと働いた:-)。ありがとう! – Tom

8

Pythonではandorと呼ばれています。あなたが書くべき