web-dev-qa-db-fra.com

Utilisation de l'opérateur AND and NOT dans Python

Voici ma classe personnalisée que j'ai qui représente un triangle. J'essaie d'écrire du code qui vérifie si self.a, self.b et self.c sont supérieurs à 0, ce qui voudrait dire que j'ai Angle, Angle, Angle.

Ci-dessous, vous verrez le code qui vérifie A et B, cependant, lorsque j'utilise uniquement self.a != 0, cela fonctionne correctement. Je crois que je n'utilise pas & correctement. Des idées? Voici comment je l'appelle: 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

Vous devriez écrire:

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

"&" est l'opérateur binaire et ne convient pas aux opérations booléennes. L'équivalent de "&&" est "et" en Python.

Un moyen plus simple de vérifier ce que vous voulez consiste à utiliser l'opérateur "in":

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

Vous pouvez vérifier si quelque chose fait partie d'un itérable avec "in", cela fonctionne pour:

  • Tuples. I.E: "foo" in ("foo", 1, c, etc) retournera vrai
  • Listes. I.E: "foo" in ["foo", 1, c, etc] retournera vrai
  • Cordes. I.E: "a" in "ago" retournera vrai
  • Dict. I.E: "foo" in {"foo" : "bar"} retournera vrai

En réponse aux commentaires:

Oui, l'utilisation de "in" est plus lente car vous créez un objet Tuple, mais les performances ne sont vraiment pas un problème ici, et la lisibilité compte beaucoup pour Python.

Pour la vérification du triangle, il est plus facile de lire:

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

Que

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

C'est plus facile de refactoriser aussi.

Bien sûr, dans cet exemple, ce n’est vraiment pas si important, c’est un extrait très simple. Mais ce style conduit à un code Pythonic, ce qui rend le programmeur plus heureux (et perdre du poids, améliorer la vie sexuelle, etc.) dans les gros programmes.

120
e-satis

Utilisez le mot-clé and et non pas & parce que & est un opérateur de bit.

Soyez prudent avec ceci ... juste pour que vous sachiez, dans Java et C++, l'opérateur & est également un opérateur bit. La méthode correcte pour effectuer une comparaison booléenne dans ces langues est &&. De même, | est un opérateur de bit et || est un opérateur booléen. Dans Python and et or sont utilisés pour les comparaisons booléennes.

21
Tom

Cela s'appelle and et or en Python.

11
Lennart Regebro