A) OPERADOR IN:
CORTE DE ALMAGRE EN EL BARRANCO DE LEMES, ARICO, SUR DE TENERIFE |
Aprovechando que nos hemos dado de bruces con los booleanos, vamos a explicar un elemento más de Python: la propiedad IN. Es importante advertir que nos estamos refiriendo a in como tal, en solitario, y no asociada al iterador FOR (FOR/IN), que estudiaremos cuando hayamos concluido con los principales tipos de datos de Python, y cuyo significado particular, como no puede ser de otra manera, es el mismo en ambos casos: 'en'.
IN se apoya en el tipo de dato booleano y nos resultará muy útil cuando, por ejemplo, estemos haciendo un listado "generoso" de ítems y no sepamos si hemos incluido en él un ítem concreto. Al usar in en una expresión referida a una variable que almacene una colección de datos, como una string, por ejemplo, que almacena una colección de caracteres literales, nos devolverá True si encuentra lo que le hemos pedido buscar, o False en caso de no encontrarlo. Su sintaxis es muy sencilla: ítem in nombre_de_la_variable.
He aquí un ejemplo de uso:
Hay quien también se refiere a in como 'verificador' en tanto en cuenta 'verifica' si tal o cual ítem está en una variable o no. Por otra parte, se cuentan autores que prefieren denominarlo OPERADOR DE PERTENENCIA. Se admiten propuestas...
También podemos escribir NOT IN, pasando la frase a negativo, poniendo el énfasis en "no estar",
Precisemos: el operador in busca substrings allí donde lo apliquemos y no coincidencias de caracteres literales: no sólo busca los caracteres coincidentes sino que lo hace también en el mismo orden. Y aún más: discierne entre mayúsculas y minúsculas. Pongamos un ejemplo:
ROQUE DE FUERA, ROQUES DE ANAGA, NORESTE DE TENERIFE |
B) OPERADOR IS:
ROQUE DE TABORNO, ANAGA CENTRAL. EJEMPLO DE PITÓN (VOLCÁNICO) |
El objetivo del OPERADOR DE IDENTIDAD es el de comprobar si las dos referencias que se le pasan apuntan al mismo objeto, o cuando se le pasa una sola referencia ésta tiene valor None.
Trabaja como un operador booleano que se aplica a las variables y no a datos o valores, ya que para comparar estos ya contamos con los operadores de comparación (v. tabla).
Partiendo de la base de que las variables, como ya sabemos, son referencias a objetos, cabe preguntarse si existen una o más referencias que apunten a un mismo objeto o, para ser más exactos, que un mismo objeto, por ejemplo, una string, esté almacenado en más de un único espacio de memoria referenciado por un nombre que lo identifique (variable).
La aplicación del operador devuelve True si la variable de la izquierda refiere al mismo objeto que refiere la variable de la derecha, devolviendo False en caso contrario.
Igual que sucede con el operador de pertenencia, el operador de identidad soporta su propia negación, su lectura inversa, con la adición de la keyword not.
En este ejemplo podemos observar perfectamente su comportamiento. Sin embargo, en LISTA [...] y en TUPLA (...) comprobamos un comportamiento anómalo: dos listas y dos tupla exactamente iguales y la aplicación del operador de identidad nos devuelve False en lugar de True. ¿Por qué ha ocurrido esto? Muy sencillo: porque las listas, las tuplas y algunos objetos más de Python se almacenan por defecto en objetos de lista (objetos de tupla, en el segundo caso) distintos.
Cuentan con la ventaja de operar con celeridad ya que no comparan objetos entre sí, como sí hacen los operadores de comparación, sino espacios de memoria. Suelen, como hemos dicho más arriba, emplearse para comparar un objeto concreto con el tipo de dato None, susceptible de ser utilizado como VALOR DE MARCADO para señalar que una variable no tiene valor o dato alguno guardado, o que dicho dato o valor es desconocido.
Resumiendo: no debemos comparar ni objetos (list is list [True], tuple is not tuple [False]) ni valores de una variable porque resultan una obviedad, una redundancia, que desde el punto de vista de la programación carece de sentido.
El uso correcto del verificador se orienta a las variables que señalan objetos, básicamente, para comprobar si dos variables distintas refieren a un mismo objeto o no.
1.- La variable no es una lista: una variable es una variable.
2.- He aquí la comprobación.
3.- Evidente: una lista no es una tupla.
4.- Tenemos dos conjuntos distintos, exactamente con los mismos ítems, sí, pero son dos conjuntos distintos: a uno lo hemos llamado c y al otro g. Por ese motivo operar cambios en c no suscitará un cambio especular en g.
5.- Las cadenas, sin embargo, sí son idénticas entre sí a pesar de tener dos nombres distintos. Ésta condición de similitud absoluta le es reconocido por Python por su literalidad (estar entrecomilladas) y no por su inmutabilidad: a = (1,2,3), b = (1,2,3) => a is b => False. Tiene que ver con la imposibilidad de ser desordenadas (su inmutabilidad): se trata de una colección o secuencia de datos que no podemos desordenar sin cambiar con ello su propia naturaleza. Por ejemplo, "amor" no es lo mismo que "roma", aunque contengan las mismas letras y su tamaño fuera similar: son dos conceptos distintos; pero en dos listas, pongamos por caso, como a = [1,2,3] y b = [3,1,2], el orden en que se muestren sus valores no afecta a su posterior funcionalidad: su significado es el mismo.
6.- Dos listas con idénticos ítems pero con dos nombres de variables distintos. Un caso similar a 4.
7.- Igualar una variable a otra implica automáticamente la identidad absoluta entre ambas variables.
8.- Como ya sabemos, el método list.copy() devuelve una copia exacta de la variable, pero como ocurre con a y e, se trata de dos listas independientes la una de la otra.
9.- El objeto al que apunta el nombre de variable f no es una string: es, precisamente, eso, una variable.
10.- Confirmación de lo antedicho.
Mostramos a continuación una pequeña tabla que explicita dos aspectos básicos de los operadores de pertenencia e identidad:
Vamos a ver la diferencia que existe entre la declaración o expresión is en relación con el operador de comparación ==. Así nos aclararemos entre qué significan que dos variables apunten a un mismo objeto o que apunten a un mismo tipo de dato aún siendo similares los valores:
Obvia decir que lo mismo podemos hacer pasando la expresión a negativo (not is) y el operador de comparación a "distinto" (!=).
Trabaja como un operador booleano que se aplica a las variables y no a datos o valores, ya que para comparar estos ya contamos con los operadores de comparación (v. tabla).
Partiendo de la base de que las variables, como ya sabemos, son referencias a objetos, cabe preguntarse si existen una o más referencias que apunten a un mismo objeto o, para ser más exactos, que un mismo objeto, por ejemplo, una string, esté almacenado en más de un único espacio de memoria referenciado por un nombre que lo identifique (variable).
La aplicación del operador devuelve True si la variable de la izquierda refiere al mismo objeto que refiere la variable de la derecha, devolviendo False en caso contrario.
Igual que sucede con el operador de pertenencia, el operador de identidad soporta su propia negación, su lectura inversa, con la adición de la keyword not.
En este ejemplo podemos observar perfectamente su comportamiento. Sin embargo, en LISTA [...] y en TUPLA (...) comprobamos un comportamiento anómalo: dos listas y dos tupla exactamente iguales y la aplicación del operador de identidad nos devuelve False en lugar de True. ¿Por qué ha ocurrido esto? Muy sencillo: porque las listas, las tuplas y algunos objetos más de Python se almacenan por defecto en objetos de lista (objetos de tupla, en el segundo caso) distintos.
Cuentan con la ventaja de operar con celeridad ya que no comparan objetos entre sí, como sí hacen los operadores de comparación, sino espacios de memoria. Suelen, como hemos dicho más arriba, emplearse para comparar un objeto concreto con el tipo de dato None, susceptible de ser utilizado como VALOR DE MARCADO para señalar que una variable no tiene valor o dato alguno guardado, o que dicho dato o valor es desconocido.
Resumiendo: no debemos comparar ni objetos (list is list [True], tuple is not tuple [False]) ni valores de una variable porque resultan una obviedad, una redundancia, que desde el punto de vista de la programación carece de sentido.
El uso correcto del verificador se orienta a las variables que señalan objetos, básicamente, para comprobar si dos variables distintas refieren a un mismo objeto o no.
1.- La variable no es una lista: una variable es una variable.
2.- He aquí la comprobación.
3.- Evidente: una lista no es una tupla.
4.- Tenemos dos conjuntos distintos, exactamente con los mismos ítems, sí, pero son dos conjuntos distintos: a uno lo hemos llamado c y al otro g. Por ese motivo operar cambios en c no suscitará un cambio especular en g.
5.- Las cadenas, sin embargo, sí son idénticas entre sí a pesar de tener dos nombres distintos. Ésta condición de similitud absoluta le es reconocido por Python por su literalidad (estar entrecomilladas) y no por su inmutabilidad: a = (1,2,3), b = (1,2,3) => a is b => False. Tiene que ver con la imposibilidad de ser desordenadas (su inmutabilidad): se trata de una colección o secuencia de datos que no podemos desordenar sin cambiar con ello su propia naturaleza. Por ejemplo, "amor" no es lo mismo que "roma", aunque contengan las mismas letras y su tamaño fuera similar: son dos conceptos distintos; pero en dos listas, pongamos por caso, como a = [1,2,3] y b = [3,1,2], el orden en que se muestren sus valores no afecta a su posterior funcionalidad: su significado es el mismo.
6.- Dos listas con idénticos ítems pero con dos nombres de variables distintos. Un caso similar a 4.
7.- Igualar una variable a otra implica automáticamente la identidad absoluta entre ambas variables.
8.- Como ya sabemos, el método list.copy() devuelve una copia exacta de la variable, pero como ocurre con a y e, se trata de dos listas independientes la una de la otra.
9.- El objeto al que apunta el nombre de variable f no es una string: es, precisamente, eso, una variable.
10.- Confirmación de lo antedicho.
Mostramos a continuación una pequeña tabla que explicita dos aspectos básicos de los operadores de pertenencia e identidad:
Vamos a ver la diferencia que existe entre la declaración o expresión is en relación con el operador de comparación ==. Así nos aclararemos entre qué significan que dos variables apunten a un mismo objeto o que apunten a un mismo tipo de dato aún siendo similares los valores:
Obvia decir que lo mismo podemos hacer pasando la expresión a negativo (not is) y el operador de comparación a "distinto" (!=).
TRIGALES EN LOS REALEJOS, NORTE DE TENERIFE |
No hay comentarios:
Publicar un comentario