jueves, 5 de julio de 2018

T4. LAS FUNCIONES DE TIPO F: ENCADENADOS DE POR VIDA.

VOLCÁN DEL PICO VIEJO, PARQUE NACIONAL DE LAS CAÑADAS DEL TEIDE, TENERIFE.

          Pongámoslo claro desde el principio: las funciones de tipo f, (f, de "format"), operan sobre las cadenas de texto, sobre las strings, haciendo precisamente lo que predica: formatear la salida de datos lo que, indiciariamente, apunta al método str.format() de las strings que ya estudiamos en su página correspondiente en este manual.
Y aún hay más: las cadenas f (también se llaman así) entran a formar parte de Python a partir de su versión 3.6 y, por supuesto, posteriores, lo cual debemos tener en cuenta a la hora de implementarlas en nuestro código.
La razón fundamental que justifica su incorporación al maravilloso y extenso mundo de las strings en Python está en ofrecer un modo cómodo y sencillo, de integrar VARIABLES y EXPRESIONES dentro de una misma cadena de texto recurriendo a una sintaxis muy simple, tan simple como introducir una cadena, obviamente, entrecomillada, precedida por el carácter f o F, ya que no es case sensitive, y a continuación, las variables que queramos introducir entre llaves, {...}, y que en el momento de la impresión, como podemos esperar, serán sustituidas por sus correspondientes valores asignados.
Aquí deberíamos hacernos una pregunta: ¿Para qué tantas formas de formatear una cadena en Python? ¿No basta con una sola, como los antiguos formateos con % de Python en su versiones 1 y 2 todavía activos, aunque no recomendados, en la versión 3, o como str.format()? Si el zen de Python promueve que sólo haya una forma evidente de "hacer las cosas", ¿por qué tantas opciones que no complicaciones?
En el blog https://cito.github.io/blog/f-strings/ nos lo explica: porque el "Zen de Python también afirma que lo simple es mejor que lo complejo y que la practicidad supera a la pureza, y sí, las cadenas f son realmente la manera más simple y práctica para formatear cadenas."
En efecto, podemos tranquilamente sustituir el uso del método str.format() y emplear en su lugar las cadenas f. El resultado será el mismo, sólo que más rápido, más legible y con mayor eficiencia.
Abajo se muestra una comparativa de los tiempos de ejecución extraído del mismo blog:





En el ejemplo anterior hemos visto como es posible asignar una cadena f a una variable cualquiera, lo que resulta necesario si queremos reutilizarla en cualquier otra parte de nuestro código, y tantas veces como estimemos oportuno.
Otra cualidad interesante de las cadenas f es que también admite las comillas triples, lo que nos permite extender su operatividad a cadenas con varias líneas:


Vamos ahora con las variables. Como ya hemos dicho aquí, podemos introducir variables dentro de una función f por medio de las llaves, declarándolas primero, asignándoles sus valores respectivos, y pasándolas después entre llaves en nuestra cadena f.
También podemos encapsular el nombre de la variable entre dobles llaves, {{variable}}, lo cual inserta en la cadena resultante el nombre de la variable pero no el valor asignado a ella.


ERIZOS DE CASTAÑOS EN LAS LADERAS DE ACENTEJO, NORTE DE TENERIFE.

Más arriba hemos expuesto un ejemplo típico de concatenación con el operador + que conocemos de sobra. Veamos otro con inserción de una tercera string:


Por otra parte, no olvidemos que las cadenas f, por muy f o F que sean, son cadenas por encima de todo y, en consecuencia, pueden recibir como cualquier otra los métodos propios de las strings.


Del mismo modo que podemos aplicar a una cadena f los métodos de la strings podemos igualmente combinarla con el carácter r de las cadenas raw, crudas, y que de esta forma no se interpreten las secuencias de escape, esto es, aquellos caracteres especiales precedidos por una contrabarra \ como \n, para los saltos de línea, o \t para las tabulaciones. Para estos casos, debemos escribir el carácter a continuación de f como podemos ver en el ejemplo:


Sin embargo no acepta los indicadores u para representar caracteres Unicode ni b para bytes. Tampoco las secuencias de escape se pueden incluir en la expresión.


Las cadenas/funciones f nos proporcionan, a cambio de sus limitaciones con u y b, cierta plasticidad a la hora de insertar los siguientes especificadores:
  • !s → Equivale a la función conversora str().
  • !r → Equivale a la función de representación  repr().
  • !a → Equivale a la función de captura de caracteres ascii().

Veámoslo:



Pero el fabuloso mundo de los especificadores (sucintamente, expresiones simples que nos permiten formatear una salida) va todavía más allá y nos permiten, por ejemplo, insertar separaciones mediante espacios en blanco entre cadenas, :, y limitar el número de caracteres a mostrar, ., como vamos a comprobar en el ejemplo inferior.
Los dos puntos que acabamos de consignar antes facultan la adición de un especificador. Lo veremos en ejemplos ulteriores.


También es posible formatear horas y fechas con las funciones f, aunque en este caso no lo podemos hacer directamente y tendremos previamente que importar el módulo correspondiente desde la biblioteca estándar de Python: from datetime import datetime.



FLORACIÓN Y NUEVOS BROTES DE PINO CANARIO SOBRE EL MALPAÍS EN LOS ALTOS DE EL TANQUE, CENTRO NORTE DE TENERIFE. 

      FUNCIONES:

      Las expresiones que introducimos en una cadena f también son susceptibles de incluir llamadas a funciones de modo análogo a como ocurre con el método str.format() de las strings:


Por supuesto, ocurre lo mismo con las funciones integradas:


Igualmente extendemos esta capacidad a las funciones lambda:



Las cadenas f nos proporcionan mecanismos simples de alineación y relleno que resultan ser una alternativa más sencilla y directa de implementar que el recurso a los métodos str.zfill(), str.ljust() o str.rjust() que ya conocemos. Veamos cómo:


Las cadenas f efectúan una conversión automática de cualquier tipo de valor que reciban a string. Sin despeinarse ni nada.



Para finalizar con las cadenas f vamos a mostrar un ejemplo típico de uso en formato tabla.



CABECERA DEL BARRANCO DE CATALANES, AL SUR DEL MACIZO DE ANAGA, NORESTE DE TENERIFE.