| VISTA DE LA ISLA DE LA GOMERA DESDE LOS MONTES DE GUÍA DE ISORA, OESTE DE TENERIFE. |
UN ESPACIO VIRTUAL, PÚBLICO Y GRATUITO, PARA APRENDER A PROGRAMAR EN PYTHON CON EL MENOR ESFUERZO POSIBLE.
PYTHON PARA TODOS
- INTRODUCCIÓN.
- EMPEZAMOS
- ARITMÉTICA BÁSICA.
- VARIABLES
- LA FUNCIÓN TYPE()
- PRIMEROS SCRIPTS
- SINTAXIS DE PYTHON
- STRINGS
- MÉTODOS DE STRINGS
- LISTAS I
- LISTAS II
- MÉTODOS DE LAS LISTAS
- TUPLAS
- CONJUNTOS (SET Y FROZENSET)
- DICCIONARIOS Y SUS MÉTODOS
- IF-ELIF- ELSE
- BUCLE FOR/IN
- BUCLE WHILE
- LOS COMENTARIOS
- DOCSTRINGS
- FUNCIONES DEFINIDAS POR EL USUARIO I
- FUNCIONES DEFINIDAS POR EL USUARIO II
- FUNCIONES DEFINIDAS POR EL USUARIO III. PARÁMETROS.
- FUNCIONES DEFINIDAS POR EL USUARIO IV: ARGUMENTOS
- TRATAMIENTO DE EXCEPCIONES
- CREAR, ABRIR Y ESCRIBIR ARCHIVOS
- FUNCIONES DE ORDEN SUPERIOR
- LA FUNCIÓN MAIN()
- LOCALS(), GLOBALS() Y VARS()
- FUNCIONES exec(), hash() Y zip().
- EXPRESIONES REGULARES 1
- EXPRESIONES REGULARES 2
- PILAS Y COLAS
- GENERATORS
- ITERATORS
- DECORATORS
- EJECUTABLES O DISTRIBUIBLES DE MÓDULOS PYTHON
- INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS...
- CLASES I
- CLASES II
- CLASES III
- DOCSTRINGS Y VARIABLES DE CLASE
- IMPORT Y POO
- SUPUESTO 1
- PEQUEÑOS CÓDIGOS ÚTILES
- VISIBILIDAD
- MÉTODOS DE CLASE, ESTÁTICOS Y @PROPERTY
- MÉTODOS ESPECIALES
- HERENCIA
- LA FUNCIÓN SUPER()
- LA FUNCIÓN ISINSTANCE()
- SOBRESCRITURA DE MÉTODOS
- POLIMORFISMO Y DUCK TYPING
- SUPUESTO 2
- NAMEDTUPLES
- PATRÓN SINGLETON
- PRUEBAS UNITARIAS
sábado, 27 de febrero de 2016
lunes, 1 de febrero de 2016
T3. IDLE DE PYTHON 3
| PICO DE TABORNO, UN PITÓN DE INTRUSIÓN VOLCÁNICA EN EL PARQUE RURAL DE ANAGA, CON BREZOS EN PRIMER PLANO, ESTE DE TENERIFE. |
Imaginemos, tal y como nos muestra la captura inferior, que estamos desarrollando un programa y se produce un error (aprovechamos para recordar que en la nomenclatura de Python, a esta clase de evento se la denomina lanzar una excepción, como ya hemos dicho en ocasiones anteriores). Nuestro programa ya cuenta con un tamaño considerable, con un bloque de contenido más o menos grueso, y nos molesta ver ese texto en rojo centrando nuestra atención, más si cabe si sólo estamos codificando o haciendo simples testeos. A pesar de que tras lanzar la excepción Python, muy gentilmente, nos pone a nuestra disposición un prompt libre para continuar con la tortura... No, decididamente, no: No queremos ver ahí ese texto en rojo advirtiéndonos de que somos humanos. ¿Qué podríamos hacer?
Podemos hacer un RESTART, de RE-START, es decir, RE-COMENZAR.
Para hacerlo nos situamos en la barra de menús y hacemos clic en la pestaña shell. Cuando lo hacemos se abre un pequeño cuadro de diálogo y seleccionamos la segunda opción: restart shell (a la derecha se nos muestran atajos de teclado, para quienes gusten de recurrir a ellos).
Y hacemos clic. Ahora ya tenemos nuestro SHELL dividido por una concatenación de símbolos de igualdad, que separa el código antiguo de un nuevo espacio libre donde recomenzar nuestro programa
o comenzar otro distinto. Por cierto que si hacemos clic en la pestaña windows y luego en zoom heights, podemos aumentar en altura (heights) nuestro SHELL. Haciéndolo una segunda vez se nos muestra en pantalla completa.
o comenzar otro distinto. Por cierto que si hacemos clic en la pestaña windows y luego en zoom heights, podemos aumentar en altura (heights) nuestro SHELL. Haciéndolo una segunda vez se nos muestra en pantalla completa.
Por supuesto, podemos hacer un copy-paste de las líneas de código que nos interesen del primer programa e importarlas al nuevo prompt en blanco que nos ofrece restart.
La opción de restart resulta extremadamente útil cuando trabajamos con condicionales y, por un error u omisión en la programación, entramos en un bucle infinito. La mejor manera de "romperlo" es, precisamente, a través de restart.
Tenemos la opción de acudir a un atajo de teclado para recobrar la última línea de un código, aquélla que suele ser la causante del error, para recuperarla tras lanzar Python la excepción y modificarla sobre la marcha, a pesar de que sigamos teniendo enfrente el dichoso texto en rojo. Esta combinación de teclas puede ser, según tengamos configurado nuestro teclado, alt + p o alt gr + p.
IMPORTANTE: repite siempre la última línea de texto, aún cuando no se haya lanzado excepción alguna, tantas veces como usemos el atajo:
Dedicaremos más adelante una entrada exclusiva a los atajos de teclado en Python.
Resumiendo: con restart, empezamos de nuevo a codificar todo nuestro script desde el principio, con lo que dejaremos atrás la excepción si lo que buscamos es un programa limpio, como un escrito sin borrones ni tachaduras. Con el atajo de teclas, alt + p, o bien, alt gr + p, reescribimos junto al primer prompt vacío la última línea codificada antes de lanzarse la excepción (o la última línea codificada, haya habido o no excepción), permitiéndonos Python efectuar las correcciones pertinentes sobre ella sin necesidad de volver a escribirla toda, y proseguir tranquilamente con nuestro código.
Resumiendo: con restart, empezamos de nuevo a codificar todo nuestro script desde el principio, con lo que dejaremos atrás la excepción si lo que buscamos es un programa limpio, como un escrito sin borrones ni tachaduras. Con el atajo de teclas, alt + p, o bien, alt gr + p, reescribimos junto al primer prompt vacío la última línea codificada antes de lanzarse la excepción (o la última línea codificada, haya habido o no excepción), permitiéndonos Python efectuar las correcciones pertinentes sobre ella sin necesidad de volver a escribirla toda, y proseguir tranquilamente con nuestro código.
| VEREDA ENTRE CAMPOS DE LABOR HACIA EL INTERIOR DE LA LAURISILVA EN ANAGA, ESTE DE TENERIFE. |
viernes, 15 de enero de 2016
T3. IDLE DE PYTHON 2
| OREJA DE RATÓN (IMAGEN CENTRAL) Y, A LA DERECHA, RETOÑO DE HIERBA CAPITANA, SOBRE LA HOJARASCA DE OTOÑO EN LAS MEDIANÍAS DE LA GUANCHA, NORTE DE TENERIFE. |
Vamos a aprender algunas cosas nuevas sobre el IDLE de Python. Subrayaremos algo que, seguramente, ya conocemos a poco que hayamos trasteado a nuestro aire con los comandos. Es una solución que nos vendrá de perillas cuando el grado de complejidad de nuestros programas vaya en aumento y tengamos que repetir datos y/o líneas de comando a lo largo y a lo ancho de nuestros bloques de código: el copia y pega ("copy and paste").
Cuando queramos copiar una línea de código, total o parcialmente, (recordemos que una línea de código es, en síntesis, y desde la perspectiva de nuestro IDLE, aquéllo que escribimos a la derecha del prompt y que finaliza justo antes del siguiente . No copiemos más de una línea de código, porque incluiremos en el bloque prompts que Python no podrá leer y nos lanzará una excepción: cada copia útil afecta a una sola línea de código o bloque de código, siempre indentado o sangrado en este último caso, que escribamos a la derecha de un único prompt) y ponerlo en otro prompt distinto, no tenemos más que pasar el cursor por encima, arrastrándolo por el pedazo de línea de código que queramos copiar mientras se sombrea en gris la porción de línea seleccionada, presionando con el botón izquierdo del ratón.
¡Aviso al canto! Como podemos observar claramente en los ejemplos previos, no copiemos el prompt: sólo la línea de código completa o la porción de ella que nos interesa pues, repetimos, de lo contrario Python lanzará un excepción del tipo SyntaxError.
Una vez estemos satisfechos con nuestro subrayado y dispongamos de un prompt vacío donde "pastear", pulsamos el botón derecho para que se nos abra un escueto cuadro de diálogo. Sobre él hacemos clic en copy.
Buscamos a continuación ese prompt vacío junto al cual queremos pastear la copia y hacemos clic con el botón derecho del ratón para que se nos abra nuevamente el mismo cuadro de diálogo.
Finalmente hacemos clic sobre paste y ya está.
Procuremos pegarla bien al prompt porque de lo contrario Python lanzará una nueva excepción, esta vez, advirtiendo de un error de sangrado o indentación, y nuestro gozo en un pozo.
Podemos conseguir un resultado similar acudiendo a la pestaña edit del IDLE.
Para hacerlo sombreamos el texto primero y luego hacemos clic sobre edit para que se nos abra el cuadro de diálogo correspondiente, ya lo sabemos, con el botón izquierdo del ratón.
Con el cuadro de diálogo abierto seleccionamos copy, salimos al SHELL, situamos el cursor junto al prompt que nos interesa y, o bien procedemos como en el caso anterior, o bien volvemos a hacer clic sobre edit, clicamos a continuación sobre paste y salimos de nuevo al SHELL para comprobar el resultado.
Como hemos venido haciendo hasta ahora, poco a poco iremos aprendiendo cosas nuevas de nuestro compañero de fatigas: el IDLE de Python.
Cuando queramos copiar una línea de código, total o parcialmente, (recordemos que una línea de código es, en síntesis, y desde la perspectiva de nuestro IDLE, aquéllo que escribimos a la derecha del prompt y que finaliza justo antes del siguiente . No copiemos más de una línea de código, porque incluiremos en el bloque prompts que Python no podrá leer y nos lanzará una excepción: cada copia útil afecta a una sola línea de código o bloque de código, siempre indentado o sangrado en este último caso, que escribamos a la derecha de un único prompt) y ponerlo en otro prompt distinto, no tenemos más que pasar el cursor por encima, arrastrándolo por el pedazo de línea de código que queramos copiar mientras se sombrea en gris la porción de línea seleccionada, presionando con el botón izquierdo del ratón.
¡Aviso al canto! Como podemos observar claramente en los ejemplos previos, no copiemos el prompt: sólo la línea de código completa o la porción de ella que nos interesa pues, repetimos, de lo contrario Python lanzará un excepción del tipo SyntaxError.
Una vez estemos satisfechos con nuestro subrayado y dispongamos de un prompt vacío donde "pastear", pulsamos el botón derecho para que se nos abra un escueto cuadro de diálogo. Sobre él hacemos clic en copy.
Buscamos a continuación ese prompt vacío junto al cual queremos pastear la copia y hacemos clic con el botón derecho del ratón para que se nos abra nuevamente el mismo cuadro de diálogo.
Finalmente hacemos clic sobre paste y ya está.
Procuremos pegarla bien al prompt porque de lo contrario Python lanzará una nueva excepción, esta vez, advirtiendo de un error de sangrado o indentación, y nuestro gozo en un pozo.
Podemos conseguir un resultado similar acudiendo a la pestaña edit del IDLE.
Para hacerlo sombreamos el texto primero y luego hacemos clic sobre edit para que se nos abra el cuadro de diálogo correspondiente, ya lo sabemos, con el botón izquierdo del ratón.
Con el cuadro de diálogo abierto seleccionamos copy, salimos al SHELL, situamos el cursor junto al prompt que nos interesa y, o bien procedemos como en el caso anterior, o bien volvemos a hacer clic sobre edit, clicamos a continuación sobre paste y salimos de nuevo al SHELL para comprobar el resultado.
Como hemos venido haciendo hasta ahora, poco a poco iremos aprendiendo cosas nuevas de nuestro compañero de fatigas: el IDLE de Python.
![]() |
| TROZO DE LAURISILVA EN EL BOSQUE DE AGUAGARCÍA, TACORONTE, CENTRO-ESTE DE TENERIFE |
jueves, 14 de enero de 2016
miércoles, 30 de diciembre de 2015
T2 LOS MÉTODOS STR.MAKETRANS() Y STR.TRANSLATE(), DOS AMIGOS MUY BIEN AVENIDOS.
![]() |
| COSTA NORTE DE TENERIFE DESDE LAS LADERAS DE EL SAUZAL, CON EL ACANTILADO DE ACENTEJO AL FONDO |
Los métodos de las strings str.maketrans() y str.translate(), y por este orden, son interdependientes, conjugándose mutuamente para obtener un resultado. Con el primero, cuya traducción libre podría ser precísamente ésa, "hacer una traducción", podemos pasar dos argumentos en formato de tabla ("TABLE") aunque esto, salvo en el caso de que vayamos a hacer una traducción profunda, en toda regla, resulta muy laxo, como podremos ver en los ejemplos. En ambos casos deben ser cadenas de texto, strings, siendo el primero de los argumentos la cadena donde se encuentran los caracteres literarios que vamos a traducir; y el segundo, los caracteres literarios a los que deben traducirse los primeros. Contamos, además, con la opción de pasar un tercer argumento que nos permite eliminar caracteres si así lo deseamos.
El primer y segundo argumento deben tener la misma longitud para que la traducción pueda llevarse felizmente a cabo, por lo que podemos recurrir a la función len() como controlador. El método str.translate(), "traducción" lleva como argumento al propio método str.maketrans(), por lo que conviene asignar siempre a este último una variable para volverlo más manejable, aplicándosele a la string sobre la que invoquemos el método str.translate(), devolviéndonos así la susodicha cadena con los caracteres literales modificados de acuerdo a nuestra propuesta de traducción.
En el caso de str.maketrans(), no introducimos una cadena concreta sino que, o bien dejamos una cadena vacía, " ", o bien la llamamos por el nombre de tipo de objeto, str, dado que se trata de un método estático que funciona a partir de su condición como argumento de str.translate(), y de aquí que habláramos al comienzo de esta entrada de interdependencia entre ambos.
Para finalizar, en el caso de traducciones más complejas tenemos a nuestra disposición el módulo codecs de la librería estándar de Python.
Y ahora otro ejemplo con tercer argumento para str.maketrans():
![]() |
| VISTA DEL TEIDE DESDE EL MACIZO DE TENO, PRÓXIMO AL BARRANCO DE GUERGUES, NOROESTE DE TENERIFE. |
jueves, 24 de diciembre de 2015
T2. EL MÉTODO STR.FORMAT(*ARGS, **KWARGS) Y LA FUNCIÓN FORMAT() AL DESCUBIERTO.
![]() |
| PLAYA DE LA COSTA DE ABADES, CON ESTRUCTURAS EROSIONADAS POR EL VIENTO Y EL MAR SOBRE LOS RESTOS DE UNA PLAYA DE ARENISCA FÓSIL. |
Este método constituye en sí mismo una herramienta muy potente que Python pone a nuestra disposición para configurar formatos de salida de datos en forma de cadenas. Recordemos que su función es la devolver una cadena con una estructura nueva, diferente a la original, donde los campos de reemplazo son sustituidos por los argumentos que hayamos pasado. Mostramos un ejemplo:
Observemos como '*args' hace referencia a tipos de datos mientras que '**kwargs' hace referencia a keywords, palabras-clave que apuntan a otros tipos de datos, muchas veces, funciones. El asterisco en 'args' hace referencia a que admite diferentes tipos de datos, incluso, expresiones matemáticas: string, int, float, list,..., mientras que el doble asterisco en 'kwargs' refiere que la inclusión de keywords es opcional, pudiendo coexistir más de una keyword en el argumentado del método.
Veamos un par de ejemplos. En el último, introducimos un troceado (slicing) de una cadena. Como podemos comprobar, en todos los casos obtenemos resultados óptimos.
Cono ya sabemos, los campos de reemplazo se distinguen visualmente con llaves, {...}, siendo su nombre o identificación un número entero cuyo orden será correlativo a la posición (o índices) de los argumentos que pasemos a la función: {0} corresponde al primer argumento de la función, {1} al segundo, {3} al tercero, y así sucesivamente. Por cierto, si queremos incluir llaves en nuestro formato de salida tan sólo tenemos que duplicarlas. Tan sencillo como eso:
Una característica singular de los campos de reemplazo es su capacidad para adoptar diferentes sintaxis.
La primera formulación sintáctica, como dejamos bien claro, es la más común y frecuente, mientras que las tres siguientes son formulaciones más técnicas que a tienden a:
- CONVERSIÓN: Cadena traducida a un esquema de codificación específico.
- FORMATO: Nombre del esquema de codificación (UTF-8, ASCII. LATIN-1, etc.) al que se ha traducido la cadena.
Si hacemos memoria y repasamos lo que hemos aprendido sobre las concatenaciones de las strings, recordaremos que no podemos concatenar una cadena con un entero. Sin embargo, podemos soslayar este 'inconveniente' mediante la función str.format(*args, **kwargs):
El método también nos permite concatenar strings pero para eso es mejor utilizar el método específico str.join(iterable) de las strings que va mucho mejor. ¿He dicho ya que me gustan las galletas?
![]() |
| VISTA DEL TEIDE TRAS EL MONTEVERDE Y EL PINAR, DESDE LOS ALTOS DE LA CORONA, LOS REALEJOS COMARCA DE LA ISLA BAJA, NORTE DE TENERIFE |
NOMBRES DE CAMPO
Cuando hablamos de NOMBRES DE CAMPO nos estamos refiriendo a aquéllo que introducimos entre las llaves, que bien, como ya sabemos, puede ser un número entero o cadenas que apuntan a otra cadena u otro tipo de dato,
Vemos cómo podemos utilizar palabras-clave (keywords) para manejar datos en el formateo final. Por ejemplo, en el primer caso, creamos una keyword que llamamos "nombre" y que, como es preceptivo, insertamos entre llaves, {nombre}, y le asignamos en la lista de argumentos el valor "Javier", que como podemos ver en el momento de ejecutarse el script, asume aquí la correspondiente traducción. Comprobamos también que en una misma cadena a formatear podemos incluir tanto argumentos posicionales como argumentos de palabra-clave aunque, eso sí: en el momento de pasar los argumentos a la función, los argumentos posicionales (args) van PRIMERO y los argumentos de palabra-clave(kwargs) van DESPUÉS.
Hemos dicho que que podemos pasar listas (list) y diccionarios (dict) como "args" de la función str.format(*args, **kwargs). Cuando queramos llamar a alguno de los elementos de la lista lo identificamos por su índice para incluirlo en el campo de reemplazo. Veamos cómo hacemos esto:
También Python nos facilita acceder a los atributos con nombre en str.format(*args, **kwargs). Vamos a verlo:
A modo de resumen, presentamos el siguiente esquema con las equivalencias entre argumentos posicionales y argumentos de palabras-clave:
![]() |
| SETA EN EL SOTOBOSQUE DEL MONTE DE AGUAGARCÍA, TACORONTE-EL SAUZAL, NORTE DE TENERIFE |
ESPECIFICADORES DE FORMATO
La función principal de un ESPECIFICADOR DE FORMATO consiste en modificar a nuestra conveniencia el formato de salida de un script. Veamos un cuadro sintáctico basado en el que proporciona Mark Summerfield, en Pyhton 3, editorial ANAYA Multimedia, libro dedicado a la programación en Python, a un nivel medio-avanzado, cuya lectura recomendamos para reforzar nuestro aprendizaje al cabo de este manual (v. página dedicada al listado de links).
CADENAS:
Lo primero de todo, y de manera general tanto para cadenas, como para enteros y decimales, pasa por hacerle saber al intérprete de Python mediante la sintaxis pertinente de que vamos a hacer una especificación de formato con la inclusión de dos puntos, :, En el caso de las strings que nos ocupa , podremos controlar tres aspectos: el carácter (o los caracteres) de relleno, la alineación que queramos para el campo de reemplazo y sus anchuras máximas y mínimas.
Una vez hemos introducido los dos puntos preceptivos a la derecha del argumento posicional, podremos escribir, opcionalmente, un carácter (o varios) de relleno y un carácter de alineación que determinará su dirección adjuntando el signo correspondiente. A continuación podemos introducir un tipo de dato entero para determinar la anchura mínima de la cadena que nos devuelva la función. En el caso de que queramos hacer lo propio con la anchura máxima. colocaremos al final, tras un punto, un tipo de dato entero.
Proponemos una batería de ejemplos ilustrativos:
Es posible declarar un campo de reemplazo dentro de las propias especificaciones de formato. y ésto, además, lo podemos hacer de dos maneras distintas:
ENTEROS:
En su caso, la especificación de formato permite escoger el carácter (o caracteres) de relleno, un carácter de alineación que determinará la dirección a la derecha o a la izquierda, su signo, la anchura mínima que pueda tener el campo de reemplazo y, finalmente, la base (binaria, hexadecimal u octal).
| PINARES EN LA CABECERA DEL BARRANCO DE AÑAVINGO, SUR DE TENERIFE |
La especificación de formato de un tipo de dato entero, int,
igual que sucede con la especificación para las cadenas, comienza con los dos puntos obligatorios, a partir de los cuales podemos introducir, opcionalmente, un carácter (o caracteres) de relleno (ya sabemos que éste no puede ser {}), otro de alineación, un signo (con + se muestra obligatoriamente el entero con un espacio, mientras que con - se mostrará sólo si éste es negativo con el signo menos delante), un entero que determina la anchura mínima y que puede venir precedido por # para mostrarnos también el prefijo de la base, y por último, un valor 0 con el que obtendríamos un relleno con ceros.
igual que sucede con la especificación para las cadenas, comienza con los dos puntos obligatorios, a partir de los cuales podemos introducir, opcionalmente, un carácter (o caracteres) de relleno (ya sabemos que éste no puede ser {}), otro de alineación, un signo (con + se muestra obligatoriamente el entero con un espacio, mientras que con - se mostrará sólo si éste es negativo con el signo menos delante), un entero que determina la anchura mínima y que puede venir precedido por # para mostrarnos también el prefijo de la base, y por último, un valor 0 con el que obtendríamos un relleno con ceros.
Para el caso de las bases, podemos optar por una salida diferente a la base 10 estándar asociando los caracteres de tipo adecuados (b => binarios, x (minúscula) => hexadecimales, X (mayúscula) => hexadecimales en mayúsculas, o => octales y d => valores enteros decimales). Terminamos con otros dos tipos de caracteres: c, que muestra los caracteres Unicode del valor entero sobre el que aplicamos el método, y n, que devuelve al entero de acuerdo a su entorno.
Presentamos un esquema para verlo mejor:
Ejemplos de uso:
Sí, aunque parezca mentira con el tremendo empacho de cadenas que llevamos, existe en Python una función (no un método, ¡cuidado!, que es una función dependiente de una clase, como es el caso que hemos visto hasta ahora de str.format(), donde format() es el método y str la clase a la que pertenece) que se ocupa de formatear la salida de números: format().
Presentamos un esquema para verlo mejor:
Ejemplos de uso:
NÚMEROS DE PUNTO FLOTANTE (FLOAT):
En el caso de los floats podemos escoger el carácter (o caracteres) de relleno, la alineación que queramos darle al campo, el signo, su tamaño mínimo y una cantidad ponderada de dígitos decimales. a la derecha del punto, pudiendo elegir entre presentar el float bajo formato exponencial, estándar o porcentual. Su especificación de formato coincide con la de los valores enteros excepto por por dos puntos que vamos a considerar a continuación:
- Adicionalmente al tamaño mínimo que, reiteramos, es opcional, podemos determinar la cantidad de decimales a mostrar escribiendo un punto y un valor entero a continuación.
- Opcionalmente también, es posible añadir al final un carácter de tipo:
B) f => formato estándar de punto flotante.
C) g => formato "general", similar al anterior, salvo que la cifra fuera muy grande, en cuyo caso será similar a e.
D) G => formato similar a g pero que utiliza indistintamente a f o E.
Contamos también con con el signo %, por el que el número de punto flotante se multiplica por 100. El número resultante se mostrará en formato f asociado a un símbolo %.
Veamos un ejemplo con el carácter %:
![]() |
| FINCA RÚSTICA DE PLATANERAS EN LA ZONA DE EL GUINCHO, ENTRE ICOD Y GARACHICO, NORTE DE TENERIFE |
LA FUNCIÓN format() PARA EL FORMATEO DE NÚMEROS... ¡SORPRESA!
Sí, aunque parezca mentira con el tremendo empacho de cadenas que llevamos, existe en Python una función (no un método, ¡cuidado!, que es una función dependiente de una clase, como es el caso que hemos visto hasta ahora de str.format(), donde format() es el método y str la clase a la que pertenece) que se ocupa de formatear la salida de números: format().
Lo cierto es que apenas se utiliza y, de alguna manera, ha quedado inclusa en Python 3 como una suerte de reliquia binaria de tiempos pretéritos. Pero estar, está. Y funcionar, funciona. Así que hablaremos algo de ella porque siempre, uno no sabe cuándo, nos podría venir bien algún día.
Eso sí, la función format() devolverá siempre una string porque de casta le viene al galgo
Vemos primero una captura donde se muestra su argumentado:
Si observamos la especificación, comprobamos que Python nos devuelve (return) un valor (value) al que se le asignará el método especial __format__(), y ya veremos en su momento lo que son los métodos especiales, vinculados a la superclase predefinida object de Python, por la sintaxis del punto. pasándole como argumento un formato específico (format_spec).
Que nadie se acongoje: esto es mucho más sencillo de lo que parece, con tanto tecnicismo.
Veamos, por cierto, gráficamente, lo que acabamos de mencionar:
Es importante hacer notar que esto sucede a nivel interno, es decir, la propia función format() ya se encarga ella solita de hacer lo que debe, simplificando mucho trabajar con ella. Aún más, las especificaciones, realmente, son opcionales de tal modo que si pasamos como argumento de format() un número, entero, float, octal, hexadecimal, etc., la función se comportará exactamente igual que str(), devolviendo el mismo resultado, realizando conversiones automáticas a tipo de dato int o float y, a continuación, a cadena.
Vamos a ver a continuación los posibles argumentos que puede llevar la función format(), eso sí, si se insertan más de uno, respetando el orden que exige su sintaxis:
Este argumento, realmente, se divide en dos: un relleno (fill) con cualquier carácter válido en Python, y una alineación (align) que apunta si dicho relleno debe situarse a la izquierda (<), a la derecha (>), al centro (^), y el operador =, que asume un alineado por la derecha e interpola el carácter entre el signo que le hemos dado a nuestro número y el número en sí mismo.
Vemos a continuación un ejemplo con inclusiones más completas:
Veamos las concomitancias pero, a la vez, limitada flexibilidad del método tradicional str.format():
El segundo parámetro opcional refiere el signo, básicamente, + o - que queremos proporcionar al número y la manera de introducirlo, aunque en el caso de los números negativos, esto sólo será posible si el número ya es negativo. Además, si el número ya es negativo, seguirá siéndolo a pesar de que introduzcamos el signo +.
El símbolo almohadilla apunta a los diferentes formatos numéricos que acepta Python con los que está trabajando. Sucintamente, "b", para binarios; "o", para octales y "x" para hexadecimales. Se admite también la opción "e" y "E" para mostrar la notación científica de un número.
Determina el espacio que media entre el inicio de la string, con la comilla de apertura, y el número, siempre de izquierda a derecha. Sólo podemos rellenar con 0; de resto, sólo se mostrará un espacio vacío. Veamos algunos ejemplos con cambios de tipo de números:
Con este argumento opcional de format() podemos conseguir escribir miles en el formato europeo, donde los miles se representan con comas y los decimales con puntos.
Con este nuevo parámetro precisamos la cantidad de números (dígitos) que se mostrarán tras el punto decimal, esto es, cuanto mayor sea el número de dígitos a la izquierda del punto mayor es la precisión global del valor. Si el dígito es mayor que el total de los decimales, se mostrarán todos los decimales sin añadir nada. Recordemos que con una cifra inferior, se muestra automáticamente la notación científica del valor.
El último parámetro opcional de format(). Señala en qué tipo de dato se va a mostrar el valor cuando la función format() se ejecute. La devolución varía según sea un valor de tipo entero o un valor de tipo decimal. Veamos:
Finalizamos: No olvidemos que la función format() tiene sus concomitancias (equivalencias) en el método str.format(), donde ambos devuelven cadenas y resultados similares.
Que nadie se acongoje: esto es mucho más sencillo de lo que parece, con tanto tecnicismo.
Veamos, por cierto, gráficamente, lo que acabamos de mencionar:
Es importante hacer notar que esto sucede a nivel interno, es decir, la propia función format() ya se encarga ella solita de hacer lo que debe, simplificando mucho trabajar con ella. Aún más, las especificaciones, realmente, son opcionales de tal modo que si pasamos como argumento de format() un número, entero, float, octal, hexadecimal, etc., la función se comportará exactamente igual que str(), devolviendo el mismo resultado, realizando conversiones automáticas a tipo de dato int o float y, a continuación, a cadena.
Vamos a ver a continuación los posibles argumentos que puede llevar la función format(), eso sí, si se insertan más de uno, respetando el orden que exige su sintaxis:
![]() |
| RETAMAS EN PROCESO DE FLORACIÓN. PARQUE NACIONAL DE LAS CAÑADAS DEL TEIDE. |
1.- [[fill]align]
Este argumento, realmente, se divide en dos: un relleno (fill) con cualquier carácter válido en Python, y una alineación (align) que apunta si dicho relleno debe situarse a la izquierda (<), a la derecha (>), al centro (^), y el operador =, que asume un alineado por la derecha e interpola el carácter entre el signo que le hemos dado a nuestro número y el número en sí mismo.
El relleno más básico sólo requiere de un número pasado como string y se colocará siempre a la izquierda del valor en la devolución final:
Veamos las concomitancias pero, a la vez, limitada flexibilidad del método tradicional str.format():
2.- [sign]
El segundo parámetro opcional refiere el signo, básicamente, + o - que queremos proporcionar al número y la manera de introducirlo, aunque en el caso de los números negativos, esto sólo será posible si el número ya es negativo. Además, si el número ya es negativo, seguirá siéndolo a pesar de que introduzcamos el signo +.
Por otra parte, si insertamos un único espacio en blanco (sólo uno, pues a partir de dos o más , Python lanza una excepción de tipo ValueError: Invalid format specifier) cuando el número es positivo, se aplica automáticamente dicho espacio a la izquierda del número. En el caso de que el número fuera negativo, no tendría mayor incidencia y devuelve el número tal cual.
En el caso de que combinemos relleno y signo. éste debe ir precediendo a la cantidad de relleno.
3.- [#]
El símbolo almohadilla apunta a los diferentes formatos numéricos que acepta Python con los que está trabajando. Sucintamente, "b", para binarios; "o", para octales y "x" para hexadecimales. Se admite también la opción "e" y "E" para mostrar la notación científica de un número.
Podemos insertar, dado un número decimal o de punto flotante, un punto seguido de una cifra para indicarle al intérprete de Python el número de decimales que queremos que se muestren. Si el número que pasamos tras el punto es igual o inferior a la parte entera del valor, devolverá la notación científica.
También podemos pasar un punto seguido de una cifra y la letra 'f'' para determinar el número de decimales que queremos mostrar y que, en caso de que fuera factible, efectuase un redondeo. La inserción de 'f' en solitario, "f", ejecuta un recorte automático y por defecto a seis decimales, y cuando el número de decimales del valor es inferior a 6, rellena los decimales faltantes hasta llegar a seis con ceros.
4.- [0][width]
Determina el espacio que media entre el inicio de la string, con la comilla de apertura, y el número, siempre de izquierda a derecha. Sólo podemos rellenar con 0; de resto, sólo se mostrará un espacio vacío. Veamos algunos ejemplos con cambios de tipo de números:
5.- [,]
Con este argumento opcional de format() podemos conseguir escribir miles en el formato europeo, donde los miles se representan con comas y los decimales con puntos.
6.- [.precision]
Con este nuevo parámetro precisamos la cantidad de números (dígitos) que se mostrarán tras el punto decimal, esto es, cuanto mayor sea el número de dígitos a la izquierda del punto mayor es la precisión global del valor. Si el dígito es mayor que el total de los decimales, se mostrarán todos los decimales sin añadir nada. Recordemos que con una cifra inferior, se muestra automáticamente la notación científica del valor.
7.- [type]
El último parámetro opcional de format(). Señala en qué tipo de dato se va a mostrar el valor cuando la función format() se ejecute. La devolución varía según sea un valor de tipo entero o un valor de tipo decimal. Veamos:
| MONTEVERDE EN EL MONTE DEL AGUA, ERJOS, NOROESTE DE TENERIFE. |
Suscribirse a:
Entradas (Atom)













