2009-07-02 9 views
50

Aquí está mi clase personalizada que tengo que representa un triángulo. Estoy tratando de escribir un código que verifica si self.a, self.b y self.c son mayores que 0, lo que significa que tengo Ángulo, Ángulo, Ángulo.Usando el operador AND y NOT en Python

A continuación verá el código que busca A y B, sin embargo, cuando solo uso self.a != 0, funciona bien. Creo que no estoy usando & correctamente. ¿Algunas ideas? Aquí es cómo estoy llamando: 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

@Noah Clark: ¿Qué libro estás leyendo para enseñarte Python? No es muy bueno. Me gustaría saber para poder recomendarlo. –

+364

S. Lott, de hecho estoy usando el tuyo! ¿Debería dejar de usarlo? –

+25

Para todos en el futuro: S. Lott obviamente ha reconocido su propio ejercicio. –

Respuesta

100

debe escribir:

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

"&" es el operador sabia poco y no se adapta a las operaciones booleanas. El equivalente de "&&" es "y" en Python.

Un camino más corto para comprobar lo que desea es utilizar el "en" operador:

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

se puede comprobar si todo es parte de un un iterable con "en", funciona para:

  • Tuplas. I.E: "foo" in ("foo", 1, c, etc) devolverá verdadero
  • Listas. I.E: "foo" in ["foo", 1, c, etc] devolverá verdadero
  • Cadenas. I.E: "a" in "ago" devolverá verdadero
  • Dict. IE: "foo" in {"foo" : "bar"} volverá cierto

Como una respuesta a los comentarios:

Sí, usando "en" es más lenta, ya que está creando un objeto Tuple, pero en realidad representaciones no son un problema aquí, además, la legibilidad importa mucho en Python.

Para la comprobación de triángulo, que es más fácil de leer:

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

Que

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

Es más fácil refactorizar también.

Por supuesto, en este ejemplo, realmente no es tan importante, es un fragmento muy simple.Pero este estilo lleva a un código pitónico, que conduce a un programador más feliz (y perder peso, mejorar la vida sexual, etc.) en los grandes programas.

+7

¿Por qué es "if 0 not in (self.a, self.b):" más corto? ¿Es esa pitón realmente idiomática? Sí, es más corto por unos pocos caracteres, pero probablemente más lento. Tienes que construir una tupla y parece incómodo. – Tom

+9

La velocidad en un grupo tan pequeño de datos no es un problema. De todos modos, la legibilidad es a menudo más importante que la velocidad en Python. En este caso, es muy útil porque si desea verificar los 3 ángulos, es más limpio escribirlo de esta manera que con 3 "y". –

+5

Usualmente uso eso cuando el lado izquierdo es variable, como: si x en (2, 3, 5, 7) ... – FogleBird

20

utilizar la palabra clave and, no & porque & es un operador de bits.

Tenga cuidado con esto ... solo para que sepa, en Java y C++, el operador & es TAMBIÉN un operador de bit. La forma correcta de hacer una comparación booleana en esos idiomas es &&. De forma similar, | es un operador de bits, y || es un operador booleano. En Python se usan and y or para las comparaciones booleanas.

+8

También puede usar 'y' en lugar de' && 'en _standard_ (es decir, no Microsoft ;-) C++. –

+3

¡guau! Realmente no tenía idea de que pudieras hacer eso, Alex. ¡Le pregunté a algunos de mis amigos muy conocedores de C++ y ellos tampoco lo sabían! Además, no es fácil de encontrar en línea. Pero, efectivamente, lo intenté y funcionó :-). ¡Gracias! – Tom

8

Se llama and y or en Python.