Python/Tipos de datos nativos/Formato de cadenas

Python admite dar formato a valores dentro de cadenas. Aunque esto puede incluir expresiones muy complicadas, el uso más básico es insertar valores dentro de una cadena con el sustituto %s.

Nota: El formato de cadenas en Python usa la misma sintaxis que la función sprintf en C.

Ejemplo: Presentación del formato de cadenas

>>> k = "uid"
>>> v = "sa"
>>> "%s=%s" % (k, v)                                                                  [1]
'uid=sa'
[1] La expresión completa se evalúa a una cadena. El primer %s lo reemplaza el valor de k; el segundo %s se ve sustituido por el valor de v. Todos los otros caracteres de la cadena (en este caso, el signo «igual») quedan tal como están.

Observe que (k, v) es una tupla. Ya le dije que servían para algo.

Puede que esté pensando que esto es mucho trabajo sólo para hacer una simple concatenación, y estaría en lo correcto, excepto porque el formato de cadenas no es sólo concatenación. Ni siquiera es sólo formato. También trata sobre conversión de tipos.

Ejemplo. Formato de cadenas frente a Concatenación

>>> uid = "sa"
>>> pwd = "secret"
>>> print(pwd + " no es una buena clave para " + uid)                                 [1]
secret no es una buena clave para sa
>>> print("%s no es una buena clave para %s" % (pwd, uid))                            [2]
secret no es una buena clave para sa
>>> userCount = 6
>>> print("Usuarios conectados: %d" % (userCount, ))                                  [3] [4]
Usuarios conectados: 6
>>> print("Usuarios conectados: " + userCount)                                        [5]
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
[1] + es el operador de concatenación de cadenas.
[2] En este caso trivial, la cadena de formato lleva al mismo resultado que la concatenación.
[3] (userCount, ) es una tupla con un elemento. Sí, la sintaxis es un poco extraña, pero hay una buena razón para ella: es una tupla sin ambigüedades. De hecho, siempre puede incluir una coma tras el último elemento cuando define una lista, tupla o diccionario, pero se precisa la coma cuando se define una tupla con un solo elemento. Si no se precisase la coma, Python no podría saber si (userCount) es una tupla de un elemento, o sólo el valor de userCount.
[4] El formato de cadenas funciona con enteros especificando %d en lugar de %s.
[5] Tratar de concatenar una cadena con algo que no lo es lanza una excepción. Al contrario que el formato de cadenas, la concatenación sólo funciona cuando todo son cadenas.

Como con la printf en C, el formato de cadenas de Python es como una navaja suiza. Hay gran cantidad de opciones y modificadores de cadena que dan formato especialmente a varios tipos de valores diferentes.

Ejemplo. Dar formato a números

>>> print("Precio de hoy del stock: %f" % 50.4625)                                   [1]
50.462500
>>> print("Precio de hoy del stock: %.2f" % 50.4625)                                 [2]
50.46
>>> print("Cambio desde ayer: %+.2f" % 1.5)                                          [3]
+1.50
[1] La opción de formato %f trata el valor como decimal, e imprime seis dígitos decimales.
[2] El modificador ".2" de la opción %f redondea el valor a dos dígitos decimales.
[3] Incluso puede combinar modificadores. Añadir el modificador + muestra un signo más o menos delante del valor. Verá que el modificador ".2" sigue ahí, y está haciendo que el valor aparezca con exactamente dos dígitos decimales.

Lecturas complementarias sobre formato de cadenas

editar