Modulo 2
Modulo 2
2
Contenido del Módulo
• En este módulo se estudia:
• Cómo escribir y ejecutar programas simples en Python.
• Qué son los literales, operadores y expresiones en Python.
• Qué son las variables y cuáles son las reglas que las gobiernan.
• Cómo realizar operaciones básicas de entrada y salida.
3
Programa en Python en Sandbox
• En este curso se utilizara un interprete en línea para Python denominado
Sandbox, está disponible en el lado derecho de las pantallas donde se
presentan los temas.
• Recuerda que Python es interpretado:
• El programa se ejecuta instrucción por instrucción.
• Si existe un error la ejecución se detendrá, y luego se mostrará un mensaje que
describe donde ocurrió el error y su tipo.
• En la parte inferior de Sandbox esta la consola de salida, donde se muestra el
resultado de ejecutar las instrucciones del programa
4
5
Funciones de Python
• Las funciones son un tipo de instrucción en Python que deben:
• Causar algún efecto, por ejemplo mostrar un texto en pantalla
• Evaluar un valor y devolverlo como el resultado de la función
• El nombre de las funciones es significativo, pues indican que es lo que hace
la función.
• Las funciones en Python provienen de:
• Python mismo, este tipo recibe el nombre de funcione integradas
• De módulos, algunos de los módulos vienen con Python, otros pueden requerir una
instalación por separado
• Escritas por el programador (tu mismo)
6
La función print
• Es la primera función estudiada en el curso y las más utilizadas
• Sirve para mostrar en la consola de salida:
• Cadena(s)
• El resultado de la evaluación de una expresión
• Al igual que las otras funciones de Python, print tiene una
estructura para escribirla y utilizarla (Sintaxis de la función).
• El hecho de utilizar una función recibe el nombre de Invocación
7
Sintaxis básica de funciones de Python
nombreFunción (Argumentos)
• Los pasos de interpretación de la función son:
• Verifica el léxico (Python comprueba si el nombre especificado es legal, explora sus
datos internos para encontrar una función existente del nombre; si esta búsqueda
falla, Python cancela el código).
• Verifica la cantidad de argumentos
• Ingresa a la función
• Ejecuta el código de las función
• Regresa al código del programa principal
• En la interpretación una instrucción ocupa una línea de texto
8
Argumentos
• Los argumentos son los datos que acompañan y alimentan a la función
• Están siempre dentro de paréntesis
• Si existen vario, están separados por comas
• Se utilizan de manera posicional (en orden y forma)
• Las cadenas se escriben entre comillas para ser utilizada como argumentos
• En las cadenas existen los caracteres de escape, son símbolos especiales dentro de
la cadena que necesitan ser antecedidos de la barra invertida (\) para ser incluidos en
la cadena, mientras tu ves dos caracteres, Python ve solo uno.
• \n (salto de línea)
• \” (comillas)
• \\ (barra invertida)
9
Argumentos de palabra clave
• Python ofrece otro mecanismo para transmitir o pasar los argumentos, que
puede ser útil cuando se desea convencer a la función print() de que cambie
su comportamiento un poco.
• El mecanismo se llama argumentos de palabra clave. El nombre se deriva del
hecho de que el significado de estos argumentos no se toma de su ubicación
(posición) sino de la palabra especial (palabra clave) utilizada para
identificarlos.
• La función print() tiene dos argumentos de palabra clave que se pueden
utilizar para estos propósitos. El primero de ellos se llama end, y el segundo
es sep
10
Argumentos de palabra clave
• Para utilizarlo es necesario conocer algunas reglas:
• Un argumento de palabra clave consta de tres elementos: una palabra clave que
identifica el argumento (end - termina aquí); un signo de igual (=); y un valor asignado
a ese argumento.
• Cualquier argumento de palabra clave debe ponerse después del último argumento
posicional (esto es muy importante).
• Por ejemplo: print("Mi", "nombre", "es", "Monty", "Python.", sep="-")
• Muestra en pantalla: Mi-nombre-es-Monty-Python.
• El argumento end determina cual será el símbolo que se imprimirá al final de la salida (por
defecto se imprime un salto de línea), y sep que símbolo separara a los otros argumentos
11
Laboratorio 1 – Familiarizarse con print
• Tiempo Estimado: 5-10 minutos Nivel de Dificultad: Muy fácil
• Objetivos
• Familiarizarse con la función print() y sus capacidades de formato.
• Experimentar con el código de Python.
• Escenario
• El comando print() , el cual es una de las directivas más sencillas de Python,
simplemente imprime una línea de texto en la pantalla.
12
Laboratorio 1 – Familiarizarse con print
• Escenario
• En tu primer laboratorio:
• Utiliza la función print() para imprimir la linea "¡Hola, Mundo!" en la pantalla.
• Una vez hecho esto, utiliza la función print() nuevamente, pero esta vez imprime tu nombre.
• Elimina las comillas dobles y ejecuta el código. Observa la reacción de Python. ¿Qué tipo de error
se produce?
• Luego, elimina los paréntesis, vuelve a poner las comillas dobles y vuelve a ejecutar el código.
¿Qué tipo de error se produce esta vez?
• Experimenta tanto como puedas. Cambia las comillas dobles a comillas simples, utiliza múltiples
funciones print() en la misma línea y luego en líneas diferentes. Observa que es lo que ocurre.
13
Laboratorio 2 – Print y su capacidad de formato
• Tiempo Estimado: 5-10 minutos Nivel de Dificultad: Muy fácil
• Objetivos
• Familiarizarse con la función de print() y sus capacidades de formato.
• Experimentar con el código de Python.
• Escenario
• Modifica la primera línea de código en el editor, utilizando las palabras clave sep y
end, para que coincida con el resultado esperado. Recuerda, utilizar dos funciones
print().
• No cambies nada en la segunda invocación de print().
14
Laboratorio 2 – Print y su capacidad de formato
• Escenario
EDITOR CODIGO:
print("Fundamentos","Programación","en")
print("Python")
• Salida Esperada
Fundamentos***Programación***en...Python
15
Laboratorio 3 – Print y su capacidad de formato
• Tiempo Estimado: 5-15 minutos Nivel de Dificultad: Fácil
• Objetivos
• Experimentar con el código Python existente.
• Descubrir y solucionar errores básicos de sintaxis.
• Familiarizarse con la función print() y sus capacidades de formato.
• Escenario
• Modifica libremente el código que dibuja una flecha
16
Laboratorio 3 – Print y su capacidad de formato
• Escenario
• Intenta
• Minimizar el número de invocaciones de la función print() insertando la secuencia \n en las cadenas.
• Hacer la flecha dos veces más grande (pero mantener las proporciones).
• Duplicar la flecha, colocando ambas flechas lado a lado; nota: una cadena se puede multiplicar usando el
siguiente truco: "cadena" * 2 producirá "cadenacadena" (te contaremos más sobre ello pronto).
• Elimina cualquiera de las comillas y observa detenidamente la respuesta de Python; presta atención a donde
Python ve un error: ¿es el lugar en donde realmente existe el error?
• Haz lo mismo con algunos de los paréntesis.
• Cambia cualquiera de las palabras print en otra cosa (por ejemplo de minúscula a mayúscula, Print) - ¿Qué
sucede ahora?
• Reemplaza algunas de las comillas por apóstrofes; observa lo que pasa detenidamente.
17
Literales
• Son datos cuyos valores están definidos por si mismos.
• Son los valores contantes que utilizamos. En Python son:
• Valores Numéricos
• Enteros: 1983, 0o234, 0x1A3D
• Flotantes: 22223.19, 0.000023
• Cadenas: “Hola”, “\”Hola\””
• Valores Lógicos (Booleanos): True, False
18
Enteros
• Son número que no tienen una parte fraccionaria. Pueden
se positivos o negativos
• Desde Python 3.6 se puede usar como separado de
unidades de mil el guion bajo: 1_000_000 (Un millón)
• Pueden ser representados en tres tipos de sistemas
numéricos
• Decimal: 123
• Octal: 0o173
• Hexadecimal: 0x7B
19
Flotantes
• Son números que tienen una parte fraccionara no vacía, aunque
esta sea 0
• Se utiliza el punto . Como separador de la parte fraccionaria.
Pueden ser positivos o negativos
• Son flotantes por ejemplo: 4.0, 0.123, .671
• Un literal con parte fraccionaria igual a cero, sigue siendo
flotante y no se convierte en entero, por ejemplo 4 != 4.0
• Se pueden representar con notación científica. Al imprimir un
flotante siempre se escoge la representación más corta.
• 0.00000000023 = 23E-11
• 1234560 = 123456E6
20
Cadenas
• Las cadenas se emplean cuando se requiere procesar texto
(como nombres de cualquier tipo, direcciones, etc.), no
números.
• Las cadenas requieren estar entre comillas
• Pueden estar computas por caracteres de escape
Pantalla: “Hola” Código: “\”Hola\””
• También se puede utilizar un apóstrofe en lugar de comillas.
• Si se delimita una cadena con una comilla, se debe cerrar con una
comilla.
• Si se inicia una cadena con un apóstrofe, se debe terminar con un
apóstrofe.
21
Cadena especiales
• La cadena vacía es una cadena que no tiene contenido:
“” o ‘’
• Una cadena que contiene dígitos numéricos, no tiene valor numérico directo,
pero se puede convertir en número
“1234” no tiene valor numérico
• Un carácter de escape siempre debe estar compuesto por dos símbolo la
barra invertida(\) sola produce un error.
22
Booleanos
• Son los valores lógicos de verdad: Verdadero(True) y
Falso(False)
• True y False so se pueden cambiar, se deben tomar
estos símbolos como son, incluso respetando las
mayúsculas y minúsculas.
• El lenguaje Python, es un reptil binario.
Pues True == 1 y False==0
23
Laboratorio 4 – Print y su capacidad de formato
• Tiempo Estimado: 5-10 minutos Nivel de Dificultad: Fácil
• Objetivos
• Familiarizarse con la función print() y sus capacidades de formato.
• Practicar el codificar cadenas.
• Experimentar con el código de Python.
• Escenario
• Escribe una sola línea de código, utilizando la función print(), así como los caracteres
de nueva línea y escape, para obtener la salida esperada de tres líneas.
24
Laboratorio 4 – Print y su capacidad de formato
• Escenario
• Salida esperada:
"Estoy"
""aprendiendo""
"""Python"""
25
Operadores en Python
• Phyton puede calcular las principales operaciones matemáticas de tipo
aritmético.
• Los operadores son los símbolos que representan y permiten calcular estas
operaciones.
• Los operadores pueden ser unarios cuando trabajan con un literal o variable,
y pueden ser binarios cuan trabajan con dos literales o variables.
• Las expresiones son la combinación de literales y variables con operadores
para calcular resultados deseados para resolver un problema.
26
Operadores en Python
Operación Operador Ejemplo
Suma + 4+7 = 11
Resta - 3-9 = -6
Multiplicación * 2*8 = 16
División / 7/2 = 3.5
Potencia ** 2**8=256
División entera // 7//2 = 3
Residuo % 7%2 = 1
27
Prioridad de operadores
• En una expresión con varias operaciones y sin paréntesis, la prioridad determina el orden
en el que se ejecutan los operadores.
• Los paréntesis tienen la más alta prioridad y se calculan primero
Prioridad Operadores Observación
0 (Alta prioridad, se calculan primero) ()
1 +,- Signo unario
2 **
3 *, /, //, %
4 (Baja prioridad, se calculan al final) +,- Suma y Resta
28
Enlace de operadores
• El enlace de un operador determina el orden en que se calculan las operaciones de
los operadores con la misma prioridad, los cuales se encuentran dentro de una
misma expresión.
• La mayoría de los operadores de Python tienen un enlazado hacia la izquierda, lo
que significa que el cálculo de la expresión es realizado de izquierda a derecha.
• Por ejemplo: print (9 % 6 % 2)
• Existen dos posibles maneras de evaluar la expresión:
• De izquierda a derecha: primero 9 % 6 da como resultado 3, y entonces 3 % 2 da como
resultado 1. Esta es la forma correcta de calcular
• De derecha a izquierda: primero 6 % 2 da como resultado 0, y entonces 9 % 0 causa un error
fatal.
29
Variables
• Las variables son contenedores destinados a almacenar el
resultado de una expresión. Accedes y utilizas el resultado
de la expresión mediante el nombre de la variable.
• En Python las variables se caracterizan por:
• Tienen un nombre
• Almacenan un valor
• Una variable se crea cuando se le asigna un valor
• No tiene tipo predefinido, el tipo de la variable lo define el valor
que almacena
• Al cambiar el valor o expresión que almacena una variable, esta
también cambia de tipo a esto se denomina Autocasting
30
Reglas para nombrar variables
• Si se desea nombrar una variable, se deben seguir las siguientes reglas:
• El nombre de la variable debe de estar compuesto por MAYÚSCULAS, minúsculas,
dígitos, y el carácter _ (guion bajo).
• El nombre de la variable debe comenzar con una letra.
• El carácter guion bajo es considerado una letra.
• Las mayúsculas y minúsculas se tratan de forma distinta (un poco diferente que en el
mundo real - Alicia y ALICIA son el mismo nombre, pero en Python son dos nombres
de variable distintos, subsecuentemente, son dos variables diferentes).
• El nombre de las variables no pueden ser igual a alguna de las palabras reservadas
de Python (se explicará más de esto pronto).
31
Laboratorio 5 – Tipos de datos en Python
• Tiempo Estimado: 10 minutos Nivel de Dificultad: Fácil
• Objetivos
• Familiarizarse con el concepto de almacenar y trabajar con diferentes
tipos de datos en Python.
• Experimentar con el código en Python.
• Escenario
• A continuación una historia:
Érase una vez en la Tierra de las Manzanas, Juan tenía tres manzanas, María tenía
cinco manzanas, y Adán tenía seis manzanas. Todos eran muy felices y vivieron por
muchísimo tiempo. Fin de la Historia.
32
Laboratorio 5 – Tipos de datos en Python
• Escenario
• Tu tarea es:
• Crear las variables: juan, maria, y adan.
• Asignar valores a las variables. El valor debe de ser igual al número de manzanas que cada quien tenía.
• Una vez almacenados los números en las variables, imprimir las variables en una línea, y separar cada
una de ellas con una coma.
• Después se debe crear una nueva variable llamada total_manzanas y se debe igualar a la suma de las
tres variables anteriores.
• Imprime el valor almacenado en total_manzanas en la consola.
• Experimenta con tu código: crea nuevas variables, asigna diferentes valores a ellas, y realiza varias
operaciones aritméticas con ellas (por ejemplo, +, -, *, /, //, etc.). Intenta poner una cadena con un entero
juntos en la misma línea, por ejemplo, "Número Total de Manzanas:" y total_manzanas.
33
Operadores abreviados
• Muy seguido, se desea utilizar la misma variable al lado derecho y al lado
izquierdo del operador =.
• Python ofrece una manera más corta de escribir operaciones como estas, lo
cual se puede codificar de la siguiente manera:
i = i + 1 ⇒ i += 1
i = i + 2 * j ⇒ i += 2 * j
var = var / 2 ⇒ var /= 2
rem = rem % 10 ⇒ rem %= 10
j = j - (i + var + rem) ⇒ j -= (i + var + rem)
x = x ** 2 ⇒ x **= 2
34
Laboratorio 6 – Realizar operaciones básicas y conversiones.
• Tiempo Estimado: 10 minutos Nivel de Dificultad: Fácil
• Objetivos
• Familiarizarse con el concepto de variables y trabajar con ellas.
• Realizar operaciones básicas y conversiones.
• Experimentar con el código de Python.
• Escenario
• Millas y kilómetros son unidades de longitud o distancia.
• Teniendo en mente que 1 milla equivale aproximadamente a 1.61 kilómetros,
complementa el programa en el editor para que convierta de:
• Millas a kilómetros.
• Kilómetros a millas.
35
Laboratorio 6 – Realizar operaciones básicas y conversiones.
• Escenario
• No se debe cambiar el código existente. Escribe tu código en los lugares indicados
con ###. Prueba tu programa con los datos que han sido provistos en el código
fuente.
CODIGO EN PANTALLA:
kilometers = 12.25
miles = 7.38
miles_to_kilometers = ###
kilometers_to_miles = ###
print(miles, "millas son", round(miles_to_kilometers, 2), "kilómetros")
print(kilometers, "kilómetros son", round(kilometers_to_miles, 2), "millas")
36
Laboratorio 7 – Realizar cálculos básicos
• Tiempo Estimado: 10 - 15 minutos Nivel de Dificultad: Fácil
• Objetivos
• Familiarizarse con los conceptos de números, operadores y
operaciones aritméticas en Python.
• Realizar cálculos básicos
• Escenario
• Observa el código en el editor: lee un valor flotante, lo coloca en una variable llamada
x, e imprime el valor de la variable llamada y. Tu tarea es completar el código para
evaluar la siguiente expresión:
3x3 - 2x2 + 3x - 1
37
Laboratorio 7 – Realizar cálculos básicos
• Escenario
• El resultado debe ser asignado a y.
• Recuerda que la notación algebraica clásica muy seguido omite el operador de
multiplicación, aquí se debe de incluir de manera explicita. Nota como se cambia el
tipo de dato para asegurarnos de que x es del tipo flotante.
CODIGO EN PANTALLA:
x = # codifica aquí tus datos de prueba
x = float(x)
# escribe tu código aquí
print("y =", y)
38
Comentarios
• Quizá en algún momento será necesario poner algunas palabras en el código
dirigidas no a Python, sino a las personas quienes estén leyendo el código
con el fin de explicarles como es que funciona.
• Un texto insertado en el programa el cual es, omitido en la ejecución, es
denominado un comentario.
• Cuando Python se encuentra con un comentario en el programa, el
comentario es completamente transparente, desde el punto de vista de
Python, el comentario es solo un espacio vacío, sin importar que tan largo
sea.
• En Python, un comentario es un texto que comienza con el símbolo # y se
extiende hasta el final de la línea.
39
Laboratorio 8 – Familiarizarse con los comentarios
• Tiempo Estimado: 5 minutos Nivel de Dificultad: Muy Fácil
• Objetivos
• Familiarizarse con el concepto de comentarios en Python.
• Utilizar y no utilizar los comentarios.
• Reemplazar los comentarios con código.
• Experimentar con el código de Python.
• Escenario
• El código en el editor contiene comentarios. Intenta mejorarlo: agrega o quita
comentarios donde consideres que sea apropiado (en ocasiones el remover un
comentario lo hace mas legible), además, cambia el nombre de las variables donde
consideres que esto mejorará la comprensión del código
40
Laboratorio 8 – Familiarizarse con los comentarios
• Escenario
• Los comentarios son muy importantes. No solo hacen que el programa sea más fácil de
entender, pero también sirven para deshabilitar aquellas partes de código que no son
necesarias. Los buenos programadores describen cada parte importante del código, y dan
nombres significativos a variables, debido a que en ocasiones es mucho más sencillo dejar el
comentario dentro del código mismo.
CODIGO EN PANTALLA:
# este programa calcula los segundos en cierto número de horas determinadas
# este programa fue escrito hace dos días
a = 2 # número de horas
seconds = 3600 # número de segundos en una hora
print("Horas: ", a) #imprime el numero de horas
print("Segundos en Horas: ", a * seconds) # se imprime el numero de segundos en determinado numero de
horas
#aquí también se debe de imprimir un "Adiós", pero el programador no tuvo tiempo de escribirlo
#este el es fin del programa que calcula el numero de segundos en 2 horas
41
La función input
• Esta función obtiene datos desde la consola en tipo cadena.
• La función input() es capaz de leer datos que fueron introducidos por el
usuario y pasar esos datos al programa en ejecución.
• La función input() es invocada sin argumentos, la función pondrá la consola
en modo de entrada; aparecerá un cursor que parpadea, y podrás introducir
datos con el teclado, al terminar presiona la tecla Enter; todos los datos
introducidos serán enviados al programa a través del resultado de la función.
42
La función input() con un argumento
• La función input() puede hacer algo más: puede mostrar un mensaje al
usuario sin la ayuda de la función print().
anything = input("Dime algo...")
43
Conversión de datos (casting)
• El resultado de la función input() es una cadena. Si deseas leer un valor
numérico deberás convertir la cadena, que obligatoriamente contenga
números bien escritos, en un valor numérico de cierto tipo concreto.
• Python ofrece dos simples funciones para especificar un tipo de dato y
resolver este problema, aquí están: int() y float().
• La función int() toma como argumento una cadena: int(string), e intenta
convertirlo a un valor entero; si llegase a fallar, el programa entero fallará.
• La función float() toma como argumento una cadena: float(string), e
intenta convertirlo a flotantesi llegase a fallar, el programa entero fallará.
44
Ejemplos de lectura de valores numéricos
Cadena = input(“Ingresa tu nombre”)
varEntera = int(input(“Ingrese su edad”))
varFlotante = float (input(“Ingresa tu estatura en metros”))
45
Operadores de cadenas
• En el ámbito de las cadenas los operadores + y * tienen otra resultado o aplicación.
• Concatenación. El signo de + (más), al ser aplicado a dos cadenas, se convierte
en un operador de concatenación: string + string
• En contraste con el operador aritmético, el operador de concatenación no es conmutativo, por
ejemplo, "ab" + "ba" no es lo mismo que "ba" + "ab".
• Replicación. El signo de * (asterisco), cuando es aplicado a una cadena y a un
número (o a un número y cadena) se convierte en un operador de replicación.
string * number
number * string
• Replica la cadena el numero de veces indicado por el número.
• Un número menor o igual que cero produce una cadena vacía.
46
Conversión a cadena
• A estas alturas ya sabes como emplear las funciones int() y float() para
convertir una cadena a un número.
• Este tipo de conversión no es en un solo sentido. También se puede convertir
un numero a una cadena, lo cual es más fácil y rápido, esta operación es
posible hacerla siempre.
• Una función capaz de hacer esto se llama str():
str(number)
47
Laboratorio 9 – Evaluar expresiones simples
• Tiempo Estimado: 5-10 minutos Nivel de Dificultad: Fácil
• Objetivos
• Familiarizarse con la entrada y salida de datos en Python.
• Evaluar expresiones simples.
• Escenario
• La tarea es completar el código para evaluar y mostrar el resultado de cuatro
operaciones aritméticas básicas.
• El resultado debe ser mostrado en consola.
• Quizá no podrás proteger el código de un usuario que intente dividir entre cero. Por
ahora, no hay que preocuparse por ello.
48
Laboratorio 9 – Evaluar expresiones simples
• Escenario
CODIGO EN PANTALLA:
# ingresa un valor flotante para la variable a aquí
# ingresa un valor flotante para la variable b aquí
49
Laboratorio 10 – Comprender la precedencia y asociatividad
• Tiempo Estimado: 20 minutos Nivel de Dificultad: Intermedio
• Objetivos
• Familiarizarse con los conceptos de números, operadores y expresiones
aritméticas en Python.
• Comprender la precedencia y asociatividad de los operadores de Python,
así como el correcto uso de los paréntesis
• Escenario
• La tarea es completar el código para poder evaluar la siguiente expresión:
50
Laboratorio 10 – Comprender la precedencia y asociatividad
• Escenario
• El resultado debe de ser asignado a y. Se cauteloso, observa los operadores y
priorízalos. Utiliza cuantos paréntesis sean necesarios.
• Puedes utilizar variables adicionales para acortar la expresión (sin embargo, no es
muy necesario). Prueba tu código cuidadosamente.
CODIGO EN PANTALLA:
x = float(input("Ingresa el valor para x: "))
print("y =", y)
51
Laboratorio 11 – Mejorar la habilidad de implementar números,
operadores y operaciones
• Tiempo Estimado: 15-20 minutos Nivel de Dificultad: Facil
• Objetivos
• Mejorar la habilidad de implementar números, operadores y operaciones
aritméticas en Python.
• Utilizar la función print() y sus capacidades de formato.
• Aprender a expresar fenómenos del día a día en términos de un lenguaje de programación.
• Escenario
• La tarea es preparar un código simple para evaluar o encontrar el tiempo final de un periodo
de tiempo dado, expresándolo en horas y minutos. Las horas van de 0 a 23 y los minutos de 0
a 59. El resultado debe ser mostrado en la consola.
• Por ejemplo, si el evento comienza a las 12:17 y dura 59 minutos, terminará a las 13:16.
52
Laboratorio 11 – Mejorar la habilidad de implementar números,
operadores y operaciones
• Escenario
• No te preocupes si tu código no es perfecto, está bien si acepta una hora invalida, lo
más importante es que el código produzca una salida correcta acorde a la entrada
dada.
• Prueba el código cuidadosamente. Pista: utilizar el operador % puede ser clave para
el éxito.
CODIGO EN PANTALLA:
hour = int(input("Hora de inicio (horas): "))
mins = int(input("Minuto de inicio (minutos): "))
dura = int(input("Duración del evento (minutos): "))
# Escribe tu código aqui.
53