Concatenar cadenas (II)
No es esta la primera vez que hablo de cadenas y de las formas de concatenación disponibles en Python, pero la revisión de lo hecho y el estudio del tema me han convencido de la necesidad de tratar de nuevo esta cuestión, profundizando más en ella y analizando con cierto detalle los diferentes modos en que se planea este procedimiento de generación de código. La importancia que tiene en procesos de automatización documental justifica sobradamente que preste especial atención al tema.
Es posible que, al retomar el tema, se produzcan repeticiones de contenido que tal vez depure en una posterior revisión del conjunto de las entradas, pero que ahora sólo puedo lamentar como consecuencia lógica del paso del tiempo y de la complejidad de la temática. Te ruego disculpas, lector, por la molestia que esta repetición te pueda suponer.
Como vimos, en OOo Basic se utilizan dos formas básicas y se puede decir que intercambiables de concatenar cadenas: mediante + y & podemos concatenar tantos segmentos de texto y/o variables como deseemos, sin más límite que la extensión del párrafo que queramos crear y la inteligibilidad del código resultante, a cual, al ser un proceso repetitivo puede ser poco elegante, pero no necesariamente disfuncional o ininteligible.
Recuerdo que en su momento recomendé utilizar en OOo Basic & para concatenar string (y variables string) y reservar + para la operación de sumar, como forma de facilitar la lectura del código, pero se trata de una opción y preferencia personal, sin que exista (que yo sepa) motivación técnica específica para defender esta opción.
Vimos en una entrada anterior que en Python también podemos concatenar cadenas de forma directa mediante , y +, pero presentan limitaciones y restricciones que no se observan en OOo Basic, por lo que son fórmulas no recomendables en cuanto la combinación de cadenas adquiere cierto grado de complejidad, siendo para ello suficiente con que queramos combinar string literal con variables.
Dado que Python es un lenguaje en desarrollo, las versiones que se han ido creando con el paso del tiempo han ido incorporando soluciones diferentes y dejando atrás como obsoletas las que se mostraron limitadas, aunque no por ello dejan de estar disponibles, como pasa con los modelos básicos anteriores.
El último desarrollo en estas funcionalidades son las llamadas cadenas f, de las cuales ya te hablé en esta entrada, pero es posible que dejara por el camino procedimientos interesantes y aun vigentes que surgieron en su momento como respuesta a las demandas del procedimiento. Trataré en esta entrada de tapar estos huecos.
Todo esto es para confirmar que el tema de la concatenación de cadenas ya ha sido tratado en este blog, pero, una vez dicho, paso a indicar que, lo que sigue constituye una reformulación sistemática y ampliada de lo que esas entradas pueden haber recogido, a la vez que una continuidad y conclusión de lo explicado respecto a LibreOffice y OOo Basic en otro blog.
Así que paso a exponer paso a paso el análisis de las diferentes formas de concatenar cadenas en Python. Tomo como referencia lo que expone Alfredo Sánchez Alberca en su material on-line Aprendiendo con Alf, al que remito y del que me declaro deudor.
Expongo en primer lugar diferentes formas de uso de conectores [, y +], que son las formas equivalentes a lo que en OOo Basic son [& y +] respectivamente (1).
Primera formulación. Concatenación de dos literales con separación de coma (,).
print("Hola","Javier") -> Hola Javier
Segunda formulación. Concatenación de literal y variable con separación de coma (,).
nom = "Javier"
print("Hola",nom) -> Hola Javier
Tercera formulación. Concatenación de dos variables con separación de coma (,).
sal = "Hola"
nom = "Javier"
print("Hola",nom) -> Hola Javier
Cuarta formulación. Concatenación de dos literales con separación de signo (+).
print("Hola"+"Javier") -> HolaJavier
Quinta formulación. Concatenación de literal y variable con separación de signo (+).
print("Hola"+nom) -> HolaJavier
Sexta formulación. Concatenación de dos variable con separación de signo (+).
print(sal+nom) -> HolaJavier
Séptima formulación. Concatenación de literal string y literal numeral con coma (,)
print("Número",123) -> Número 123
Octava formulación. Concatenación de literal string y literal numeral con signo (+)
print("Número"+123) -> [TypeError: can only concatenate str (not "int") to str]
print("Número" + str(123)) -> Número 123
En segundo lugar vamos a explicar el uso de la primera fórmula de formateo de cadenas que se empleó en Python desde sus primeras versiones como lenguaje de programación. Se base en el uso del signo %s, siendo % el operador que hace de marcador y s la referencia a la cadena que se anexa. %s que se sitúa necesariamente dentro de la cadena en la posición en la que se desea ubicar el segundo segmento de la cadena y se puede utilizar tantas veces como sea necesario en combinaciones complejas. En estos casos la concatenación utiliza también los signos de las configuraciones ya vistas, especialmente el signo [,].
Al igual que los concatenadores [, y +] presenta también varias formulaciones, que enumeraré siguiendo el orden ya establecido (2)
Novena formulación. Literal cadena con unión de segundo elemento (cadena).
print('Hola, me llamo %s' % 'Javier') -> Hola, me llamo Javier
Décima formulación. Literal cadena con unión de segundo elemento (número).
print('Número %s' % 123) -> Número 123
Undécima formulación. Literal cadena con unión de variable.
nom = 'Javier'
print('Hola, me llamo %s' % nom) -> Hola, me llamo Javier
Décimo segunda formulación. Fórmulas mixtas y complejas.
A. print('Hola %s' % nom,',buenos días') -> Hola Javier, buenos días
B. print('Hola %s','buenos días' %nom) -> TypeError: not all arguments converted during string formatting
C. print('Hola %s', buenos días', %nom) -> Hola Javier, buenos díasD. print('Hola %s' % nom,',buenos días') -> Hola Javier, buenos días
E. annos = 24
print('Hola %s' % nombre, ', tienes %s' % annos , 'de edad (eso quisieras)') -> Hola Javier, tienes 24 años de edad (eso quisieras)
F. print('Hola %s, tienes %s' % nom % annos, 'de edad (eso quisieras)') ->TypeError: not enough arguments for format string
Lo que revela esta formulación (y sus variantes) es que es posible concatenar más de una cadena (o componente, ya que también es válido para números y para variables) siempre que se respete la sintaxis de %s que obliga a:
- Posicionar el marcador en la posición requerida por la formulación deseada de la cadena resultante de la concatenación (A)
- Uso de tantos marcadores como sea necesario en función de lo deseado (C, E)
- Pero con restricción de posicionamiento: cada uso de %s debe posicionarse tras la cadena afectada (B,D) y señalar sin ambigüedad a un contenido a anexar, no admitiendo dos marcadores dentro de una subcadena ni dos referencias sucesivas (F)
- La posición de los valores en la cadena-base se identifican con {}
- Esta cadena se sitúa al inicio de la secuencia
- El texto de reemplazo va precedido de la id de a función format()
- ... y se puede hacer por posición de forma implícita o explicitando los valores posicionales...
- ... o bien utilizando la forma diccionario clave:valor
Primera forma.
print('Me llamo {}, vivo en {} y estudio {} en {}'.format('Elvira','Oviedo','Veterinaria', 'León.))
-> Me llamo Elvira, vivo en Oviedo y estudio Veterinaria en León.
Segunda forma.
print('Dame {}, el {} y los {}'.format('la llave inglesa', 'destornillador', 'alicates'))
print('Dame{2}, la {0} y el {1}'.format('llave inglesa', 'destornillador', ' los alicates'))
El texto resultante de 2.1 será Dame la llave inglesa, el destornillador y los alicates y el de 2.2 Dame los alicates, la llave inglesa y el destornillador.
Tercera forma. Uso de variables (4).
nombre = 'Julia'
localidad = 'Gijón'
estudios = 'Albañilería'
print('Me llamo {}, vivo en {} y estudio {}'.format(nombre,localidad,estudios))
print('Me llamo {1}, vivo en {2} y estudio {0}'.format(nombre,localidad,estudios))
Cuarta forma. Clave:Valor (5)
print('Me llamo {nom}, vivo en {local} y estudio {estud}' .format (nom=nombre, local=localidad, estud=estudios))
Finalmente, la cuarta opción ya ha sido específicamente tratada en una entrada de este blog, por lo que no me detendré demasiado en ella. Se trata de las llamadas cadenas f (f-string o formatos literales), que se caracterizan porque su sintaxis incluye F o f al inicio de la cadena, en literales, antes de las comillas. Veamos un ejemplo (6):
nom1 = 'Juana'
nom2 = 'Lucas'
print(f'Una niña llamada {nom1} juega con un niño llamado {nom2}')
print(f'{nom1}') -> Juana
Contamos aun con una última forma de concatenar variables con cadenas, aunque esta quinta opción es en realidad una opción que podemos considerar complementaria de las anteriores, ya que no forma parte de los recursos comunes del lenguaje y precisa importar una librería específica llamada Template y las funciones asociadas a string
from string import Template
print(Template('Me gusta estudiar $leng').substitute(leng='Python'))
print(Template('Me gusta $accion $leng').substitute(accion='estudiar', leng='Python'))
Puedes observar en estos dos ejemplos la sintaxis del procedimiento, en cierto modo recuerda al uso de funciones y más específicamente a .format():
- Primero llamamos a la función Template()
- Después incluimos dentro de cadena los marcadores, que se identifican mediante la expresión $NomVar.
- Y finalmente, mediante la función .susbtitude(), como parámetros de ellas en, y en formato clave:valor, damos contenido a las variables.

No hay comentarios:
Publicar un comentario
Comenta esta entrada