¿Uso y significado de “en” en una statement if?

En un ejemplo de Learn Python the Hard Way de Zed Shaw, uno de los ejercicios muestra el siguiente código:

next = raw_input("> ") if "0" in next or "1" in next: how_much = int(next) 

Me está costando entender el significado de esta statement. Estoy acostumbrado a usar sentencias if , como en javascript, donde la syntax es algo como:

 var = 5; if (var > 3) { //code to be executed } 

¿Es esta instrucción if / in (en python) la misma que if() en javascript?

Encontrar una respuesta a esto ha sido complicado porque el in es una cadena tan corta para restringir una respuesta a través del motor de búsqueda, y no sé el nombre correcto para su operación.

Depende de lo que sigue.

Si es una cadena (como en su ejemplo), entonces compruebe si hay subcadenas.

 >>> "in" in "indigo" True >>> "in" in "violet" False >>> "0" in "10" True >>> "1" in "10" True 

Si es un tipo diferente de iterable (lista, tupla, conjunto, diccionario …), entonces compruebe la membresía.

 >>> "in" in ["in", "out"] True >>> "in" in ["indigo", "violet"] False 

En un diccionario, la membresía se ve como “ser una de las claves”:

 >>> "in" in {"in": "out"} True >>> "in" in {"out": "in"} False 

Usar a in b es simplemente se traduce a b.__contains__(a) , que debería devolver si b incluye a o no.

Pero, su ejemplo parece un poco extraño, toma una entrada del usuario y asigna su valor entero a la variable how_much si la entrada contiene "0" o "1" .

Ya que reclamas estar acostumbrado a JavaScript:

El operador Python in es similar al operador JavaScript in .

Aquí hay algunos JavaScript:

 var d = {1: 2, 3: 4}; if (1 in d) { alert('true!'); } 

Y el equivalente de Python:

 d = {1: 2, 3: 4} if 1 in d: print('true!') 

Con los objetos / dictados, son casi idénticos, y ambos comprueban si 1 es una clave del objeto / dict. La gran diferencia, por supuesto, es que JavaScript está mal escrito, por lo que '1' in d sería igual de cierto.

Con arrays / listas, son muy diferentes. Una matriz JS es un objeto y sus índices son las claves, por lo que 1 in [3, 4, 5] será true . Una lista de Python es completamente diferente de un dict, y su operador in comprueba los valores , no los índices , lo que suele ser más útil. Y Python extiende este comportamiento a todos los iterables.

Con cuerdas, son aún más diferentes. Una cadena JS no es un objeto, por lo que obtendrá un TypeError . Pero una str Python o unicode comprobará si el otro operando es una subcadena . (Esto significa que 1 in '123' es ilegal, porque 1 no puede ser una subcadena de nada, pero '1' in '123' es verdadero.)

Con los objetos como objetos, en JS, por supuesto, no hay distinción, pero en Python, los objetos son instancias de clases, no de dictados. Entonces, en JS, 1 in d será cierto para un objeto si tiene un miembro o método llamado '1' , pero en Python, depende de su clase lo que significa: Python llamará d.__contains__(1) , entonces , si eso falla, intenta usar tu objeto como un declarable (llamándolo __iter__ , y, si eso falla, intentando indexarlo con números enteros que comienzan con 0 ).

Además, tenga en cuenta que JS está in , porque en realidad está verificando la pertenencia a un objeto, realiza la búsqueda de orden de resolución de métodos de JS, mientras que Python’s está in , porque está comprobando las claves de un dict, los miembros de una secuencia, etc. cosa. Entonces, técnicamente, es probable que esté un poco más cerca del método hasOwnProperty que del operador in .

Quizás estos ejemplos ayuden a ilustrar lo que hace. Básicamente se traduce a Is this item in this other item?

 listOfNums = [ 1, 2, 3, 4, 5, 6, 45, 'j' ] >>> 3 in listOfNums: >>> True >>> 'j' in listOfNums: >>> True >>> 66 in listOfNums: >>> False 

Está acostumbrado a usar el javascript if , y asumo que sabe cómo funciona.

in es una forma pythonica de implementar la iteración. Se supone que es más fácil de adoptar para los pensadores no programáticos, pero eso a veces puede hacer que sea más difícil para los pensadores programáticos, irónicamente.

Cuando dices if x in y , literalmente estás diciendo:

“si x está en y “, que asume que y tiene un índice. En esa statement if , entonces, cada objeto en cada índice en y se compara con la condición.

Similar,

for x in y

itera a través de x ‘s en y , donde y es el conjunto de elementos indexables.

Piense en la situación if esta manera (pseudo-código):

 for i in next: if i == "0" || i == "1": how_much = int(next) 

Se encarga de la iteración a next para usted.

¡Feliz encoding!

Aquí raw_input es string , por lo que si desea verificar, if var>3 , debe convertir next to double, es decir, float(next) y haga lo que haría if float(next)>3 :, pero en la mayoría de los casos

la palabra reservada “en” se usa para mirar dentro de un objeto que se puede iterar.

 list_obj = ['a', 'b', 'c'] tuple_obj = ('a', 1, 2.0) dict_obj = {'a': 1, 'b': 2.0} obj_to_find = 'c' if obj_to_find in list_obj: print('Object {0} is in {1}'.format(obj_to_find, list_obj)) obj_to_find = 2.0 if obj_to_find in tuple_obj: print('Object {0} is in {1}'.format(obj_to_find, tuple_obj)) obj_to_find = 'b' if obj_to_find in dict_obj: print('Object {0} is in {1}'.format(obj_to_find, dict_obj)) 

Salida:

 Object c is in ['a', 'b', 'c'] Object 2.0 is in ('a', 1, 2.0) Object b is in {'a': 1, 'b': 2.0} 

sin embargo

 cannot_iterate_over = 5.5 obj_to_find = 5.5 if obj_to_find in cannot_iterate_over: print('Object {0} is in {1}'.format(obj_to_find, cannot_iterate_over)) 

tirará

 Traceback (most recent call last): File "/home/jgranger/workspace/sandbox/src/csv_file_creator.py", line 43, in  if obj_to_find in cannot_iterate_over: TypeError: argument of type 'float' is not iterable 

En su caso, raw_input (“>”) devuelve un objeto iterable o lanzará TypeError

Esta puede ser una respuesta muy tardía. En cheques de operador para membresías. Es decir, verifica si su operando izquierdo es miembro de su operando derecho. En este caso, raw_input () devuelve un objeto str de lo que proporciona el usuario en la entrada estándar. Entonces, la condición if comprueba si la entrada contiene subcadenas “0” o “1”. Teniendo en cuenta el typecasting ( int () ) en la línea siguiente, la condición if comprueba esencialmente si la entrada contiene los dígitos 0 o 1.