martes, 15 de diciembre de 2015

T2. CODIFICACIONES DE CARÁCTER. LA UNIÓN HACE LA FUERZA.

ESTRATIFICACIÓN EN UN CORTE DE LA LADERA DEL BARRANCO DE LEMES, ARICO, SUR DE TENERIFE
     Los primeros ingenieros informáticos concibieron que las computadoras almacenaran cada carácter de cualquier que pasásemos a su memoria interna en un formato específico llamado BYTES, es decir, una secuencia de valores formada por 8 BITS que van desde 0x00 a 0xFF, sin incluir entre medias signos de ningún tipo: he aquí la base numérica del tan temido Código Máquina (¡brrrr!).
Como consecuencia de ello se crearon ESQUEMAS DE CODIFICACIÓN, donde se asignaba a cada carácter concreto un byte propio, exclusivo, que lo define e individualiza con respecto al resto de caracteres. Como no existían por aquel entonces estándares ni convenciones, cada uno "tiró por su lado", y así surgieron esquemas como ASCII y LATIN-1, entre otros que, en parte eran coincidentes, sobre todo en los primeros 127 caracteres en tanto que son los más comunes en el ámbito occidental, pero donde la mayor parte de las especificaciones eran distintas.
Posteriormente se agregaron muchos más esquemas de codificación a la fiesta. Pero al final, en un mudo globalizado, con un trasvase de información continuo y masivo, virtual e intrínsecamente transfronterizo, caló pronto la idea de contar con un esquema común para todos los países. Una de las propuestas en este sentido más sólidas, coherentes en su estructura  y aceptadas en la actualidad es la Codificación Universal (Unicode).
Unicode, de modo similar a los esquemas de codificación originales, asigna cada carácter de un idioma (junto con otros signos) a un número entero, pero con la novedad de que no se limita a usar un único byte por carácter, sino que es capaz de representar, en una sóla línea de bytes, cualquier carácter de cualquier idioma, con más de un millón de caracteres definidos de esta forma hasta la fecha de hoy.
Unicode recurre a un método solvente de almacenamiento como una secuencia de números enteros de 32 bits (4 bytes). Obviamente, sobra espacio en la memoria por carácter que Unicode aprovecha para guardar información en un doble formato:
  • UCS-2: Enteros sin signo de 16 bits (2 bytes) de longitud que representa a los primeros 65535 caracteres.
  • UCS-4: Enteros, con y sin signo, del largo estandarizado de 32 bits (4 bytes) de longitud que representa a todos los caracteres codificados hasta ahora: 1114111.
Cuando Python compila, utiliza uno de estos dos formatos. si sys.maxunicode es 65535 es que está haciéndolo en el primero de ellos; en caso contrario, lo está haciendo con el segundo.



Tanto con los datos que se guardan en archivos como los datos que introducimos en el tráfico de internet, en el caso de Unicode se pueden re-codificar con UTF-8, que poco a poco se va estandarizando cada día más, más sencillo; UTF-16, más complejo, (usa 2 bytes por carácter en lugar de uno, como  UTF-8, que sólo recurre al doble byte, después de los 127 primeros caracteres, lo que lo hace muy parecido a ASCII); ISO-8859-1ISO-8859-5; etc.
Contamos con el método str.encode() de las strings (estudiamos los métodos de las strings en el capítulo siguiente) que devuelve un objeto del tipo de dato bytes, codificado según el argumento que le pasemos:


La 'b' indica que tenemos un literal de tipo byte en lugar de un literal de tipo string (cadena) tal y como lo conocemos. El primer argumento no es CASE SENSITIVE, con lo que da lo mismo que escribamos en minúsculas que en mayúsculas y, además, podemos suprimir signos ortográficos, como los guiones. El segundo, opcional, nos permitirá gestionar los errores.
El método complementario (también 'contramétodo') de str.encode() es un método de los bytes: bytes.decode(), cuya invocación devuelve una cadena de tipo string con los bytes decodificados de acuerdo al esquema de codificación que le hayamos proporcionado:


De manera predeterminada, los módulos de Python, *.py, se almacenan en memoria en formato UTF-8, que como hemos dicho, es un formato sencillo y cada vez más universal, lo que implica que Python entenderá y soportará la casi totalidad de cadenas, cualquiera que fueran sus caracteres componentes, que le pasemos.
Caso aparte ocurre cuando Python recibe datos de fuentes externas al propio programa: internet, intranet, memorias USB, etc., en tanto que desconoce de antemano en qué esquema de codificación está configurada la información por lo que siempre resulta conveniente conocer su codificación y en el caso de que no fuera la deseada, o bien re-codificar a UTF-8, o cuando menos, emplear o traducir a cualquier esquema de codificación subsidiario de Unicode. También es posible descargar traductores desde librerías de terceros aunque no suelen producirse situaciones de este tipo.
Existe un índice de paquetes (packages. Ya veremos lo que son a su debido tiempo) de Python donde se mencionan y se pueden enlazar a algunos que son capaces de detectar la codificación de cualquier archivo que pasemos.

PAISAJE DE ALTA MONTAÑA DESE LA ZONA SUR, PRÓXIMO AL PARQUE NACIONAL DE LAS CAÑADAS DEL TEIDE

jueves, 10 de diciembre de 2015

T3. IDLE DE PYTHON 1.

OTOÑO EN PINOLERE, LADERAS DE LA OROTAVA

     IDLE

     Aprovechemos para conocer un poco mejor nuestro IDLE.
Seguro que ya nos hemos percatado de que, a pesar de que hemos estado utilizando el mismo IDLE, la fuente y el tamaño de nuestros textos no es el mismo que el que encontramos en los ejemplos. ¿Por qué? Pues porque a quien esto escribe le gusta más usar una fuente de la familia VERDANA y con un tamaño mayor al que viene por defecto para que los ejemplos se vean mejor. ¿Y cómo se hace esto?
Pues muy sencillo.
Nos dirigimos a la barra de menús de nuestro adorado IDLE y hacemos clic en Options.


Entonces se nos abre un submenú (un pelín escueto, la verdad) que nos ofrece una opción única: Configure IDLE.



 Hacemos clic en él y nos aparece un nuevo submenú, algo más elaborado.



De entre todas las opciones posibles de la parte superior, nosotros vamos a centrar nuestra atención en la primera: Font/Tabs, esto es, fuentes/tabulaciones. En Base Editor Font tenemos un cuadro que nos oferta un gran número de fuentes posibles a elegir. Aquí podemos escoger la que más nos guste. Simplemente la seleccionamos con el cursor y hacemos clic sobre ella, mostrándose un subrayado en azul para señalarnos dónde está el foco. Su forma particular se nos exhibe en el cuadro inferior. En el ejemplo que sigue hemos seleccionado KARATE y debajo tenemos una muestra de la misma.   



Después podemos elegir el tamaño en Size (entre 12 y 20 está bien. Es una recomendación) y si la queremos resaltar en negrita, clicamos sobre Bold. Cuando estemos satisfechos hacemos clic sobre Apply y Python guardará nuestra selección.



¿Que todavía queremos un poco más? Bueno, vale...
Nos fijamos en la pestaña de la derecha de Fonts/Tabs, esto es, Highlighting.


Debajo de este trabalenguas tenemos un cuadro con el título Custom Highlighting, es decir, el área de trabajo donde podemos modificar los colores (código de color) con el que se nos muestran los datos y comandos en el SHELL a nuestro gusto.
Justo por debajo tenemos dos pestañas enmarcadas en negro: la primera, Choose Colour for:, nos propone que elijamos un color para lo que nos muestra la segunda pestaña, Normal Text. Como por defecto Normal Text, básicamente datos, viene en negro, tal y como podemos observar en el cuadro cromático en el que se nos presenta el código de colores del IDLE de Python, éste es el color que rodea a las pestañas. Vemos como el negro, por ejemplo,  se emplea para los datos numéricos, las variables, los parámetros (param) y el cursor; o como las strings se colorean en verde; o las funciones, como list(), en magenta.

FONDO DEL BARRANCO DEL AGUA, MUNICIPIO DE ADEJE, SUROESTE DE TENERIFE
Ahora hacemos clic sobre la primera pestaña y se nos abre un selector de color en el que podemos seleccionar aquél que más nos guste, pensando siempre que éste se aplicará al elemento que tengamos seleccionado en la segunda pestaña.



Abrimos a continuación la segunda pestaña y seleccionamos Python Strings. Observamos cómo al hacerlo ambas pestañas se rodean de verde. Vamos a al selector de color y seleccionamos el amarillo. Pulsamos sobre Aceptar y veamos lo que sucede:





Espantoso, ¿verdad? Pero entremos más en detalle. Si nos fijamos, debajo de la segunda pestaña se nos ofrecen dos opciones: Foreground, que aparece destacada por defecto, y Background. La primera hace referencia a la fuente en sí, por eso las letras de las strings se nos muestren tintadas de amarillo que es el color que hemos seleccionado. Pero el Background inserta un subrayado de fondo. Si lo seleccionamos, observemos qué ocurre:




Si queremos guardar nuestro 'tema' podemos hacerlo haciendo clic en la pestaña inferior: Save as New Custom Theme, lo que nos abrirá un cuadro de diálogo subsidiario en el que podemos proporcionarle un nombre.
      


Pulsamos Ok y ya lo tenemos guardado en la pestaña que tenemos debajo de Idle Classic. Aquí podremos guardar todas las customizaciones que hagamos para utilizar unas u otras a criterio nuestro.



No nos olvidemos de pulsar Apply al final para que nuestros cambios se lleven a efecto.



En el caso de que queramos eliminar nuestra customización, bien porque no nos convenza o porque ya no nos resulte útil, podemos clicar sobre la pestaña Delete Custom Theme que nos devolverá automáticamente a la configuración anterior (o a la clásica, la que Python incluye por defecto, si no contamos con otra configuración que hayamos guardado previamente. En nuestro caso, seguimos apostando por la customización clásica de Python).



PAISAJE DE LAS CAÑADAS, PARQUE NACIONAL DE EL TEIDE



T1. LOS TIPOS NONE Y BOOLEANO. POCO TEXTO PERO MUCHA ENJUNDIA.

PUESTA DE SOL DESDE EL PINAR DE TÁGARA, CON LA ISLA DE LA PALMA AL FONDO Y EL NORTE DE LA ISLA DE LA GOMERA ASOMANDO POR LA IZQUIERDA.

EL TIPO NONE:

   
      El tipo de dato None significa "nada", "ninguna cosa". Constituye por sí mismo un tipo de dato en Python. Imaginemos que tenemos una pelota de tenis completamente quieta sobre una mesa. Si nos acercamos y ejercemos una fuerza sobre ella de 10 newtons, la pelota se moverá más o menos en la dirección en la que hemos aplicado la fuerza: por ejemplo si lo aplicamos sobre la superficie derecha de la pelota, ésta se moverá hacia la derecha. Fácil, ¿no? Ahora imaginemos que aplicamos una fuerza de 0 newtons sobre la superficie derecha de la pelota... pero la pelota no se mueve. No le hemos aplicado fuerza, ¿verdad? Como es igual a cero... ¡Falso! ¡Falso de toda falsedad! Sí que le hemos aplicado una cantidad de fuerza, pero como ésta tiene un valor nulo, la pelota no se mueve. Si None significa "nada" o "ninguno", ¿podemos decir, en términos "pythonianos", que hemos aplicado a la pelota una fuerza None, teniendo en cuenta que ésta es nula o igual a 0? No. Porque sí que hay algo: una fuerza que hemos ejercido sobre la pelota. Otro caso es que ésta sea nula o igual a cero.
Luego None no significa que algo es igual a cero.
Imaginemos ahora que declaramos una variable y que le asignamos como valor una string vacía, a = " ", por ejemplo, porque sabemos que ya "tomará cuerpo" cuando un usuario introduzca un dato. No hay nada, no vemos nada. ¿Podemos decir entonces que es igual a None porque no contiene nada? ¡No, por Dios! Sí que hay algo: una string, vacía, sí, pero una string
Luego None no significa que algo esté vacío.
Tampoco None significa FALSE, que es un tipo de dato booleano.
¿Y para qué sirve entonces el tipo de dato None?
Para inicializar una variable previamente declarada si no sabemos de antemano qué tipo de dato va contener: a = None. También para introducir una variable "comodín" dentro del código para que se le "autoasigne" un valor durante la ejecución del script.
Podemos asignar None a cualquier variable que queramos, pero no podemos crear un objeto None por nosotros mismos.
Mostramos un ejemplo:




Sin embargo, tengamos en cuenta que None sí que cuenta como objeto, es algo en sí mismo, tiene "peso". Por eso no podemos usarlo en codificaciones como la que se muestra a continuación porque nos daría error:



EL TIPO BOOLEANO:

    
     Los BOOLEANOS constituyen un tipo de dato integrado compuestos por dos únicos elementos: TRUE ("verdadero") y FALSE ("falso"). la función de conversión correspondiente es bool()
  1.      bool() => Si no lleva argumentos devuelve False.
  2.      bool(argumento booleano) => Devuelve una copia del argumento.
  3.      bool(argumento) =>  Trata de convertirlo a booleano.
Veamos un ejemplo:



Los booleanos resultan extremadamente útiles en las comparaciones entre objetos, en las verificaciones (si un objeto A está contenido o no dentro de un objeto B), en las aserciones (si cuando afirmamos que tal objeto es tal objeto estamos equivocados o no), en las validaciones, a la hora de establecer identidades absolutas, y en los controles de flujo del código a través de autoevaluaciones continuas: Que A es True, pues hago esto o continúo haciendo lo otro; que A ahora resulta False, pues dejo de hacer lo que estaba haciendo y hago esto otro.

     
      COMO CURIOSIDAD CURIOSA, EL VALOR DE True SE CORRESPONDE CON EL ENTERO 1, MIENTRAS QUE EL DE FALSE SE CORRESPONDE CON EL VALOR 0. COMO AMBOS SON NÚMEROS ENTEROS, ES POSIBLE REALIZAR OPERACIONES ARITMÉTICAS CON LOS BOOLEANOS, ESO SÍ, MUY SIMPLES. INCLUSO PODEMOS CONVERTIR A UN BOOLEANO True O False MEDIANTE LA FUNCIÓN int() EN SUS CORRESPONDIENTES ENTEROS. ¿QUERÉIS VERLO? PUES NADA, MIRAR ABAJO:





El tipo de dato booleano lo veremos muchísimo a lo largo de este manual, por lo que todavía aprenderemos alguna cosilla más sobre ellos y su utilidad pero, sobre todo, con los ejemplos, los veremos en funcionamiento que es lo que realmente importa, ahí, ahí, dando siempre lo mejor de sí mismos.
Aunque podamos repetirla en otro lugar dentro de este manual, implementemos aquí una tabla con los OPERADORES DE COMPARACIÓN, de uso común con los booleanos:

Añadimos a continuación una tabla de OPERADORES LÓGICOS, que actúan sobre expresiones que contienen a su vez operadores de comparación. Al final de la tabla incluimos ejemplos de uso de los distintos operadores lógicos:










Un último detalle a tener (muy) en cuenta: Python asocia un valor binario a los booleanos, de tal modo que True tiene un valor de tipo entero asignado igual a 1, y False tiene un valor de tipo entero asignado igual a 0. Consecuentemente, True == 1 y False == 0. ¿Que se nos hace difícil creerlo? Pues miremos esto:



Esta circunstancia, según lo que busquemos conseguir con nuestros códigos, puede resultar un recurso más o una desventaja: de nosotros depende. He aquí un ejemplo de lo que puede ocurrir con el paso de tipos booleanos como datos o valores:



Lo dicho: tengámoslo (muy) en cuenta.


PUNTA DE ANTEQUERA, EN EL EXTREMO ORIENTAL DEL MACIZO DE ANAGA.

viernes, 4 de diciembre de 2015

T4. BLOQUE DE EJERCICIOS 1. SOLUCIONES.

     Lee bien el enunciado de los ejercicios antes de ponerte a ello. Todos son fáciles de resolver, unos un poco más que otros y, para algunos, existe más de una manera correcta de solucionarlos. Si no das con la solución al instante, no te preocupes: es normal. Tantea todas las posibilidades lógicas que se te ocurran y prueba a ver qué sucede.
     Este manual no tiene ninguna exigencia académica, no te somete a ninguna obligación salvo la o las que tú mismo te impongas, así que no debes sentirte agobiado, contrariado o frustrado. Tan sólo procura esforzarte lo que estimes conveniente, aprende cuanto puedas y, sobre todo, ¡DISFRUTA! ¡Yo lo conseguí entre buche y buche de pienso!


RETAMAS Y CODESOS EN FLOR EN EL PARQUE NACIONAL DE LAS CAÑADAS DEL TEIDE


martes, 1 de diciembre de 2015

T1. OPERADORES DE LAS STRING. TAMBIÉN TIENEN DERECHO.

QUEBRADAS EN EL MACIZO DE TENO, ZONA DE MASCA, CON EL TEIDE ASOMANDO AL FONDO
     De la misma forma que los números, fuera cual fuese su tipo, cuando hablábamos del uso de Python como calculadora, soportan OPERADORES ARITMÉTICOS para interactuar entre ellos; construir expresiones aritméticas simples como la suma, la exponenciación, la resta, etc. y devolver un resultado, las STRING, qué menos,  cuentan también con sus propios OPERADORES DE LAS STRING para interactuar entre ellas, hacer ciertas cosas y devolver un resultado.
Empecemos por los ESCAPES:
A) OPERADOR \ (llamado "barra invertida", "backslash" o "contrabarra"): Se utiliza normalmente para escapar comillas. Si escribimos esto:


Observaremos que no tenemos ningún problema a la hora de mostrar el resultado. pues el genitivo sajón (¡ay, ese inglés!) es una sola comilla ("single quote"), Barney's, como una substring que forma parte de una string que la contiene y que hemos acotado entre comillas dobles ("double quotes"). Si en lugar de hacerlo así hubiéramos empezado y terminado nuestra string con comillas simples, hubiera ocurrido esto:



Para evitar esto usamos un operador \ que colocamos detrás de la comilla. En este caso la frase se mostrará de manera correcta:


Veámoslo también en estos otros ejemplos:


Para hacer desaparecer las comillas que encierran nuestras frases podemos recurrir a la función print() que nos devuelve un resultado más natural, sin "corsé":


 Para finalizar, estudiemos el siguiente ejemplo:



En 1 empleamos una única barra invertida dentro de la string porque hemos dispuesto que nos salga así. Sin embargo, cuando a continuación llamamos a la variable para que nos muestre lo que tiene almacenado en su espacio de memoria, nos muestra una doble barra invertida, dado que es así como Python la conserva en memoria para su consumo interno. Pero si le pasamos la función print(), aquéllo que el usuario ve impreso en pantalla como sabemos, Python nos devolverá la string con una única barra invertida. En 2, como vemos, sucede igual, a pesar de que en esta ocasión hemos introducido una doble contrabarra en la string que hemos asignado a la variable a: la función print() nos devuelve de nuevo una única barra invertida, como en el caso precedente. Si quisiéramos que la función print() imprimiera las dobles barras tendríamos que escribir tres en la string de la asignación: a = "numerador\\\denominador".

TABAIBAS DULCES SOBRE BANCALES ABANDONADOS EN LA COSTA DE MASCA, FRENTE AL MAR
B) OPERADOR \n: Antes que nada: Al conjunto de contrabarra más carácter se le llama SECUENCIA DE ESCAPE.  Permite escribir en renglones distintos, con los textos separados por el operador unos encimas de otros. Esto es lo que se llama un SALTO DE LÍNEA.
     Tomemos el siguiente ejemplo:


Tal y como podemos ver, la ejecución nos ha devuelto el resultado en "columna", un resultado ITERADO como se suele decir en la jerga de Python, con el matiz peculiar de que la primera entrada va a mostrase siempre un pelín más hacia la izquierda que las demás. Para evitar esto nos basta con dejar un espacio en blanco entre la comilla de apertura y el primer carácter de la substring:


Tengamos presente, sin embargo, que esto sucede así siempre y cuando declaremos el resultado a través de la función print(), porque si lo hacemos directamente desde la variable, esto es lo que ocurre:


Indudablemente, no es éste un resultado lógico ni deseable.
Existe una segunda posibilidad para escribir líneas de texto en renglones distintos: la triple comilla, ("triple quotes"). Éramos pocos y parió la abuela, vaya. Cuando recurrimos a este sistema, una vez hemos completado nuestra primera línea de texto, pulsamos ENTER y, automáticamente, bajamos una línea, sin que nos aparezca el prompt. Fijémonos en que los textos siguen coloreándose en ese verde tranquilizador y sosegante, que nos indica que seguimos construyendo una string dentro de los cánones correctos de Python. Al cabo, cuando hayamos escrito nuestra última línea, cerramos con las tres comillas de rigor (""" o ''', según hayamos optado por las dobles o las simples), y listo. Llamamos a la función print() que nos mostrará el resultado en pantalla:


Notemos que en esta ocasión, la primera línea no está desplazada hacia la izquierda mostrando una iteración perfectamente alineada en todas sus entradas, tres en este caso.
Insistimos: debemos invocar a la función print() para que se nos muestre el resultado tal y como esperamos verlo, porque si lo hacemos directamente desde la variable, esto es lo que ocurre:



Observa que Python realiza una interpretación similar a que si hubiéramos empleado \n.
Un apunte final: las comillas triples tendrán su particular intríngulis cuando hablemos de las DOCSTRINGS. Pero como terminaban las películas de Conan el Bárbaro, "Ésa es otra historia", una historia que, claro está, estudiaremos en su momento.

FLOR DE LA GAMONA EN LA CAMPIÑA DE IFONCHE, VILAFLOR.
C) OPERADOR r: Constituye un caso muy singular. Configura lo que se llama una RAW STRING, una "CADENA CRUDA", traducido al castellano, y de ahí el carácter r, de "raw", que da nombre al operador. Se utiliza para salvar una barra invertida seguida de n, el caso anterior, vamos,\n, cuando ésta tiene alguna significación, por ejemplo, cuando escribimos una url completa o una ruta en las que, casualmente, se da el caso:


 Para corregir este error tan sólo tendremos que escribir r antes de las comillas:


Básicamente, con el operador r se pretende solventar posibles conflictos de sintaxis. Observemos el ejemplo siguiente:


La excepción nos advierte de que se ha producido un error en el carácter de escape \n que es interpretado por Python como un salto de línea, y que el también carácter de escape \t, que ya estudiaremos en su momento, es una tabulación horizontal. Esto es lo que evita precisamente la RAW STRING, la CADENA CRUDA. Para crearla tan sólo tenemos que anteponer la letra r/R, en tanto que admite tanto la minúscula como la mayúscula, a la comilla, simple o doble, de apertura, lo que inducirá a Python a ignorar la condición de secuencias de escape de las expresiones \n y \t:


Pongamos nuestra atención en el detalle: a pesar de que escribimos la r/R fuera del ámbito de las comillas, Python nos la colorea en verde. Es su manera de hacernos saber que está interpretando la cadena como una RAW STRING.
Como hemos podido ver en el ejemplo, nos sirve igualmente una doble barra invertida, en tanto que la segunda contrabarra constituye un escape para la primera, con lo que obtenemos un resultado similar al que tendríamos de haber recurrido a la RAW STRING.
Existen todavía algunos operadores más que estudiaremos algunos capítulos más adelante, cuando la emprendamos con las EXPRESIONES REGULARES, y que cumplen una función muy específica (y hasta divertida, sí, aunque cueste creerlo), pero en principio nos quedamos con estas tres que son las más habituales, más unas pocas que vemos a continuación.

OPERADORES ARIMÉTICOS COMO OPERADORES DE LAS STRING



     Podemos utilizar dos operadores aritméticos, los operadores + y *, para realizar ciertas operaciones con las string. Veamos cuáles:
A) OPERADOR +: Se utiliza para concatenar variables, o una variable con un carácter literal o conjunto de caracteres literarios. Ejemplo:


     
Como acabamos de ver, la función print() también admite como argumento expresiones no excesivamente complejas, como la suma, que hemos representado en el ejemplo, redundando en una de sus características fundamentales: su versatilidad.
Veamos un ejemplo clásico de su uso:


B) OPERADOR *: Se utiliza para repetir de forma concatenada una string tantas veces como indique la cifra que escojamos. Ejemplo al canto: 



CASONA RURAL EN RUINAS EN LA LADERA DE IFONCHE