Como se ha señalado, "&" en Python realiza una función y operación, como lo hace en C#. and
es el equivalente apropiado al operador &&
.
Dado que estamos tratando con booleanos (i == 5
es True
y ii == 10
es también True
), usted puede preguntarse por qué esto no funciona, ya sea de todos modos (verdadero ser tratado como un número entero cantidad aún debe significar verdadera & Verdadero es un verdadero valor), o lanzar una excepción (por ejemplo, prohibiendo operaciones bit a bit en tipos booleanos)
La razón es la precedencia del operador.El "and
" operador se une más débilmente que ==
, por lo que la expresión: "i==5 and ii==10
" es equivalente a: "(i==5) and (ii==10)
"
Sin embargo, a nivel de bits &
tiene una prioridad más alta que "==
" (puesto que no le gustaría expresiones como "a & 0xff == ch
" para significar "a & (0xff == ch)
"), por lo que la expresión de hecho se interpreta como:
if i == (5 & ii) == 10:
que está utilizando el operador del pitón de encadenamiento en el sentido de: ¿el valuei de la Segunda AND con 5 iguales tanto iy 10. Obviamente esto nunca será cierto.
Se podría conseguir realmente (aparentemente) la respuesta correcta si se había incluido entre paréntesis para forzar la precedencia, así que:
if (i==5) & (ii=10)
haría que la declaración se va a imprimir. Sin embargo, es incorrecto: "&
" tiene muchas semánticas diferentes a "and
" - (precedencia, cortocircuito, comportamiento con argumentos enteros, etc.), por lo que es afortunado que haya captado esto aquí en lugar de dejarse engañar hasta que haya producido errores menos obvios.
El punto y coma es útil si queremos combinar líneas de códigos. – riza
La combinación de líneas no es la forma "pitónica" aunque – Rodrigo
Aunque puede combinar líneas, como dice Rodrigo, no es "pitónico". Como en este caso particular el punto y coma no tuvo ningún efecto, hice un comentario sobre su redundancia. Supuse que el interlocutor era nuevo para Python y no quería hinchar mi respuesta en cuanto a lo que es "pitónico" y lo que hace el punto y coma. – Mizipzor