jueves, 25 de febrero de 2021

Función Print(), caracteristicas y formateo de una cadena de texto. Métodos de manipulación de cadenas.

 

 

PRINT()

 

En los próximos post voy a transcribir los apuntes que me he ido haciendo a medida que estaba aprendiendo python. Espero que puedan seros de utilidad. Son muy sencillos y están hechos a modo de chuleta para poder consultar cuando se necesite.

Puedes consultar la documentación oficial para conocer todos los métodos String disponibles.

Empezamos.

 

La función Print de python y formatos de salida de cadenas de texto o string.

 

La función print() nos sirve generalmente para mostrar un mensaje generalmente en pantalla, aunque también se podría hacer en cualquier otro dispositivo de salida estándar.  El mensaje a mostrar puede ser un string (texto) o cualquier otro objeto que previamente debe ser convertido a string antes de ser visualizado en la pantalla.

Podemos pasar los valores asignados a una variable como parámetros de la función print(). Podemos poner tantos parámetros como queramos separados por comas. Si lo hacemos de esta forma, automáticamente python nos pone un espacio en blanco después de cada coma.

 

>>> nombre = "Andrés"

>>> edad = 40

>>> print("Mi nombre es", nombre, "y tengo" , edad, "años")

Mi nombre es Andrés y tengo 40 años

 

Si tenemos solamente cadenas de texto podemos concatenarlas o unirlas usando el signo "+" pero ten en cuenta que se unirán tal cual estén sin que automáticamente se pongan espacios en blanco. Por ejemplo:

 

>>> nombre = "Andrés"

>>> edad = "40"

>>> print("Mi nombre es"+ nombre +"y tengo"+ edad + "años")

Mi nombre esAndrésy tengo40años 

 

Podemos justificar el texto de cualquier string usando los siguientes métodos aplicados al string en cuestión: 

 

-         .rjust(n) à justificar el texto a la derecha

-         .center(n) à centrar el texto

-         .ljust(n) à justificar el texto a la izquierda.-          

 

En donde n es el tamaño de la cadena a mostrar que tendrá que ser mayor que el texto. Esto se suele utilizar para mejorar la presentación de los datos mostrados por pantalla.

 

Ejemplo de .rjust(n) 

>>> cadena = "El perro de San Roque"

>>> cadena.rjust(50)

                             El perro de San Roque

 

Ejemplo de .center(n) 

>>> cadena = "El perro de San Roque"

>>> cadena.center(50)

              El perro de San Roque  

 

Ejemplo de .ljust(n) 

>>> cadena = "El perro de San Roque"

>>> cadena.ljust(50)

El perro de San Roque 

 

 

Insertar el valor de una variable dentro de una cadena de texto.

 

 

Puedes encontrar toda esta información ampliada en el documento de python PEP 3101.

 

 

En muchas ocasiones necesitaremos imprimir por pantalla un texto pero dentro del mismo querremos introducir el valor de variables.

 

Esto, podemos hacerlo de 3 formas:

 

1)    Utilizando el operador “%”. Pasamos los valores a imprimir indicando de que tipo es la variable a mostrar y pasando los datos a imprimir como una tupla ( ) o un diccionario { }

 

Carácter

Tipo de significado

s

Cadena de Texto

d

Número Entero

f

Número Flotante

e

Número Real en formato exponencial

o

Número Octal

x

Número Hexadecimal

 

 

Pasando los datos como una tupla () o un diccionario {}

 

>>> nombre = "Andrés"

>>> edad = 45

>>> print('Su nombre es %s y tiene %d años' %(nombre, edad))

Su nombre es Andrés y tiene 45 años 

>>> nombre = "Andrés"

>>> edad = 45

>>> print('Su nombre es %(name)s y tiene %(age)d años' %{'name':nombre, 'age':edad})

Su nombre es Andrés y tiene 45 años             

     

2)    Utilizando el método str.format().

Se utiliza de una forma muy parecida al anterior. 

 

>>> nombre = "Andrés"

>>> edad = 45

>>> print('Su nombre es {0} y tiene {1} años'.format(nombre,edad))

Su nombre es Andrés y tiene 45 años

   En donde {0} hace referencia al primer argumento de la función format, en nuestro caso la variable nombre y {1} hace referencia al segundo argumento, edad. Si no los especificas, es decir ponemos solo los {} sin número, los va cogiendo por orden, en nuestro caso en el primero iría el nombre y en el segundo la edad. No obstante con el número dentro del {} haces referencia a que variable se insertará, lo puede especificar tu.

Otra forma de hacerlo sería la siguiente:

 

>>> nombre = "Andrés"

>>> edad = 45

>>> print('Su nombre es {name} y tiene {age} años'.format(name=nombre,age=edad))

Su nombre es Andrés y tiene 45 años

    

 

     3) F-strings. Formatear el string. Para mí es la forma más sencilla, solo tenemos que poner una f delante del texto, que en python siempre va entre " " e insertar dentro de {} las variables a mostrar.

 

>>> nombre = "Andrés"

>>> edad = 45

>>> print(f'Su nombre es {nombre} y tiene {edad} años')

Su nombre es Andrés y tiene 45 años

 

 

Dar formato a una cadena de texto.

 

Hay ocasiones en que es útil el dar un determinado formato a las cadenas de caracteres a la hora de imprimirlas por pantalla para hacerlo más legible. Esto se puede conseguir con cualquiera de los 3 métodos anteriores, aunque por modernidad y rapidez yo voy a usar el tercero. 

Para dar formato a un string simplemente ponemos ":" después de la variable y dentro de los {} y añadimos los parámetros que nos interesen para darle formato. Para que quede clara la idea vamos a ver un ejemplo sin formatear y otro aplicando un formato.

Creamos una lista con 5 números enteros y queremos mostrarlos por pantalla junto a su suma, como si los estuviéramos sumando en papel. 

Sin formato:   

  >>> lista = [300040017_000257]  

      >>> for i in lista:   

      >>>     print(i)  

      >>> print("__________")   

      >>> print(sum(lista))

   

        3000

        400

        17000

        25

        7

     __________

        20432      

 

Si queremos que quede como cuando realizamos una suma en papel tenemos que mostrar los números alineados a la derecha. Esto lo conseguimos formateando la salida de esta forma: 

       

   >>> lista = [300040017_000257]

       >>> for i in lista:

       >>>   print(f"{i:10}")

       >>> print("__________")

       >>> print(f"{sum(lista):10}")     

 

                      3000

                        400

                    17000

                          25

                            7

                __________

                    20432

     

 

Cuando ponemos entre llaves la variable a sustituir podemos agregar luego los dos puntos y la cantidad de espacios que ocupará la variable. Por defecto dentro de ese espacio definido los caracteres se alinean a la derecha ocupando los espacios. También podemos colocar entre {} la llamada a una función (la función sum retorna la suma de todos los valores de la lista.

Detrás de los ':' podemos definir todos estos argumentos. Todos ellos son opcionales y su orden de aparición sería el siguiente:

 

[[relleno]alineación][signo][#][0][anchura_mínima][.precisión][tipo]

 

[[relleno]alineación]    

Los argumentos del parámetro alineación pueden ser los siguientes:

'<' - Obliga a los caracteres del campo a alinearse a la izquierda dentro de los espacios. (Por defecto)

'>' - Obliga a los caracteres del campo a alinearse a la derecha dentro del espacio disponible.

'=' - Obliga a que los caracteres de relleno ser coloquen después del signo (si lo hay) pero antes de los dígitos. Esta opción se usa para imprimir campos con el formato +000000120. Esta opción de alineación solo es válida para tipos numéricos.

'^' - Obliga a los caracteres del campo a centrarse dentro de los espacios. 

 

Solamente si usamos el parámetro alineación podemos usar junto con él, el parámetro relleno.  El carácter opcional de relleno índica el carácter que queremos que se use para rellenar el campo al ancho mínimo que hayamos definido. Como ya dijimos antes, si utilizamos este carácter de relleno, debe ir seguido de una bandera de alineación.

 

[signo]

Solo es válido para valores numéricos y puede ser uno de los siguientes:

'+'  - Indica que se debe usar el signo tanto para números positivos como negativos.

'-'  - Indica que se debe usar el signo solamente para los números negativos (por defecto).

' '  - (un espacio en blanco) Indica que se debe usar un espacio inicial para los números positivos.

 

[#] 

Si se utiliza este parámetro significa que los números enteros se formatearán de una "forma alternativa". Esto quiere decir que la salida para los números binarios, octales y hexadecimales tendrá el prefijo "Ob", "Oo" y "Ox", respectivamente.

 

[anchura_mínima]

Es un número entero que va a definir la anchura mínima del campo. Si no se especifica, el ancho del campo estará determinado por el contenido. Si el campo anchura_mínima está precedido por un carácter cero ("ose el número 0") se habilita el relleno con ceros. Esto es lo mismo que un tipo de alineación con el argumento "=" y un carácter de relleno de 0 (ceros).

 

    lista = [300040017_000-257]

    for i in lista:

      print(f"{i:010}")

    print("__________")

    print(f"{sum(lista):10}"

 

    Salida:

 

0000003000

0000000400

0000017000

-000000025

0000000007

__________

     20382

  

 

[.precisión] 

 

    Es un número decimal que indica cuantos dígitos deben mostrarse después del punto decimal.

 

Para los tipos no numéricos, el campo indica el tamaño máximo del campo; en otras palabras, cuantos caracteres se usarán del contenido del campo.

 

    La .precisión se ignora cuando se trata de números enteros.

 

 

[tipo] 

 

    Define como deben presentarse los datos.

 

    Los tipos de presentación para números enteros son: 

 

   

'b' - Binario. El número se muestra en base 2.

'c' - Carácter. Convierte el entero al correspondiente carácter Unicode antes de imprimirlo.

'd' - Entero Decimal. El entero se muestra en base 10.

'o' - Formato Octal. El número se muestra en base 8.

'x' - Formato Hexadecimal. El número se muestra en base 16, usando letras minúsculas para los dígitos superiores a 9.

'X' - Formato Hexadecimal. El número se muestra en base 16, usando letras mayúsculas paras los dígitos superiores a 9.

'n' - Número. Es lo mismo que 'd', excepto que se usa la configuración local actual para insertar el carácter se separación en los números.

'' (Ninguno espacio en blanco) - lo mismo que 'd'

 

 

Los tipos de presentación de punto flotante disponible son:

 

   

'e' - Notación Exponencial. Imprime el número en notación científica usando la letra "e" para indicar el exponente.

'E' - Notación Exponencial. Igual que el caso anterior solamente que el número se convierte en Mayúsculas.

'f' - Punto Fijo. Muestre el número como un numero de punto fijo.

'F' - Punto Fijo. Igual que el caso anterior pero excepto que el número se muestra en mayúsculas.

'g' - Formato General. Imprime el número como un número de punto fijo a nos ser que sea demasiado grande en cuyo caso se muestra en notación exponencial "e".

'G' - Formato General. El mismo caso que en el punto anterior excepto que se utiliza la presentación "E".

'n' - Número. Es lo mismo que 'g', excepto que usa la configuración regional actual para insertar el carácter de separación de los números.

'%' - Porcentaje. Multiplica el número por 100 y muestra el número en formato fijo "f", seguido del signo de porcentaje (%).

'' (Ninguno) - similar a 'g', excepto que imprime al menos un dígito después del punto decimal.

 

 

Aunque parece complicado en realidad es bastante sencillo, solo debes tener claro cómo quieres formatear la salida. Pondré un ejemplo donde aparecen gran parte de los argumentos:

 

     

        lista = [3000400.13217_000-257]

        for i in lista:

          print(f"{i:@>+10.2f}")

        print("__________")

        print(f"{sum(lista):10}")

     

Salida:

           @@+3000.00

@@@+400.13

@+17000.00

@@@@-25.00

@@@@@+7.00

__________

          20382.132

     

  Otras cosas que se pueden aplicar a la función Print().


  Cuando utilizamos esta función automáticamente imprime al finalizar de mostrar los datos por pantalla, un salto de línea. Sin embargo, puede que hay ocasiones en que nos interese que esto no ocurra y que el siguiente print() vaya a continuación del anterior. 

 

Esto se puede conseguir utilizando el parámetro end="". Dentro de las comillas podemos poner en lo que nos interese que termine la impresión de print; que termine sin más end="",  que ponga un espacio con el siguiente print end=" ", que ponga un punto, end="." o lo que se te ocurra.

 

Por ejemplo, la función print() de forma estándar mostraría: 

        print("hola")

        print("¿Cómo estás?") 

        Salida:

    

   hola 

   ¿Cómo estás?

      

Sin embargo, me gustaría que no hiciese el salto de línea y que lo escribiese todo seguido dejando un espacio en blanco entre ambos print().

           

print("hola", end=" ")

print("¿Cómo estás?")

         Salida:         

hola ¿Cómo estás?

 

   

  - En otras ocasiones puede ocurrir lo contrario, que dentro de una instrucción print() quieras hacer un salto de línea. Pues esto es tan sencillo como utilizar el carácter especial \n dentro del texto en el que quieras realizarlo.

 

      print("Esta es la primera linea\ny esta la segunda") 

      Salida: 

      Esta es la primera línea 

      y esta la segunda

 

 

Después de ver esto, te habrás dado cuenta que el parámetro por defecto de print() es end="\n"

Otros caracteres especiales que se pueden utilizar en las cadenas son:

Caracteres de escape en python.

\n    => Salto de línea.
\t    => Tabulación.
\r    => Retorno.
\f    => Salto de Página.
\v    => Tabulación vertical.
\     => Por si solo ignora el carácter que le sigue. Escapa ese carácter. Por ejemplo
para poner unas comillas en un texto y que no de error una de las formas de hacerlo es:
print('\"Este texto va entre comillas\"')       

  

Otros métodos para la manipulación de cadenas. 

Las cadenas son objetos inmutables parecidos a las tuplas. Se pueden recorrer, indexar y aplicar métodos que alteren su estructura. Veamos alguno de ellos.

Método len("cadena")

Nos indica la longitud de una cadena incluyendo los espacios en blanco.


>>> print(len("Dos y Dos"))
9


Método str.count(subcadena, [start = 0, end = len(str)])


Devuelve el número de veces que se repite la subcadena dentro de la cadena principal. Podemos acotar la búsqueda indicando la posición de inicio y fin dentro de la cadena, aunque esto es opcional. Si no lo ponemos buscará en toda la cadena.

Busca todas las subacenas que hay en el texto.

>>> print("El sueño de una noche de verano".count("a"))
2
>>> print("El sueño de una noche de verano".count("eño"))
1
>>> cadena = "El sueño de una noche de verano"
>>> print(cadena.count("o",8,len(cadena)))
2


Método str.find(valor, start = 0, end = len(str))

Devuelve la posición de la primera ocurrencia de la subcadena. Si no existe la subcadena devuelve -1.


>>> cadena = "Pienso luego existo"
>>> print(cadena.find("ego"))
9
>>> print(cadena.find("pe"))
-1

Una variante es str.rfind(valor, start, end) que devuelve el índice de la última ocurrencia de la cadena. Veamos un ejemplo de la diferencia de ambos métodos:

>>> cadena = "ab c ab"
>>> print(cadena.find("ab"))
0
>>> print(cadena.rfind("ab"))
5


Método str.index(valor, inicio, fin) y str.rindex(valor, inicio, fin). Es igual que el método anterior, solo se diferencia en que en caso de no encontrarse el valor a buscar da un error.


>>> cadena = "ab c ab"
>>> print(cadena.index("f"))
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    print(cadena.index("f"))
ValueError: substring not found


Método str.zfill(n).

Se utiliza para rellenar con ceros a la izquierda una cadena de caracteres que generalmente suele ser un número. (n) es el número del tamaño del campo. El espacio sobrante entre el tamaño del campo y el tamaño de los caracteres se rellenarán con ceros. 

      >>> print("4,56".zfill(6)) 

      004,56  


Método str.capitalize().

Se utiliza para que el primer carácter de la cadena aparezca en mayúsculas y el resto en minúsculas.

>>> print("vino de AlgeCiras".capitalize())
Vino de algeciras

 

Método str.upper() o str.lower(). Se utilizan para poner todos los caracteres que conforman una cadena de texto en Mayúsculas o Minúsculas.  

        >>> print("todo en mayusculas".upper())    

         TODO EN MAYUSCULAS

        >>> print("TODO el texto en MINúSCULAS".lower())

         todo el texto en minúsculas



 Método str.swapcase().

Intercambia mayúsculas por minúsculas y viceversa.

>>> print("vino de AlgeCiras".swapcase())
VINO DE aLGEcIRAS


Método str.strip("<caracteres>").

Devuelve una copia de la cadena tras eliminar los caracteres al principio y al final de la misma especificados en <caracteres>. Si no se pone argumento elimina los espacios en blanco (\), los saltos de línea (\n) y las tabulaciones (\t) del principio y del final.

>>> print("   vino de AlgeCiras    ".strip())
vino de AlgeCiras
# Sin los espacios en blanco al principio y al final.
>>> print("ab c ab".strip("a"))
b c ab

.lstrip() y rstrip() realizan la misma función solo que el primero lo hace solo en el principio de la cadena y el segundo solo al final de la misma.


Método str.replace(x, y, [nº veces])

En una cadena remplaza el carácter x por el y el número de veces indicado. Si no se especifica el número de veces se reemplaza el caracter x por el y en TODA la cadena.


>>> print("murcielago".replace("o","a"))
murcielaga


Método str.split([separador], [max nº de veces])

Separa los elementos de una cadena en una lista. Si no especificamos un separador se sobreentiende que se utiliza un espacio en blanco. Por ejemplo para dividir una frase en las palabras que la componen podemos utilizar:

>>> print("Eloisa está debajo de un almendro".split())
['Eloisa', 'está', 'debajo', 'de', 'un', 'almendro']

print("Eloisa está debajo de un almendro".split(" ",2))
['Eloisa', 'está', 'debajo de un almendro']

Un método similar es str.splitlines() que devuelve en una lista todas las líneas de una cadena o párrafo, para entendernos. En este caso el separador se basa en los saltos de línea encontrados (\n).

Lo contrario a estos métodos seria "separador".join(iterable) que une una lista de cadenas usando un separador.

>>> lista = "Eloisa está debajo de un almendro".split()
>>> print(lista)
['Eloisa', 'está', 'debajo', 'de', 'un', 'almendro']
>>> print(" ".join(lista))
Eloisa está debajo de un almendro


Métodos str.startwith(valor) y str.endwith(valor)

Como su nombre indica devuelve True si la cadena empieza o termina con el valor introducido. False en caso contrario.