2012-07-15 5 views
9

Una de las respuestas a this question es¿por qué se usa la construcción x = (Condición y A o B)?

print len(s)>5 and 'y' or 'n' 
print(len(s)>5 and 'y' or 'n') #python3 

si la longitud de s > 5, a continuación, se imprime 'y' lo contrario es 'n'. Por favor explique cómo/por qué esto funciona. Gracias.

Entiendo que este no es un enfoque recomendado, pero me gustaría entender por qué funciona.

Respuesta

15

Esto es un truco anticuado. La nueva forma es:

print 'y' if len(s) > 5 else 'n' 

La razón es porque funciona "A y B" evaluarán A, y si bien es cierto, evaluará a B. Pero si A es falso, no tiene por qué evaluar B. Del mismo modo, "C o D" evaluará C, y si es falso, continuará para evaluar como D.

Entonces "A y B o C" es lo mismo que "(A y B) o C ". Si A es verdadero, evaluará B. Si A es falso, entonces "(A y B)" es falso, por lo que evaluará C.

Como señala Voo en los comentarios, el valor de A no necesita ser True o False, pero cualquier expresión, y será interpretada como booleana por las reglas de Python (0, Ninguno, y los contenedores vacíos son falsos, todo lo demás es verdadero).

+2

lol - mi respuesta de 0 puntos tiene una pregunta propia, ¡y estoy demasiado tarde para explicarlo! ;-) pero buen comentario ;-) –

+1

Puede valer la pena completar el otro "truco" antes de la sintaxis 'if ... else', que solía ser' print {False: 'n', True: 'y' } (len (s)> 5) '(o incluso simplemente' {0: 'n', 1: 'y'} ') –

+2

Meh, no hay" completitud "de hacks inútiles. ¿Qué pasa con ''ny '[len (s)> 5]'? Las formas de abusar del lenguaje son infinitas. –

Cuestiones relacionadas