jueves, 3 de marzo de 2016

T1. SECUENCIAS EN PYTHON. COMO JUGAR A LA OCA.

CASERÍO DE TENO ALTO, MACIZO DE TENO, NOROESTE DE TENERIFE.
Una SECUENCIA es una estructura, serie o colección de datos donde es posible identificarlos y acceder a ellos a través de su índice que, recordemos, es la posición que ocupan cada dato en esa estructura, serie o colección en relación con los demás, de manera individual, esto es, carácter por carácter, o bien a través de rebanadas, slices, cuando queramos identificar y acceder a un grupo (o subgrupo) consecutivo de caracteres dentro de estos mismos datos, haciendo posible operar con ellos. Veamos el siguiente ejemplo:


Existen en Python siete tipos de secuencias: cuerdas (string), cadenas Unicode(que son casi idénticas a nuestras sufridas cadenas con la salvedad de que en su sintaxis, debemos anteponer el prefijo 'u' para señalar que los caracteres literarios que la conforman están supeditados al sistema de codificación Unicode. Por ejemplo, str = u'abc', y que Python adora con auténtica devoción), listas, tuplas, bytearrays, buffers y objetos xrange. Estos tres últimos, no nos interesan por el momento.
Vamos a ver ahora lo que comparten, lo que las secuencias tienen en común y, más adelante, ver luego lo que las diferencia:
  1. No existe límite alguno en cuanto al número o cantidad de elementos o ítems que pueden albergar.
  2. Pueden contener cualquier tipo de objeto como ítems, incluyendo otras secuencias (anidadas). De hecho, una matriz en Python, en síntesis, no es otra cosa que una lista que contiene como elementos n cantidad de listas (sublistas).
  3. No es necesario conocer a priori el tamaño, esto es, el número de elementos que integran la secuencia para poder construirla, lo que permite que se vayan añadiendo elementos a ella de manera progresiva según discurre la ejecución del programa lo que, subsidiariamente, implica una carácter mutable, modificable: la secuencia es mutable porque puede aumentar o disminuir el número de elementos de acuerdo al resultado de la ejecución de los programas.
  4. Soportan algunas funciones nativas de Python:            

  • len(secuencia): devuelve el tamaño o la cantidad de elementos de la secuencia.
  • max(secuencia): devuelve el elemento mayor de la secuencia.
  • min(secuencia): devuelve el elemento menor de la secuencia.


En este ejemplo tenemos una lista 1. compuesta por ocho elementos de tipo string. Al pasarle las funciones nativas de max(secuencia) min(secuencia), nos devuelve, en el primer caso, aquélla que comienza con la letra más próxima a la zeta de acuerdo al orden alfabético, "sauce", en 2.; mientras que en el segundo nos devuelve la más alejada de la zeta o, lo que es lo mismo, la más próxima a la 'a': "abeto".Y es que Python, recordemos, guarda en memoria el orden alfabético estándar, lo que tendrá su incidencia en los distintos métodos de las secuencias.
En 3. tenemos una tupla (tuple) con una serie de números como elementos o ítems integrantes. Un total de ocho. En este caso, como apreciamos en 4., para la función max(secuencia) nos devuelve 123, un tipo de dato int; mientras que para la función min(secuencia) nos devuelve 0.7, un tipo de dato float.
Como podemos comprobar, esto resulta tan sencillo como evidente en secuencias compuestas por datos homogéneos, es decir, que todos ellos, que todos sus elementos o ítems fueran del mismo tipo. ¿Pero qué sucedería si mezcláramos strings y números tal y como se muestra en 5.? Pues tal y como advertimos en 6. se genera un conflicto que Python no puede resolver y lanza una excepción (muestra un error) en el que nos señala, todo angustiado, que son tipos de datos "inordenables" de acuerdo a su diferente naturaleza, que son tipos de datos distintos y, por ende, los califica de error de tipo, TypeError.

VISTA DE LA BALSA DE TREVEJOS, AL FONDO Y EN EL CENTRO, LA BALSA DE AGUA ARTIFICIAL MÁS ALTA DE TENERIFE PARA ACOGER AGUA DE LLUVIA. PINAR DE VILAFLOR, CENTRO SUR DE TENERIFE.
Aparte, las secuencias soportan también dos métodos comunes:
  1. secuencia.index(ítem): devuelve el índice de la primera ocurrencia o aparición del ítem.
  2. secuencia.count(ítem): devuelve el número de veces que aparece el ítem pasado como argumento. Observemos la siguiente comparación: mientras la función len() devuelve el total de ítems de una secuencia, el método secuencia.count(ítem) devuelve el total de veces que aparece un determinado ítem en una secuencia.





En esta última captura podemos apreciar perfectamente como la función len(sentencia) equivale la suma (función sum())de la aplicación del método secuencia.count(ítem) a cada uno de los elementos que componen la secuencia.
Contamos también con otros métodos que podemos pasar a las secuencias devolviéndonos un resultado similar. Algunos de éstos nos los volveremos a encontrar cuando estudiemos los distintos tipos de secuencia. Por el momento, nos conformamos con un aperitivo, para ir abriendo boca como si dijéramos.
  • ELEMENTO DE INTERPOSICIÓN: Para  esto nos basamos en el método str.join(secuencia) que ya estudiamos en el apartado que dedicamos a los métodos de las strings. Este método interpone o intercala un elemento cualquiera pasado como cadena, es decir, entrecomillado, para separar los ítems de una secuencia. Eso sí: dichos ítems o elementos deben ser siempre strings.


  • REBANADAS(SLICES): Refresquemos la memoria. Las rebanadas, slices, consecuencia de aplicar la técnica de slicing, traducible al castellano como "troceado", que así se llama la cosa, pueden imaginarse como "mordiscos" (hay quienes sostienen también que viene a ser como tomar un índice y estirarlo todo lo que queramos: tomamos un índice de inicio, lo estiramos unos cuantos índices intermedios y dejamos de estirar cuando llegamos al índice final que hemos escogido, eso sí, teniendo en cuenta que el índice final se ignora) que le propinamos a una secuencia devolviéndonos trocitos de ella. Como no puede ser de otra manera, los trocitos, rebanadas o slices, son del mismo tipo de dato que la secuencia: las rebanadas de una string son substrings, las rebanadas de una lista son sublistas, las rebanadas de una tupla son subtuplas,.. Fácil de comprender, ¿verdad? Recordemos también que las rebanadas admiten un tercer valor con su sintaxis: secuencia[x:y:z] , donde x e y acotan un trozo concreto, mientras que z determina el cómo se cuenta (de z en z), devolviendo el resultado de la manera en que comentábamos más arriba: una subsecuencia del mismo tipo que su secuencia madre. Por cierto, un valor -z devuelve una subsecuencia vacía.

  

Todas las secuencias son ITERABLES. No olvidemos que esto significa que todos sus ítems o elementos constituyentes pueden recorrerse en orden por un bucle for/in de principio a fin.


Por defecto, cuando pasamos una función print() a un iterable, es decir, a una secuencia, Python nos devuelve el resultado en columna, con los valores resultantes unos encima de otros, como apilados, en el mismo orden en que se se los encuentra en la secuencia. 
En 1. partimos de una secuencia 'a' y aplicamos un bucle o loop for/in para que recorra, no a la secuencia 'a' propiamente dicha sino a una rebanada, a una subsecuencia de 'a', cuyos ítems son 1,3,5,7 y 9. Tengamos en cuenta  que el bucle no se aplica a 'a' sino a una rebanada de 'a', como bien podemos apreciar en el resultado.
Todas las secuencias admiten también el uso del operador in/not in de verificación o pertenencia. Aquí traemos un ejemplo:


CARDONES Y TABAIBAS BAJO CAIDEROS DE AGUA REZUMANTES DE LA LLUVIA EN LAS PAREDES DE LOS BARRANCOS DE IGUESTE DE SAN ANDRÉS, ANAGA, ESTE DE TENERIFE.

No nos olvidemos de que Python se ajusta al case sensitive y distingue entre minúsculas y mayúsculas.
Las secuencias, como ya hemos visto cuando estudiamos el apartado dedicado a  las strings, admiten también la concatenación y la multiplicación. Eso sí, siempre y cuando las secuencias a concatenar y multiplicar sean del mismo tipo.


Efectivamente, en 1. podemos ver como Python no admite concatenación alguna entre dos secuencias de distinto tipo (en realidad no permite ningún tipo de operación, salvo en casos muy concretos, entre secuencias de distinto tipo). En 2. subrayamos simplemente que la estructura de datos set(), al no tratarse de una secuencia, no admite concatenación ni multiplicación.
Finalmente, todas las secuencias admiten el proceso de desempaquetado (unpackage) de sus elementos. Esto del desempaquetado lo estudiaremos más adelante aunque, básicamente, nos quedaremos con la idea de que consiste en extraer todos los elementos de una secuencia, insistimos, todos y asignarles a cada uno de ellos una variable.




Obviamente, tendríamos que contar con tantas variables como elementos contenga la secuencia que queramos desempaquetar. Y qué bien nos viene para saberlo la función len(), ¿eh?

VALLES DEL SUR DE ANAGA, VERTIENTE DE SOTAVENTO, AL ESTE DE TENERIFE, CON EL PICO DE TABORNO PERFILÁNDOSE AL FONDO A LA IZQUIERDA.