Fundamentos 1
Fundamentos 1
Fundamentos 1
Fundamentos de Python 1
Fundamentos de Python 1: Introducción a Python y a la Programación Informática
2. Módulo 2
Tipos de datos, variables, operaciones básicas de entrada-salida y operadores básicos;
3. Módulo 3
Valores booleanos, ejecución condicional, bucles, listas y procesamiento de listas,
operaciones lógicas y bit a bit;
4. Módulo 4
Funciones, tuplas, diccionarios, excepciones y procesamiento de datos.
Podemos decir que cada lenguaje (máquina o natural, no importa) consta de los siguientes
elementos:
Un alfabeto
Un léxico:
Una semántica:
Nota 1:
Nota 2:
VS
Observa las palabras que juegan un papel muy importante en cada programa de Python.
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else',
'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or',
'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
Son llamadas palabras clave o (mejor dicho) palabras clave reservadas. Son reservadas
porque no se deben utilizar como nombres: ni para variables, ni para funciones, ni para
cualquier otra cosa que se desee crear.
RESUMEN DE SECCIÓN
Una variable es una ubicación nombrada reservada para almacenar valores en la memoria. Una
variable es creada o inicializada automáticamente cuando se le asigna un valor por primera vez.
(2.1.4.1)
Cada variable debe de tener un nombre único - un identificador. Un nombre válido debe ser
aquel que no contiene espacios, debe comenzar con un guion bajo(_), o una letra, y no puede
ser una palabra reservada de Python. El primer carácter puede estar seguido de guiones bajos,
letras, y dígitos. Las variables en Python son sensibles a mayúsculas y minúsculas.
Python es un lenguaje de tipo dinámico, lo que significa que no se necesita declarar variables
en él. Para asignar valores a las variables, se utiliza simplemente el operador de asignación, es
decir el signo de igual (=), por ejemplo, var = 1.
var = 2
print(var)
var = 3
print(var)
var += 1
print(var)
RESUMEN DE SECCIÓN
Los operadores de comparación (o también denominados operadores relacionales) se utilizan
para comparar valores. La siguiente tabla ilustra cómo funcionan los operadores de
comparación, asumiendo que
x = 0, y = 1, y z = 0:
Operador Descripción
== Devuelve True si los valores de los operandos son iguales, y False de lo contrario.
!= Devuelve True si los valores de los operandos no son iguales, y False de lo contrario.
> Devuelve True si el valor del operando izquierdo es mayor que el valor del operando
derecho, y False de lo contrario.
< Devuelve True si el valor del operando izquierdo es menor que el valor del operando
derecho, y False de lo contrario.
>= Devuelve True si el valor del operando izquierdo es mayor o igual al valor del operando
derecho, y False de lo contrario.
<= Devuelve True si el valor del operando izquierdo es menor o igual al valor del operando
derecho, y False de lo contrario.
RESUMEN DE SECCIÓN
1. Existen dos tipos de bucles en Python: while y for:
El bucle while ejecuta una sentencia o un conjunto de sentencias siempre que una condición
booleana especificada sea verdadera, por ejemplo:
# Ejemplo 1
while True:
# Ejemplo 2
counter = 5
print(counter)
counter -= 1
El bucle for ejecuta un conjunto de sentencias muchas veces; se usa para iterar sobre una
secuencia (por ejemplo, una lista, un diccionario, una tupla o un conjunto; pronto aprenderás
sobre ellos) u otros objetos que son iterables (por ejemplo, cadenas). Puedes usar el bucle for
para iterar sobre una secuencia de números usando la función incorporada range. Mira los
ejemplos a continuación:
# Ejemplo 1
word = "Python"
print(letter, end="*")
# Ejemplo 2
if i % 2 == 0:
printprint(i)
2. Puedes usar las sentencias break y continue para cambiar el flujo de un bucle:
if letter == "P":
break
print(letter, end="")
Utiliza continue para omitir la iteración actual, y continuar con la siguiente iteración, por
ejemplo:
text = "pyxpyxpyx
if letter == "x":
continue
print(letter, end="")
3. Los bucles while y for también pueden tener una cláusula else en Python. La cláusula else se
ejecuta después de que el bucle finalice su ejecución siempre y cuando no haya terminado con
break, por ejemplo:
n=0
while n != 3:
print(n)
n += 1
else:
print(n, "else")
print()
print(i)
else:
print(i, "else")
4. La función range() genera una secuencia de números. Acepta enteros y devuelve objetos de
rango. La sintaxis de range() tiene el siguiente aspecto: range(start, stop, step), donde:
stop es un parámetro opcional que especifica el final de la secuencia generada (no está
incluido).
y step es un parámetro opcional que especifica la diferencia entre los números en la secuencia
es (1 por defecto.)
Código de ejemplo:
for i in range(3):
Una función no pertenece a ningún dato - obtiene datos, puede crear nuevos datos y
(generalmente) produce un resultado.
Un método hace todas estas cosas, pero también puede cambiar el estado de una entidad
seleccionada.
Un método es propiedad de los datos para los que trabaja, mientras que una función es
propiedad de todo el código.
Esto también significa que invocar un método requiere alguna especificación de los datos a
partir de los cuales se invoca el método.
result = function(arg)
result = data.method(arg)
Nota: el nombre del método está precedido por el nombre de los datos que posee el método.
A continuación, se agrega un punto, seguido del nombre del método y un par de paréntesis
que encierran los argumentos.
El método se comportará como una función, pero puede hacer algo más - puede cambiar el
estado interno de los datos a partir de los cuales se ha invocado.
RESUMEN DE SECCIÓN
1. La lista es un tipo de dato en Python que se utiliza para almacenar múltiples objetos. Es una
colección ordenada y mutable de elementos separados por comas entre corchetes, por
ejemplo:
print(my_list[-1]) # output: 0
my_list[1] = '?'
my_list.insert(0, "primero")
my_list.append("último")
print(my_list) # output: ['primero', 1, '?', True, 'Soy una cadena', 256, 0, 'último']
Aprenderás más sobre el anidamiento - por el momento, solo queremos que sepas que algo
como esto también es posible.
my_list = [1, 2, 3, 4]
del my_list[2]
print(color)
6. La función len() se puede usar para verificar la longitud de la lista, por ejemplo:
print(len(my_list)) # output 5
del my_list[2]
print(len(my_list)) # output 4
7. Una invocación típica de función tiene el siguiente aspecto: result = function(arg), mientras
que una invocación típica de un método se ve así: result = data.method(arg).
Ordenamiento Burbuja
Ahora que puedes hacer malabarismos con los elementos de las listas, es hora de aprender
como ordenarlos. Se han inventado muchos algoritmos de clasificación, que difieren mucho en
velocidad, así como en complejidad. Vamos a mostrar un algoritmo muy simple, fácil de
entender, pero desafortunadamente, tampoco es muy eficiente. Se usa muy raramente, y
ciertamente no para listas extensas.
En las siguientes secciones, ordenaremos la lista en orden ascendente, de modo que los
números se ordenen de menor a mayor.
10
Ahora observa el segundo y el tercer elemento. Están en las posiciones equivocadas. Tenemos
que intercambiarlos:
10
Vamos más allá y observemos los elementos tercero y cuarto. Una vez más, esto no es lo que
se supone que es. Tenemos que intercambiarlos:
10
4
Ahora comprobemos los elementos cuarto y quinto. Si, ellos también están en las posiciones
equivocadas. Ocurre otro intercambio:
10
El primer paso a través de la lista ya está terminado. Todavía estamos lejos de terminar nuestro
trabajo, pero algo curioso ha sucedido mientras tanto. El elemento más grande, 10, ya ha
llegado al final de la lista. Ten en cuenta que este es el lugar deseado para el. Todos los
elementos restantes forman un lío pintoresco, pero este ya está en su lugar.
Ahora, por un momento, intenta imaginar la lista de una manera ligeramente diferente - es
decir, de esta manera:
10
Observa - El 10 está en la parte superior. Podríamos decir que flotó desde el fondo hasta la
superficie, al igual que las burbujas en una copa de champán. El método de clasificación deriva
su nombre de la misma observación - se denomina ordenamiento burbuja.
Ahora comenzamos con el segundo paso a través de la lista. Miramos el primer y el segundo
elemento - es necesario un intercambio:
10
10
10
10
10
La lista ya está ordenada. No tenemos nada más que hacer. Esto es exactamente lo que
queremos.
Como puedes ver, la esencia de este algoritmo es simple: comparamos los elementos
adyacentes y, al intercambiar algunos de ellos, logramos nuestro objetivo.
Codifiquemos en Python todas las acciones realizadas durante un solo paso a través de la lista,
y luego consideraremos cuántos pases necesitamos para realizarlo. No hemos explicado esto
hasta ahora, pero lo haremos pronto.
while swapped:
print(my_list)
my_list = []
swapped = True
for i in range(num):
my_list.append(val)
while swapped:
swapped = False
swapped = True
print("\nOrdenada:")
print(my_list)
Python, sin embargo, tiene sus propios mecanismos de clasificación. Nadie necesita escribir sus
propias clases, ya que hay un número suficiente de herramientas listas-para-usar.
Te explicamos este sistema de clasificación porque es importante aprender como procesar los
contenidos de una lista y mostrarte como puede funcionar la clasificación real.
my_list.sort()
print(my_list)
RESUMEN DE SECCIÓN
1. Puedes usar el método sort() para ordenar los elementos de una lista, por ejemplo:
lst = [5, 3, 1, 2, 4]
print(lst)
lst.sort()
2.También hay un método de lista llamado reverse(), que puedes usar para invertir la lista, por
ejemplo:
lst = [5, 3, 1, 2, 4]
print(lst)
lst.reverse()
RESUMEN DE SECCIÓN
1. Si tienes una lista list_1, y la siguiente asignación: list_2 = list_1 esto no hace una copia de la
lista list_1, pero hace que las variables list_1 y list_2 apunten a la misma lista en la memoria.
Por ejemplo:
vehicles_one = ['coche', 'bicicleta', 'motor']
vehicles_two = vehicles_one
2. Si deseas copiar una lista o parte de la lista, puedes hacerlo haciendo uso de rebanadas:
3. También puede utilizar índices negativos para hacer uso de rebanadas. Por ejemplo:
new_list = sample_list[2:-1]
4. Los parámetros start y end son opcionales al partir en rebanadas una lista: list[start:end], por
ejemplo:
my_list = [1, 2, 3, 4, 5]
slice_one = my_list[2: ]
slice_three = my_list[-2: ]
my_list = [1, 2, 3, 4, 5]
del my_list[0:2]
del my_list[:]
6. Puedes probar si algunos elementos existen en una lista o no utilizando las palabras clave in
y not in, por ejemplo:
RESUMEN DE SECCIÓN
1. La comprensión de listas te permite crear nuevas listas a partir de las existentes de una
manera concisa y elegante. La sintaxis de una comprensión de lista es la siguiente:
if conditional:
expression
Este es un ejemplo de una comprensión de lista - el código siguiente crea una lista de cinco
elementos con los primeros cinco números naturales elevados a la potencia de 3:
funciones integradas las cuales son partes importantes de Python (como lo es la función
print()). Puedes ver una lista completa de las funciones integradas de Python en la siguiente
liga https://docs.python.org/3/library/functions.html.
también están las que se encuentran en módulos pre-instalados (se hablará acerca de ellas en
el curso Fundamentos de Python 2)
funciones definidas por el usuario las cuales son escritas por los programadores para los
programadores - puedes escribir tus propias funciones y utilizarlas libremente en tu código,
las funciones lambda (aprenderás acerca de ellas en el curso Fundamentos de Python 2.)
3. Las funciones propias se pueden definir utilizando la palabra reservada def y con la siguiente
sintaxis:
# el cuerpo de la función
Se puede definir una función sin que haga uso de argumentos, por ejemplo:
También es posible definir funciones con argumentos, como la siguiente que contiene un solo
parámetro:
RESUMEN DE SECCIÓN
1. Se puede pasar información a las funciones utilizando parámetros. Las funciones pueden
tener tantos parámetros como sean necesarios.
def hi(name):
print("Hola,", name)
hi("Greg")
print("Hola,", name_2)
print("Hola,", name_1)
hi_all("Sebastián", "Konrad")
s = input("Calle: ")
c = input("Ciudad: ")
address(s, c, p_c)
2. Puedes pasar argumentos a una función utilizando las siguientes técnicas:
paso de argumentos con palabras clave en la cual el orden de los argumentos es irrelevante
(Ejemplo 2)
Ejemplo 1
print(a - b)
subtra(5, 2) # salida: 3
subtra(2, 5) # salida: -3
Ejemplo 2
print(a - b)
Ex. 3
print(a - b)
subtra(5, 2) # salida: 3
Es importante recordar que primero se especifican los argumentos posicionales y después los
de palabras clave. Es por esa razón que si se intenta ejecutar el siguiente código:
def subtra(a, b):
print(a - b)
3. Se puede utilizar la técnica de argumentos con palabras clave para asignar valores
predefinidos a los argumentos:
print(first_name, last_name)
RESUMEN DE SECCIÓN
1. Puedes emplear la palabra clave reservada return para decirle a una función que devuelva
algún valor. La instrucción return termina la función, por ejemplo:
return a * b
return
def wishes():
w = wishes()
# Ejemplo 1
def wishes():
print("Mis deseos")
# Ejemplo 2
def wishes():
print("Mis deseos")
print(wishes())
# Felíz Cumpleaños
3. Puedes usar una lista como argumento de una función, por ejemplo:
def hi_everybody(my_list):
print("Hola,", name)
def create_list(n):
my_list = []
for i in range(n):
my_list.append(i)
return my_list
print(create_list(5))
RESUMEN DE SECCIÓN
1. Una variable que existe fuera de una función tiene alcance dentro del cuerpo de la función.
(Ejemplo 1) al menos que la función defina una variable con el mismo nombre. (Ejemplo 2, y
Ejemplo 3), por ejemplo:
Ejemplo 1:
var = 2
def mult_by_var(x):
return x * var
print(mult_by_var(7)) # salida: 14
Ejemplo 2:
def mult(x):
var = 5
return x * var
print(mult(7)) # salida: 35
Ejemplo 3:
def mult(x):
var = 7
return x * var
var = 3
print(mult(7)) # salida: 49
2. Una variable que existe dentro de una función tiene un alcance solo dentro del cuerpo de la
función (Ejemplo 4), por ejemplo:
Ejemplo 4:
def adding(x):
var = 7
return x + var
print(adding(4)) # salida: 11
print(var) # NameError
3. Se puede emplear la palabra clave reservada global seguida por el nombre de una variable
para que el alcance de la variable sea global, por ejemplo:
var = 2
print(var) # salida: 2
def return_var():
global var
var = 5
return var
print(return_var()) # salida: 5
print(var) # salida: 5
RESUMEN DE SECCIÓN
1. Una función puede invocar otras funciones o incluso a sí misma. Cuando una función se
invoca a si misma, se le conoce como recursividad, y la función que se invoca a si misma y
contiene una condición de terminación (la cual le dice a la función que ya no siga invocándose
a si misma) es llamada una función recursiva.
2. Se pueden emplear funciones recursivas en Python para crear funciones limpias, elegantes, y
dividir el código en trozos más pequeños. Sin embargo, se debe tener mucho cuidado ya que es
muy fácil cometer un error y crear una función la cual nunca termine. También se debe
considerar que las funciones recursivas consumen mucha memoria, y por lo tanto pueden ser
en ocasiones ineficientes.
Al emplear la recursividad, se deben de tomar en cuenta tanto sus ventajas como desventajas.
def factorial(n):
return 1
else:
return n * factorial(n - 1)
print(factorial(4)) # 4 * 3 * 2 * 1 = 24
RESUMEN DE SECCIÓN
Completo Puntos Clave: tuplasPuntos Clave: tuplas
1. Las Tuplas son colecciones de datos ordenadas e inmutables. Se puede pensar en ellas como
listas inmutables. Se definen con paréntesis:
my_tuple = (1, 2, True, "una cadena", (3, 4), [5, 6], None)
print(my_tuple)
my_list = [1, 2, True, "una cadena", (3, 4), [5, 6], None]
print(my_list)
Cada elemento de la tupla puede ser de un tipo de dato diferente (por ejemplo, enteros,
cadenas, boleanos, etc.). Las tuplas pueden contener otras tuplas o listas (y viceversa).
empty_tuple = ()
my_tuple_1 = 1,
5. Las tuplas son immutable, lo que significa que no se puede agregar, modificar, cambiar o
quitar elementos. El siguiente fragmento de código provocará una excepción:
my_tuple = 1, 2, 3,
del my_tuple
6. Puedes iterar a través de los elementos de una tupla con un bucle (Ejemplo 1), verificar si un
elemento o no esta presente en la tupla (Ejemplo 2), emplear la función len() para verificar
cuantos elementos existen en la tupla (Ejemplo 3), o incluso unir o multiplicar tuplas (Ejemplo
4):
# Ejemplo 1
tuple_1 = (1, 2, 3)
print(elem)
# Ejemplo 2
tuple_2 = (1, 2, 3, 4)
print(5 in tuple_2)
tuple_2 = (1, 2, 3, 4)
print(len(tuple_3))
# Ejemplo 4
tuple_5 = tuple_3 * 2
print(tuple_4)
print(tuple_5)
EXTRA
También se puede crear una tupla utilizando la función integrada de Python tuple(). Esto es
particularmente útil cuando se desea convertir un iterable (por ejemplo, una lista, rango,
cadena, etcétera) en una tupla:
print(my_tuple)
my_list = [2, 4, 6]
tup = tuple(my_list)
De la misma manera, cuando se desea convertir un iterable en una lista, se puede emplear la
función integrada de Python denominada list():
tup = 1, 2, 3,
my_list = list(tup)
my_dictionary = {
key1: value1,
key2: value2,
key3: value3,
pol_esp_dictionary = {
"kwiat": "flor",
"woda": "agua",
"gleba": "tierra"
3. Si se desea cambiar el valor asociado a una clave específica, se puede hacer haciendo
referencia a la clave del elemento, a continuación se muestra un ejemplo:
pol_esp_dictionary = {
"zamek": "castillo",
"woda": "agua",
"gleba": "tierra"
pol_esp_dictionary["zamek"] = "cerradura"
item = pol_esp_dictionary["zamek"]
del phonebook["Adán"]
print(phonebook) # salida: {}
pol_esp_dictionary.update({"gleba": "tierra"})
pol_esp_dictionary.popitem()
5. Se puede emplear el bucle for para iterar a través del diccionario, por ejemplo:
pol_esp_dictionary = {
"zamek": "castillo",
"woda": "agua",
"gleba": "tierra"
print(item)
# zamek
# woda
# gleba
6. Si deseas examinar los elementos (claves y valores) del diccionario, puedes emplear el
método items(), por ejemplo:
pol_esp_dictionary = {
"zamek": "castillo",
"woda": "agua",
"gleba": "tierra"
7. Para comprobar si una clave existe en un diccionario, se puede emplear la palabra clave
reservada in:
pol_esp_dictionary = {
"zamek": "castillo",
"woda": "agua",
"gleba": "tierra"
if "zamek" in pol_esp_dictionary:
print("Si")
else:
print("No")
pol_esp_dictionary = {
"zamek": "castillo",
"woda": "agua",
"gleba": "tierra"
print(len(pol_esp_dictionary)) # salida: 3
print(len(pol_esp_dictionary)) # salida: 2
print(len(pol_esp_dictionary)) # salida: 0
pol_esp_dictionary = {
"zamek": "castillo",
"woda": "agua",
"gleba": "tierra"
copy_dictionary = pol_esp_dictionary.copy()
ZeroDivisionError
Esta aparece cuando intentas forzar a Python a realizar cualquier operación que provoque una
división en la que el divisor es cero o no se puede distinguir de cero. Toma en cuenta que hay
más de un operador de Python que puede hacer que se genere esta excepción. ¿Puedes
adivinarlos todos?
ValueError
Espera esta excepción cuando estás manejando valores que pueden usarse de manera
inapropiada en algún contexto. En general, esta excepción se genera cuando una función
(como int() o float()) recibe un argumento de un tipo adecuado, pero su valor es inaceptable.
TypeError
Esta excepción aparece cuando intentas aplicar un dato cuyo tipo no se puede aceptar en el
contexto actual. Mira el ejemplo:
No está permitido usar un valor flotante como índice de una lista (la misma regla también se
aplica a las tuplas). TypeError es un nombre adecuado para describir el problema y una
excepción adecuada a generar.
AttributeError
Esta excepción llega - entre otras ocasiones - cuando intentas activar un método que no existe
en un elemento con el que se está tratando. Por ejemplo:
La tercera línea de nuestro ejemplo intenta hacer uso de un método que no está incluido en las
listas. Este es el lugar donde se genera la excepción AttributeError.
SyntaxError
Esta excepción se genera cuando el control llega a una línea de código que viola la gramática de
Python. Puede sonar extraño, pero algunos errores de este tipo no se pueden identificar sin
ejecutar primero el código. Este tipo de comportamiento es típico de los lenguajes
interpretados - el intérprete siempre trabaja con prisa y no tiene tiempo para escanear todo el
código fuente. Se conforma con comprobar el código que se está ejecutando en el momento.
Muy pronto se te presentará un ejemplo de esta categoría.
Es una mala idea manejar este tipo de excepciones en tus programas. Deberías producir código
sin errores de sintaxis, en lugar de enmascarar las fallas que has causado.
2. Intenta aislar el problema. Puedes extraer la parte de tu código que se sospecha que
es responsable de tus problemas y ejecutarla por separado. Puedes comentar partes
del código para ocultar el problema. Asigna valores concretos a las variables en lugar
de leerlos desde la consola. Prueba tus funciones aplicando valores de argumentos
predecibles. Analiza el código cuidadosamente. Léelo en voz alta.
4. Tómate un descanso, bebe una taza de café, toma a tu perro y sal a caminar, lee un
buen libro, incluso dos, haz una llamada telefónica a tu mejor amigo - te sorprenderás
de la frecuencia con la que esto ayuda.
RESUMEN DE SECCIÓN
1. En Python, existe una distinción entre dos tipos de errores:
errores de sintaxis (errores de análisis), que ocurren cuando el analizador encuentra una
sentencia de código que no es correcta. Por ejemplo:
File "main.py", line 1 print("Hola, ¡Mundo!) ^ SyntaxError: EOL while scanning string
literalOutput
print(1/0)
Traceback (most recent call last): File "main.py", line 1, in print(1/0) ZeroDivisionError:
division by zero
Presta atención a la última línea del mensaje de error - en realidad, te dice lo que sucedió.
Existen muchos diferentes tipos de excepciones, como ZeroDivisionError, NameError,
TypeError, y muchas mas; y esta parte del mensaje te informa qué tipo de excepción se ha
generado. Las líneas anteriores muestran el contexto en el que ha ocurrido la excepción.
while True: try: number = int(input("Ingresa un número entero: ")) print(number/2) break
except: print("Advertencia: el valor ingresado no es un número válido. Intenta de nuevo...")
El código anterior le pide al usuario que ingrese un valor hasta que el valor ingresado sea
un número entero válido. Si el usuario ingresa un valor que no se puede convertir a un int,
el programa imprimirá en la consola Advertencia: el valor ingresado no es un número
válido. Intenta de nuevo..., y pide al usuario que ingrese un número nuevamente. Veamos
que sucede en dicho caso?
El bloque try se ejecuta. El usuario ingresa un valor incorrecto, por ejemplo: ¡hola!.
Se genera una excepción, y el resto del código del bloque try se omite. El programa salta al
bloque except, lo ejecuta, y luego se sigue al código que se encuentra después del bloque
try-except.
while True: try: number = int(input("Ingresa un número entero: ")) print(5/number) break
except ValueError: print("Valor incorrecto.") except ZeroDivisionError: print("Lo siento. No
puedo dividir entre cero.") except: print("No se que hacer...")
Puedes utilizar varios bloques except dentro de una sentencia try, y especificar nombres de
excepciones. Si se ejecuta alguno de los except, los otros se omitirán. Recuerda: puedes
especificar una excepción integrada solo una vez. Además, no olvides que la excepción por
defecto (o genérica), es decir, a la que no se le especifica nombre, debe ser colocada al
final (utiliza las excepciones más específicas primero, y las más generales al último).
while True: try: number = int(input("Ingresa un número entero: ")) print(5/number) break
except (ValueError, ZeroDivisionError): print("Valor incorrecto o se ha roto la regla de
división entre cero.") except: print("Lo siento, algo salió mal...")
Para obtener más información sobre las excepciones integradas de Python, consulta la
documentación oficial de Python aquí.
5. Por último, pero no menos importante, debes recordar cómo probar y depurar tu
código. Utiliza técnicas de depuración como depuración de impresión; si es posible - pide a
alguien que lea tu código y te ayude a encontrar errores o mejorarlo; intenta aislar el
fragmento de código que es problemático y susceptible a errores: prueba tus funciones
aplicando valores de argumento predecibles, y trata de manejar las situaciones en las que
alguien ingresa valores incorrectos; comenta las partes del código que ocultan el problema.
Finalmente, toma descansos y vuelve a tu código después de un tiempo con un par de ojos
nuevos.