Python – Capítulo 34: Especificaciones de conversión

Objetivo: Conocer otras especificaciones de conversión para el formato de strings empleando el operador de interpolación (%).

En el capítulo 33 presentamos el operador de interpolación (%), una de las maneras que tiene Python para formatear cadenas de caracteres. A la izquierda del operador figuraba un string en el que insertábamos determinadas especificaciones de conversión; a la derecha, una tupla (o un elemento simple) con los valores que sustituirían a aquellas.

Vimos, además, el especificador de conversión %d para su sustitución por un número entero. Este es semejante a %i y puedes usar uno u otro indistintamente (d es de decimal, entero decimal; la i es de integer).

Vamos a presentar algunos más…

Si, en vez de un entero decimal, quieres convertir el valor a octal, dispones de la especificación %o. Observa la conversión en el siguiente ejemplo:

>>> x=15324
>>> print("%d expresado en octal es %o" % (x, x))
15324 expresado en octal es 35734

Para pasar a hexadecimal puedes elegir entre %x o %X, dependiendo de si lo quieres en mayúsculas o minúsculas:

>>> print ("En hexadecimal es %x, o %X expresado en mayúsculas" % (x, x))
En hexadecimal es 3bdc, o 3BDC expresado en mayúsculas

Para números reales dispones de %f (de float):

>>> x=143.25
>>> print("El valor de x es %f" % x)
El valor de x es 143.250000

No te preocupes ahora por el número de decimales después del punto, pues hablaremos de eso en su momento.

Los números reales también puedes expresarlos en notación científica:

>>> print("que es lo mismo que %e, o bien %E con la E mayúscula" % (x, x))
que es lo mismo que 1.432500e+02, o bien 1.432500E+02 con la E mayúscula

Observa que utilizamos %e o %E dependiendo de si preferimos la e en minúsculas o mayúsculas.

Mira este otro curioso ejemplo con %g:

>>> print("Estas variables son, respectivamente, %g, %g, %g, %g y %g" % (a,b,c,d,e))
Estas variables son, respectivamente, 0.5, 0.05, 0.005, 0.0005 y 5e-05

Lo que está sucediendo es que la especificación %g (de general) representa los números reales inteligentemente. Sólo emplea notación científica cuando el exponente es inferior a -4; en caso contrario los representa en formato decimal. Si quieres la E en mayúsculas, usa %G.

Para representar un carácter simple empleamos %c. Podemos facilitar el carácter así, tal cual, o como número entero, en cuyo caso se efectuará la conversión al carácter correspondiente a ese código en Unicode:

>>> c1='A'
>>> c2=65
>>> print("c1 y c2 son, respectivamente, %c y %c." % (c1, c2))
c1 y c2 son, respectivamente, A y A.

Para interpolar un string disponemos de la especificación %s:

>>> serie='La casa de la pradera'
>>> print('Quién no ha llorado con "%s".' % serie)
Quién no ha llorado con "La casa de la pradera".

Fíjate cómo me las he arreglado para que se impriman las comillas dobles. Al delimitar la cadena en print con comillas simples he podido utilizar las dobles en el interior sin que exista confusión.

Para finalizar voy a plantearte un pequeño problema… Imagina que queremos lograr la siguiente salida:

Puesto que 5 es un entero, la especificación a emplear es %d.

En la que el valor 5 ha sido facilitado por una variable x.

Esto fallaría:

>>> print("Puesto que %d es un entero, la especificación a emplear es %d" % x)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    print("Puesto que %d es un entero, la especificación a emplear es %d" % x)
TypeError: not enough arguments for format string

El error es claro: hemos incluido dos especificaciones, pero sólo un argumento. La cuestión es que no queremos que el segundo %d sea interpretado como especificación, sino como un carácter normal.

Para lograr esto utilizaremos un tanto por ciento doble: %%

>>> print("Puesto que %d es un entero, la especificación a emplear es %%d" % x)
Puesto que 5 es un entero, la especificación a emplear es %d

El %% indica que ese % no corresponde a una especificación. El resultado es la impresión de un % simple.

Cuando no usamos el operador de interpolación podemos recurrir al % sin necesidad de usar el doble, pues la construcción no ofrece ambigüedades:

>>> print("%d es la especificación de conversión para enteros y %f para reales")
%d es la especificación de conversión para enteros y %f para reales

Y eso es todo por hoy…

>>> bollo = 'bizcocho'
>>> hora = 8
>>> print("Con esto y un %s, hasta mañana a las %d" % (bollo, hora))
Con esto y un bizcocho, hasta mañana a las 8

Javier Montero Gabarró


Python – Capítulo 34: Especificaciones de conversión


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Python – Capítulo 33: Imprimiendo al estilo de C

Tomemos prestada la función desguazar() que diseñamos en el capítulo anterior:

def desguazar(dividendo, divisor):
  cociente = dividendo//divisor
  resto = dividendo%divisor
  return cociente, resto

Vamos a modificarla ligeramente para que, en vez de devolver la tupla con el resto y el divisor nos muestre una frase con el resultado. Esto es, que funcione del siguiente modo:

>>> desguazar(17,5)
El cociente es 3 y el resto es 2.

No parece complicado en absoluto. Una primera aproximación podría ser esta:

def desguazar(dividendo, divisor):
  cociente = dividendo//divisor
  resto = dividendo%divisor
  print("El cociente es", cociente, "y el resto es", resto,".")

Salvo la excesiva distancia del punto final, el resultado es aceptable (recuerda que por defecto print() establece como separador un espacio en blanco).

>>> desguazar(17,5)
El cociente es 3 y el resto es 2 .

Sin embargo, el modo de lograrlo deja bastante que desear: hemos troceado la cadena para poder intercalar los valores enteros, que previamente hemos tenido que convertir en strings.

Si sabes programar en lenguaje C, tal vez sientas algo de añoranza. Con lo bien que resuelve el problema un programador en C con printf

printf("El cociente es %d y el resto es %d.\n", cociente, resto);

¿No existiría algo semejante en Python? ¿No existiría un modo de formatear una cadena de caracteres con especificaciones en su interior?

Desde luego que existe, y no sólo de un modo semejante, sino más flexible aún.

Voy a mostrarte como resolvía Python esto a la antigua usanza. Hoy día, el método format() hace innecesario recurrir a ella, pero puesto que aún sigue siendo perféctamente válida y no parece haber indicios de que vayan a dejarla obsoleta, he preferido explicártela en primer lugar.

Esta es la nueva función. Presta mucha atención a la última sentencia:

 def desguazar(dividendo, divisor):
  cociente = dividendo//divisor
  resto = dividendo%divisor
  print("El cociente es %d y el resto es %d." % (cociente, resto))

Y observa el resultado:

>>> desguazar(17,5)
El cociente es 3 y el resto es 2.

Perfecto.

Fíjate cómo, al igual que en printf, especificamos un valor entero con %d. Puesto que vamos a sustituir dos enteros, %d aparece dos veces en los lugares adecuados dentro de la cadena.

A continuación, una vez hemos cerrado la cadena con las comillas, aparece el símbolo %, que en este contexto es conocido como operador de especificación, formateo o interpolación.

Tras el figura una tupla con las variables que sustituirán cada especificación. Es muy importante que el número de especificaciones en la cadena coincidan con el número de variables en el lado derecho de %. En caso contrario se produciría un error en tiempo de ejecución (una excepción).

Naturalmente, si sólo hubiera una especificación, en lugar de una tupla aparecería un entero simple:

>>> ovejas=17
>>> print("Tengo un rebaño de %d ovejas..." % ovejas)
Tengo un rebaño de 17 ovejas...

Hemos presentado %d, la especificación para enteros con signo en formato decimal (base 10), pero hay otras más para todo tipo de valores. Las iremos presentando gradualmente; entre tanto, asegúrate de comprender la técnica aquí descrita.

Javier Montero Gabarró


Python – Capítulo 33: Imprimiendo al estilo de C


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies