Pregunta ¿Por qué comprobar una variable contra valores múltiples con `O 'solo verifica el primer valor? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Quiero verificar si una variable tiene uno de valores múltiples. Estoy confundido acerca de por qué or no funciona en esta situación Estaba siguiendo un tutorial que dio el ejemplo if (a or b):, pero cuando trato de hacerlo, solo comprueba la variable contra el primer valor. ¿Qué pasa con mi cheque?

name = raw_input('Please type in your name:')

if len(name) < 5:
    print "Your name has fewer than 5 characters"
elif len(name) == 5:
    print "Your name has exactly 5 characters"
    if name == ("Jesse" or "jesse"):
        print "Hey Jesse!"
else:
    print "Your name has greater than 5 characters"

29
2017-08-13 14:59


origen


Respuestas:


("Jesse" or "jesse")

La expresión anterior prueba si "Jesse" evalúa a True. Si lo hace, entonces la expresión lo devolverá; de lo contrario, regresará "jesse". La expresión es equivalente a escribir:

"Jesse" if "Jesse" else "jesse"

Porque "Jesse" es una cadena no vacía sin embargo, lo hará siempre evaluar a True y así ser devuelto:

>>> bool("Jesse")  # Non-empty strings evaluate to True in Python
True
>>> bool("")  # Empty strings evaluate to False
False
>>>
>>> ("Jesse" or "jesse")
'Jesse'
>>> ("" or "jesse")
'jesse'
>>>

Esto significa que la expresión:

name == ("Jesse" or "jesse")

es básicamente equivalente a escribir esto:

name == "Jesse"

Para solucionar su problema, puede usar in operador:

# Test whether the value of name can be found in the tuple ("Jesse", "jesse")
if name in ("Jesse", "jesse"):

O bien, puede minúsculas el valor de name con str.lower y luego compararlo "jesse" directamente:

# This will also handle inputs such as "JeSSe", "jESSE", "JESSE", etc.
if name.lower() == "jesse":

52
2017-08-13 15:02



if name in ("Jesse", "jesse"):

sería la forma correcta de hacerlo.

Aunque, si quieres usar or, la declaración sería

if name == 'Jesse' or name == 'jesse':

>>> ("Jesse" or "jesse")
'Jesse'

evalúa a 'Jesse', entonces esencialmente no estás probando 'jesse' Cuando tu lo hagas if name == ("Jesse" or "jesse"), ya que solo prueba la igualdad para 'Jesse' y no prueba para 'jesse'como lo has observado


10
2017-08-13 15:00



los or el operador devuelve el primer operando si es verdadero; de lo contrario, el segundo operando. Entonces, en tu caso, tu prueba es equivalente a if name == "Jesse".

La correcta aplicación de or sería:

if (name == "Jesse") or (name == "jesse"):

6
2017-08-13 15:02



Si desea una comparación que no distinga entre mayúsculas y minúsculas, use lower o upper:

if name.lower() == "jesse":

5
2017-08-13 15:02