0% encontró este documento útil (0 votos)
102 vistas12 páginas

10 Python - Cadenas de Caracteres

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
102 vistas12 páginas

10 Python - Cadenas de Caracteres

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

PYTHON: GUÍA 10 - STRINGS Prof.

Mariángeles Glavina
PHYTON: Cadenas de caracteres
Las cadenas (o strings) son un tipo de datos compuestos por secuencias de caracteres que representan texto. Estas cadenas
de texto o cadenas de caracteres son objetos de tipo str y se delimitan mediante el uso de comillas simples o dobles.

Por ejemplo "Hola mundo" es un string. Para trabajar con string tenemos métodos y funciones especiales.

Recordemos que las cadenas son tipos de datos iterables, es decir, sus elementos pueden ser recorridos con un ciclo for al
igual que los elementos de una lista o tupla.

Por ejemplo:

CADENA=input("ingrese una cadena: ")

for i in CADENA:

print(i, end="")

imprimirá en pantalla los caracteres de la cadena uno al lado del otro, ya que la variable I guardará en cada iteración, cada
carácter de la cadena

operador + y función str()


El operador + puede sumar números, puede concatenar listas, y además puede concatenar textos.

La función str() convierte a texto el dato al que se le aplique

9 error 45 45 45 45

Función len()
Al igual que en las listas, la función len() devuelve la longitud de la cadena, es decir, la cantidad de caracteres que tiene,
incluidos los espacios y los signos de puntuación.

4 5 0 15

Métodos de formato
Método: capitalize()
Bienvenido
Retorna: una copia de la cadena a mi
con la primera letra en mayúsculas.
aplicación
Método: lower() Retorna: una
josé pérez
copia de la cadena en minúsculas.

Método: upper()
JOSÉ PÉREZ
Retorna: una copia de la cadena en
mayúsculas.
Método: swapcase()
jOSÉ pÉREZ
Retorna: una copia de la cadena
convertidas las mayúsculas en
minúsculas y viceversa.

Método: title()
Mariposa
Retorna: una copia de la cadena Tecknicolor
convertida, poniendo en
mayúscula la primer letra de cada
palabra y en minúscula las demás

Métodos de alineación

Método: ===========Bienvenido a mi aplicación=========


cadena = "Bienvenido a mi aplicación" ===
center(longitud, print (cadena.center(50, "="))
"caracter de relleno")
cadena = "Bienvenido a mi aplicación" Bienvenido a mi aplicación
Retorna: una copia de print (cadena.center(50, " "))
la cadena centrada.
Método: cadena ="Bienvenido a mi aplicación" Bienvenido a mi aplicación====================
print (cadena.ljust(50, "=")) ===
ljust(longitud,
"caracter de relleno")

Retorna: una copia de


la cadena alineada a la
izquierda.

Método: =======================Bienvenido a mi
cadena ="Bienvenido a mi aplicación" aplicación
rjust(longitud, print (cadena.rjust(50, "="))
"caracter de relleno")
Bienvenido a mi
Retorna: una copia de cadena ="Bienvenido a mi aplicación" aplicación
la cadena alineada a la print (cadena.rjust(50, " "))
derecha.

Método: zfill(longitud)
numero_factura = 1575
Retorna: una copia de print (str(numero_factura).zfill(12)) 000000001575
la cadena rellena con
ceros a la izquierda
hasta alcanzar la
longitud final indicada.
Métodos de búsqueda

Método:
2
count("subcadena", 0
posicion_inicio, 1
posicion_fin)
7
Retorna: un entero
5
representando la
3
cantidad de
0
apariciones de
1
subcadena dentro de 9
cadena. 4
4

Método:
0
find("subcadena", -1
posicion_inicio, 4
posicion_fin)
1
Retorna: un entero
7
representando la
13
posición donde inicia
16
la subcadena dentro
44
de cadena. Si no la -1
encuentra, retorna -1. 1
2

Métodos de validación

Saber si una cadena


comienza con una subcadena True
determinada False
False
Método: False
startswith("subcadena", True
posicion_inicio, posicion_fin) False
True
Retorna: True o False

Saber si una cadena termina


con una subcadena True
determinada True
False
Método: False
endswith("subcadena", False
posicion_inicio, posicion_fin) True
False
Retorna: True o False
Saber si una cadena es False
alfanumérica (solo contiene
letras y/o números) False

Método: isalnum() True

Retorna: True o False


Saber si una cadena es
alfabética (contiene solo False
letras)
True
Método: isalpha()
False
Retorna: True o False
False

Saber si una cadena es cadena = "pepegrillo 75"


numérica (contiene solo print(cadena.isdigit()) False
números) cadena = "7584"
print(cadena.isdigit()) True
Método: isdigit() cadena = "75 84"
print(cadena.isdigit()) False
cadena = "75.84"
Retorna: True o False
print(cadena.isdigit()) False

Saber si una cadena contiene cadena = "pepe grillo"


solo minúsculas print(cadena.islower()) True
cadena = "Pepe Grillo"
Método: islower() print(cadena.islower()) False
cadena = "Pepegrillo"
print(cadena.islower()) False
Retorna: True o False
cadena = "pepegrillo75"
print(cadena.islower()) True

Saber si una cadena contiene cadena = "PEPE GRILLO"


solo mayúsculas print(cadena.isupper()) True
cadena = "Pepe Grillo"
Método: isupper() print(cadena.isupper()) False
cadena = "Pepegrillo"
print(cadena.isupper()) False
Retorna: True o False
cadena = "PEPEGRILLO"
print(cadena.isupper()) True

Saber si una cadena contiene cadena = "pepe grillo"


solo espacios en blanco print(cadena.isspace()) False
cadena = " "
Método: isspace() print(cadena.isspace()) True

Retorna: True o False

Saber si una cadena tiene


Formato De Título cadena = "Pepe Grillo"
print cadena.istitle() True
Método: istitle() cadena = "Pepe grillo"
print cadena.istitle() False
Retorna: True o False
Métodos de Sustitución
Dar formato a una cadena, sustituyendo texto dinámicamente

Método: format(*args, **kwargs) Retorna: la cadena formateada.

cadena = "bienvenido a mi aplicación {0}"


print(cadena.format("en Python")) bienvenido a mi aplicación en Python

cadena = "Importe bruto: ${0} + IVA: ${1} = Importe neto: {2}"


print(cadena.format(100, 21, 121))
Importe bruto: $100 + IVA: $21 = Importe neto: 121

cadena = "Importe bruto: ${bruto} + IVA: ${iva} = Importe neto: {neto}"


print(cadena.format(bruto=100, iva=21, neto=121))

Importe bruto: $100 + IVA: $21 = Importe neto: 121

print(cadena.format(bruto=100, iva=100 * 21 / 100, neto=100 * 21 / 100 + 100))

Importe bruto: $100 + IVA: $21 = Importe neto: 121

Reemplazar texto en una cadena

Método: replace("subcadena a buscar", "subcadena por la cual reemplazar")

Retorna: la cadena reemplazada.

buscar = "nombre apellido"


reemplazar_por = "Juan Pérez"
print("Estimado Sr. nombre apellido:".replace(buscar, reemplazar_por))

Estimado Sr. Juan Pérez:

Eliminar caracteres a la izquierda y derecha de una cadena

Método: strip('caracter') Retorna: la cadena con los caracteres especiales eliminados

cadena = " www.eugeniabahit.com "


print(cadena.strip())

www.eugeniabahit.com

nombre=",,,,,**,, Mariángeles Glavina ,."


print(nombre.strip(',* .'))
Mariángeles Glavina

Eliminar caracteres a la izquierda o a derecha de una cadena

Método: lstrip() o rstrip()

Retorna: la cadena sustituida con los caracteres indicados eliminados.


cadena = "www.eugeniabahit.com"
print(cadena.lstrip("w."))

eugeniabahit.com

cadena = " www.eugeniabahit.com"


print(cadena.lstrip())
www.eugeniabahit.com

cadena = "www.eugeniabahit.com "


print(cadena.rstrip())
www.eugeniabahit.com

Métodos de unión y división


Unir una cadena de forma iterativa

Método: join(iterable)

Retorna: la cadena unida con el iterable (la cadena es separada por cada uno de los elementos del
iterable).

formato_numero_factura = ("Nº 0000-0" , "-0000 (ID: " , ")")


numero = "275"
numero_factura = numero.join(formato_numero_factura)
print(numero_factura)

Nº 0000-0275-0000 (ID: 275)

Partir una cadena en tres partes, utilizando un separador

Método: partition("separador")

Retorna: una tupla de tres elementos donde el primero es el contenido de la cadena previo al
separador, el segundo, el separador mismo y el tercero, el contenido de la cadena posterior al
separador.

tupla = "http://www.eugeniabahit.com".partition("www.")
print(tupla)
('http://', 'www.', 'eugeniabahit.com')

Partir una cadena en varias partes, utilizando un separador

Método: split("separador")

Retorna: una lista con todos elementos encontrados al dividir la cadena por un separador.

palabras = "python, guia, curso, tutorial".split(", ")


print(palabras)
['python', 'guia', 'curso', 'tutorial']

Partir una cadena en en líneas

Método: splitlines()

Retorna: una lista donde cada elemento es una fracción de la cadena divida en líneas.
texto = """Linea 1
Linea 2
Linea 3
Linea 4
"""
Print(texto.splitlines())
['Linea 1', 'Linea 2', 'Linea 3', 'Linea 4']

texto = "Linea 1\nLinea 2\nLinea 3"


print(texto.splitlines())
['Linea 1', 'Linea 2', 'Linea 3']

Rebanando cadenas (Slicing)


Las cadenas de caracteres son como listas numeradas de elementos, en donde importa el orden.

Por ejemplo: “Python” es una cadena de 6 caracteres, a cada uno le corresponde un número que indica el lugar que ocupa
en la cadena , comenzando con 0 o también con números negativos

P⁞y⁞t⁞h⁞o⁞n

0 1 2 3 4 5

-6 -5 -4 -3 -2 -1

El slicing es una capacidad de las cadenas que devuelve un subconjunto o subcadena utilizando dos índices [inicio:fin]:

 El primer índice indica donde empieza la subcadena (se incluye el carácter).

 El segundo índice indica donde acaba la subcadena (se excluye el carácter).

Ejemplo:

palabra = "Python"

print( palabra[0:2] ) Py

print( palabra[2:6] ) thon

print( palabra[-4:-2] ) th

Si en el slicing no se indica un índice se toma por defecto el principio y el final:

Ejemplo

palabra = "Python"

print( palabra[:2] ) Py

print( palabra[2:] ) thon

print( palabra [ :-2 ] ) Pyth

print( palabra [-2: ]) on

print( palabra [ : ] ) Python

print ( palabra[0:1] + palabra[2:5] ) Ptho

print ( palabra [:2] + palabra [2:] ) Python

print ( palabra [-1::-1]) nohtyP


Inmutabilidad
Una propiedad de las cadenas es que no se puede modificar su contenido.

Si intentamos reasignar un carácter, no nos dejará:

Por ejemplo:

palabra = "Python "

palabra[0] = "N"
print(palabra)

Es un código que dará error

Sin embargo, utilizando slicing y concatenación podemos generar nuevas cadenas fácilmente:

palabra = "Python "


palabra = "N" + palabra[1:]

print(palabra) Nython

EJERCICIOS
9.A) Codificá un programa para que al ingresar una palabra cuente la cantidad de letras que posee la misma y las imprima
una debajo de otra

9.B) Ahora a la inversa, codificá un programa para que el usuario ingrese una palabra letra por letra (previamente le podés
preguntar al usuario cuántas letras va a ingresar o pedir que para finalizar ingrese un carácter especial), y el programa
deberá mostrar la palabra completa con la primer letra en mayúscula y las demás en minúscula

9.C) Se pide al usuario que ingrese una cadena de texto y luego otra. El programa debe informar cuál cadena es más larga o
decir si tienen la misma cantidad de caracteres

9.D) Se pide al usuario que escriba "cara" o "ceca". El programa debe "lanzar una moneda" e informar si el usuario acertó.

Previamente deberá informar al usuario un error si éste no escribió CARA-Cara-CaRa........ o CECA-Ceca-CeCa..... o


cualquiera de sus combinaciones.

9.E) Codificá un programa para que el usuario ingrese su DNI sin puntos y el programa agregue los puntos y lo muestre

9.F) Indique si se trata de un palíndromo (capicúa) Por ejemplo, anita lava la tina es un palíndromo (se lee igual de
izquierda a derecha que de derecha a izquierda).

9.G) Realiza un proyecto con funciones para que, ingresada una cadena, cada función imprima:

- F1: Imprima los dos primeros caracteres y los tres últimos caracteres.

- F2: solamente los tres primeros caracteres en mayúsculas,

- F3: los tres primeros caracteres en minúsculas y los demás en mayúsculas

- F4: Imprima dicha cadena cada dos caracteres. Ej.: recta debería imprimir rca

- F5: cada carácter reemplazado por asteriscos,

- F6: cuántas vocales posee

- F7: cada vocal reemplazada por un guión bajo

- F8: separe cada letra con guiones

- F9: Devuelva solamente las letras consonantes. Por ejemplo, si recibe “algoritmos” o “logaritmos” debe devolver
“lgrtms”.
- F10: Devuelva solamente las letras vocales. Por ejemplo, si recibe “sin consonantes” debe devolver “i ooae”.

- F11: Devuelve la cadena en forma inversa, por ejemplo si se ingresa la cadena CORAZON deberá retornar NOZAROC.

9.H) Realiza un proyecto con tres funciones, para que ingresada una cadena de palabras, se imprima:

- F1: cada palabra renglón por renglón

- F2: La primera letra de cada palabra. Por ejemplo, si recibe Universal Serial Bus debe devolver USB.

- F3: Las palabras que comiencen con la letra A. Por ejemplo, si recibe Antes de ayer debe devolver Antes ayer.

9.I) ¿Recordás en la guía 2, el ejercicio para calcular el dígito verificador del número de CUIL?

Esta vez el usuario ingresa M o F (por masculino o femenino) NO IMPORTA SI LO INGRESA CON MAYÚSCULA O MINÚSCULA,
pero no sea acepta otras letras que no sean M o F.

El usuario debe ingresar el DNI con el siguiente formato 00.000.000 (verificar que tenga 8 cifras y que los puntos estén en el
lugar correcto) o con el siguiente formato 0.000.000 (verificar que tenga 7 cifras y que los puntos estén en el lugar correcto.

Luego realizar el algoritmo para que el programa muestre completo el número de CUIL, con el siguiente formato:

xx-00000000-x

RECORDÁ EL ALGORTIMO:

El número de CUIL de una persona se forma por un 20 (si el género asignado en el DNI al nacer es “hombre”) o por un 27 (si
el género asignado en el DNI al nacer es “mujer”) seguido del número del DNI y para finalizar un número de una cifra,
llamado DÍGITO VERIFICADOR.

Por ejemplo:

el CUIL de Carlitos Tevez es 20 – 30577255 – 1

20 porque es hombre

30577255 porque es su DNI

1 es el dígito verificador Pero… ¿Cómo se calcula el dígito verificador de una cifra?

- Se procede a tomar el número de 10 dígitos compuesto por los 2 primeros más los 8 dígitos siguientes,

de derecha a izquierda, multiplicando cada dígito por los números que componen la serie numérica 2,3,4,5,6,7 (si se ha
aplicado la serie hasta el 7 y quedan dígitos por multiplicar, se comienza la serie nuevamente):

Por ejemplo, en el caso de Tevez, los 10 primeros dígitos son 20-30577255

Se realizan los productos empezando por el último número

5 x 2 = 10 5 x 3 = 15 2 x 4 = 8 7 x 5 = 35 7 x 6 = 42 5 x 7 = 35 0 x 2 = 0 3 x 3 = 9 0 x 4 = 0 2 x 5 = 10

- Luego se suman los resultados de estos productos, como se muestra a continuación

10 + 15 + 8 + 35 + 42 + 35 + 0 + 9 + 0 + 10 = 164

- Al número obtenido por la suma del producto de cada dígito por la serie ya mencionada, se le aplica módulo 11, o sea, se
divide por 11 y se determina el resto de la división.

164/11 tiene resto 10

- Ahora se hace 11 menos ese resto 11 – 10 = 1

Por lo tanto el dígito verificador del CUIL de Tévez es 1, como vimos en un principio

¡¡ATENCIÓN!! ESTE SISTEMA TIENE UNA FALLA, Y POR ESO ALGUNAS PERSONAS TIENEN SU CUIL CON UN 23, en lugar de 20
o 27.

POR EJEMPLO: ¿Cuál sería el dígito verificador del CUIL de Lio Messi, sabiendo que su DNI es 33016244?
Comprobamos en nuestro programa que el dígito verificador es 10,

pero 10 es un número de 2 cifras, o sea, no es un dígito (dígito: nro del 0


al 9). En ese caso, se reasigna el identificador de género 23, en lugar de
20 y se procede a calcular el nuevo dígito. (lo mismo para el género
femenino)

En este caso verificamos que el CUIL de Messi es 23-33016244-9.

Algo similar sucede cuando el dígito verificador da 11, en ese caso se


asigna como dígito al 0.

9.J) Crear un programa para validación de nombres de usuarios. Dicho módulo, deberá cumplir con los siguientes criterios
de aceptación:

• El nombre de usuario debe contener un mínimo de 6 caracteres y un máximo de 12.

• El nombre de usuario debe ser alfanumérico.

• Nombre de usuario con menos de 6 caracteres, retorna el mensaje "El nombre de usuario debe contener al menos 6
caracteres".

• Nombre de usuario con más de 12 caracteres, retorna el mensaje "El nombre de usuario no puede contener más de 12
caracteres".

• Nombre de usuario con caracteres distintos a los alfanuméricos, retorna el mensaje "El nombre de usuario puede
contener solo letras y números".

• Nombre de usuario válido, retorna True.

9.K) Crear un programa para validación de contraseñas. Dicho módulo, deberá cumplir con los siguientes criterios de
aceptación:

• La contraseña debe contener un mínimo de 8 caracteres.

• Una contraseña debe contener letras minúsculas, mayúsculas, números y al menos 1 carácter no alfanumérico.

• La contraseña no puede contener espacios en blanco.

• Contraseña válida, retorna True.

• Contraseña no válida, retorna el mensaje "La contraseña elegida no es segura".

9.L) Se ingresa “apellido, nombre” de una determinada cantidad de alumnos. El programa deberá mostrar una lista con los
apellidos y otra lista con los nombres

9.M) Dados los dos primeros párrafos del artículo Catedral de la Asunción en Jaén, desarrolla un programa en Python que
nos permita conocer la palabra con más letras en el texto.

"La Santa Iglesia Catedral de la Asunción de la Virgen es la catedral renacentista de Jaén, sede del obispado de Jaén, en
la comunidad autónoma de Andalucía, España. Se ubica en la Plaza de Santa María, frente al Palacio Municipal y el
Palacio Episcopal.

La catedral actual fue concebida en el siglo xvi para sustituir al anterior templo gótico del siglo xv. La construcción se
prolongó durante varios siglos, a pesar de lo cual la idea original permaneció intacta. Destacan la sala capitular y la
sacristía, que son la obra cumbre de Andrés de Vandelvira, y una de la obras más importantes del renacimiento español.
También es sobresaliente su fachada principal, una de las principales obras del barroco español, construida tras la
consagración del templo en 1660. Igualmente, destaca el coro neoclásico debido a su belleza y al gran número de sitiales
que lo convierten en uno de los más grandes de España. Una vez finalizadas las obras del edificio, las mismas
continuaron en los siglos siguientes principalmente en la decoración interior y de las capillas. Además, a consecuencia del
terremoto de Lisboa de 1755 fueron necesarias obras de consolidación en la fachada norte, así como la construcción de la
Iglesia del Sagrario. "

9.N) Dado el texto del ejercicio anterior, queremos cargar todas las palabras (sin caracteres especiales) en una lista, y
contar cuántas palabras diferentes tiene, (ojo, “que” y “Que” contarían como palabras repetidas, pero “qué” y “que”
cuentan como palabras diferentes)

9.O) Escribí un programa que lea una cadena y devuelva un diccionario con la cantidad de apariciones de cada palabra en la
cadena. Por ejemplo, si recibe “Qué lindo día que hace hoy” debe devolver: ‘que’: 2, ‘lindo’: 1, ‘día’: 1, ‘hace’: 1, ‘hoy’: 1

9.P) Tenemos guardado en un diccionario los códigos morse correspondientes a cada caracter. Escribí un programa que lea
una palabra y la muestre usando el código morse. codigo = {

'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.',

'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..',

'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.',

'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-',

'Y': '-.--', 'Z': '--..', '1': '.----', '2': '..---', '3': '...--', '4': '....-',

'5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.', '0': '-----',

'.': '.-.-.-', ',': '--..--', ':': '---...', ';': '-.-.-.', '?': '..--..', '!': '-.-.--',

'"': '.-..-.', "'": '.----.', '+': '.-.-.', '-': '-....-', '/': '-..-.', '=': '-...-',

'_': '..--.-', '$': '...-..-', '@': '.--.-.', '&': '.-...', '(': '-.--.', ')': '-.--.-' }

9.Q) Usando el diccionario de las claves morses del ejercicio anterior ahora nos pide un código morse donde cada letra esta
separada por espacios y nos da la cadena correspondiente.

9.R) Creá un diccionario con datos de personas, en la que la clave es el DNI y los datos a guardar de cada persona es el
apellido y nombre, con el siguiente formato: “apellido, nombre/s”

- Preguntar si se desea cargarle datos a la tabla o continuar con el programa si la persona elige que no. (en la
consola)

- Si se desea ingresar datos: El programa debe verificar que la cadena apellido y nombre tenga solo una coma, que
no contenga números, sino debe informar de un error y volver a pedir hasta que sea ingresado correctamente. Si algún DNI
ya existe debe preguntar si desea modificar ese registro. El ingreso termina cuando el usuario así lo decida.

- Luego del ingreso, todos los datos del diccionario deberán ser cargados en otro diccionario, en donde la clave es el
DNI y el valor es una lista con dos lugares, en el primer lugar el NOMBRE/S y en el segundo lugar el APELLIDO.

9.S) PARA PENSAR: Implementa una función cuenta_subcadenas_ax(cadena) que devuelva el número de subcadenas
contenidas en el string cadena que comienzan por la letra A y terminan por la letra X.

Por ejemplo, dada la cadena de entrada "CAXAAYXZA", hay cuatro subcadenas que comienzan con "A" y terminan con "X",
que son: AX, AXAAYX, AAYX y AYX.

• La cadena de entrada estará formada únicamente por letras en mayúscula.

• La función debe devolver un número entero con el número de subcadenas encontradas.

>>> cuenta_subcadenas_ax('CAXAAYXZA') muestra 4


>>> cuenta_subcadenas_ax('AAXOXXA') muestra 6
>>> cuenta_subcadenas_ax('AXAXAXAXAX') muestra 15
Bibliografía:

• Bahit, E. (2012). ”Curso Python para principiantes.” Buenos Aires: www.eugeniabahit.com


• Downey, A., Elkner, J., Meyers, (2002) “Aprenda a Pensar Como un Programador”. Recuperado desde:
https://argentinaenpython.com/quiero-aprender-python/aprenda-a-pensar-como-un-programador-
conpython.pdf
• González Duque, R. (2016). “Python para todos” . Recuperado de: www.mundogeek.net
• Grimson, R. y otros (2020) “Curso de programación en Python” UNSAM, Buenos Aires, Recuperado de
https://github.com/python-
unsam/Programacion_en_Python_UNSAM/blob/master/Notas/04_Listas_y_Listas/02_IteradoresLista.md
• Sánchez Alberca, A. (2020). “Ejercicios de Python”. Recuperado
desde: http://aprendeconalf.es/python/ejercicios/
• Sintes Marco, B. (2020). “Introducción a la programación con Python - www.mclibre.org” Recuperado
desde: https://www.mclibre.org/consultar/python/

También podría gustarte