¿Cuál es el valor lógico de “cadena” en Python?

Escribí erróneamente este código en Python:

name = input("what is your name?") if name == "Kamran" or "Samaneh": print("That is a nice name") else: print("You have a boring name ;)") 

Siempre imprime “Ese es un buen nombre” incluso cuando la entrada no es “Kamran” ni “Samaneh”.

¿Estoy en lo cierto al decir que considera a “Samaneh” como un verdadero? ¿Por qué?

Por cierto, ya me di cuenta de mi error. La forma correcta es:

 if name == "Kamran" or name == "Samaneh": 

Cualquier cadena que no esté vacía en Python (y en la mayoría de los demás idiomas) es verdadera, al igual que todos los números que no son cero y las listas, diccionarios, conjuntos y tuplas que no están vacíos. 1

Una mejor manera de hacer lo que quieres es:

 name = input("what is your name?") if name in ("Kamran", "Samaneh"): print("That is a nice name") else: print("You have a boring name ;)") 

Esto crea una tupla que contiene los nombres que desea y realiza una prueba de membresía.

1 Como señala Delnan en los comentarios, esto se aplica a todas las colecciones bien escritas . Es decir, si implementa una clase de colección personalizada, asegúrese de que sea falsa cuando esté vacía.

Además de la cadena vacía '' , todas las cadenas se evaluarán como True (consulte esta página para obtener una lista completa de los valores de todos los tipos que se evalúan como False . Esto sigue la lógica de muchos otros lenguajes de progtwigción (excepto algunos que también evalúan cadenas como '0' , 'false' , etc. a False ). La decisión exacta de qué hacer es algo arbitraria, pero la elección realizada se puede explicar como que permite que la conversión se use como una forma sencilla de realizar pruebas de vacío (predeterminado o no poblado). ) cuerdas.

Siempre puede forzar un reparto de cualquier tipo a bool mediante la función bool() .

 >>> bool('') False >>> bool('non-empty string') True >>> bool('0') True >>> bool('False') True >>> bool('false') True 

http://docs.python.org/library/stdtypes.html#truth-value-testing

“…. Todos los demás valores se consideran verdaderos, por lo que los objetos de muchos tipos siempre son verdaderos”.

En Python, una cadena vacía se considera False , True contrario.

Podrías usar el operador in :

 if name in ("Kamran","Samaneh"): print("That is a nice name") else: print("You have a boring name ;)") 

Una cadena no vacía es verdadera, sí. Uno vacío es falso. Esto es muy útil.

Evidentemente, debe ser:

 name = raw_input("what is your name?") 

no

 name = input("what is your name?") 

.

Lo que escribiste es como:

 if (name == "Kamran" or "Samaneh") 

Otra buena expresión es:

 if name == ("Kamran" or "Samaneh") 

Pero también prefiero si el nombre en (“Kamran” o “Samaneh”) como ya se muestra

.

Por cierto, se puede escribir:

 print("That is a nice name" if raw_input("what is your name?") in ("Kamran","Samaneh") else "You have a boring name ;)")