Fundamentos de la programación con Python
Fundamentos de la programación con Python

Fundamentos de la programación con Python

Updated
May 7, 2024 03:36 PM
Category
Programing
Status
Open

Introducción a la programación

🍒
La programación es el proceso de crear un conjunto de instrucciones que le indican a una computadora qué hacer. Estas instrucciones se desarrollan para resolver un problema, realizar tareas de manera automatizada, desarrollo de software e incluso diseño de videojuegos!
Cada programa puede entenderse como un sistema de entradas y salidas donde cada acción genera una reacción correspondiente. Este proceso se puede dividir en tres partes esenciales:
  • Entradas (Inputs): Las entradas son los datos o información que se proporciona al programa para que realice alguna acción. Estas entradas pueden provenir de diversas fuentes, como el usuario que interactúa con una interfaz de usuario, un formulario online, o el mensaje enviado durante un chat. Las entradas son esenciales para que un programa realice tareas específicas.
  • Proceso (Process): El proceso representa a las operaciones que el programa realiza en función de las entradas proporcionadas. Estas acciones son comúnmente representadas como pantallas de carga donde el proceso en el fondo involucra el núcleo de nuestro programa. Estos pueden involucrar cálculos matemáticos, manipulación de datos o toma de decisiones. Estos procesos son lo que hacen que un programa sea útil y funcional.
  • Resultado (Output): El resultado es la información o acción que el programa genera como salida después de procesar las entradas. Los resultados pueden presentarse al usuario en una interfaz, guardarse en un archivo o utilizarse como entrada para acciones posteriores. Los resultados permiten que el usuario obtenga un valor de las acciones realizadas por el programa.
Un ejemplo en el contexto de los videojuegos puede ser representado como la interacción entre el jugador y el personaje.
  • La entrada es representada mediante la pulsación de un botón donde nuestro programa procesara esta pulsación y enviarla la acción correspondiente.
    • 🍒
      TODO: Insertar animación

Hello World!

"Hola, mundo" Un sencillo ejemplo de cómo podemos representar el principio de entrada, proceso y salida.
  • Entrada: En este programa, la entrada podría ser cualquier cadena de caracteres que deseemos mostrar en la salida.
    • notion image
       
  • Proceso: La acción principal de este programa es imprimir el texto "Hello, world!" en la pantalla.
    • notion image
       
  • Resultado (Salida): El resultado o salida de este programa es el texto "Hello, world!" que se muestra en la pantalla del computador.
    • notion image

Variables

Las variables son como contenedores en los que puedes almacenar diferentes tipos de datos, como números, texto y otros valores.
notion image

Declaración de variables

Para crear una variable en Python, simplemente elige un nombre descriptivo y asigna un valor utilizando el operador de asignación =.
nombre = "Juan"
edad = 25
saldo_bancario = 1000.50

Nombres de variables

Los nombres de las variables en Python deben seguir algunas reglas:
  • Las variables deben comenzar con una letra (a-z, A-Z) o un guion bajo (_).
    • notion image
      🍒
      Asignar un nombre a una variable en la que el primer carácter sea un número o un carácter especial resultará en un error de compilación.

Nombres Simbólicos

Gracias a las variables, podemos asignar nombres representativos a nuestros valores de entrada y utilizar esos nombres a lo largo de la ejecución de nuestro programa.
notion image

Secuencia de ejecución

En Python, el código se ejecuta secuencialmente, de arriba a abajo y línea por línea. Esto implica que debemos asignar un valor a una variable antes de poder utilizarla posteriormente en el código.
notion image
print(saludo) ## NameError: name 'saludo' is not defined
saludo = "Hola Mundo"
🍒
Intentar acceder a una variable cuando aun ha sido declarada nos dará como resultado un ”is not defined” error.

Reasignación de variables

Teniendo en cuenta la secuencia de ejecución, en Python puedes cambiar el valor almacenado en una variable simplemente reasignando a el nombre de la variable un nuevo valor en líneas posteriores.
notion image
En ese caso la función print() operara con el ultimo valor asignado: (30).

Tipos de datos

Los tipos de datos son esenciales para la programación. Casi todos, si no la gran mayoría, de los lenguajes de programación comparten una serie de datos esenciales que nos ayudarán a interpretar nuestras ideas de la mejor manera posible.

Cadenas de Texto (Strings)

Las cadenas de texto, también conocidas como Strings, son utilizadas para representar secuencias de caracteres, como palabras, frases o texto en general.
notion image
Las comillas no se mostraran como parte de la salida.
🍒
Eliminar las comillas dará a entender que no deseas utilizar una cadena de texto, lo que significa que el intérprete de Python tomará el texto como otra variable.

Números Enteros (Integers)

Los números enteros se utilizan para representar valores numéricos completos, tales como 1, -5 o 1000, sin incluir decimales ni fracciones.
notion image
En Python, las representaciones numéricas no requiere especificar comillas; el intérprete asume automáticamente que los números enteros son del tipo int.
🍒
La representación de números grandes usando comas después de cada tres dígitos no mostrará el número de manera correcta. Se requiere que uses solo dígitos numéricos en los números enteros y evites las comas como separadores.

Números Decimales (Floats)

Los números decimales, o números de punto flotante, se emplean para representar valores numéricos que incluyen decimales, como 3.14, -0.5 o 2.0.
notion image
En Python, las representaciones numéricas no requiere especificar comillas; el intérprete asume automáticamente que los números separados por un punto son del tipo float.
🍒
La representación decimal debe llevarse a cabo utilizando el punto. El uso de la coma hará que el número no se muestre ni se interprete de manera correcta.

Valores Lógicos (Booleanos)

Los valores booleanos pueden ser utilizados para realizar representaciones lógicas o para representar el estado de una aplicación. Estos valores se definen como 'verdadero' (true) o 'falso' (false).
notion image
🍒
Python interpreta las palabras (True) y (False) como valores lógicos. Debido a que estas palabras están reservadas, estos no se pueden utilizar como nombres de variables.

Operadores

Un operador es un símbolo que se utiliza para realizar operaciones entre distintos tipos de datos.

Operadores aritméticos

Estos operadores se utilizan para realizar operaciones matemáticas básicas, como la suma (+), resta (-), multiplicación (*) y división (/). Junto a operaciones mas complejas como el módulo (%), la division entera (//) y la potencia (**).

Operaciones Numéricas

Las operaciones numéricas son operaciones que solo se pueden realizar entre datos de tipo numérico, realizar la suma entre un numero y un string dará como resultado un error.
Suma (+):
La suma entre dos números:
Suma directamente sobre la función print():
print(5 + 3) # 8
🍒
La función print() mostrara el resultado de sumar 5 + 3 directamente en pantalla.
 
Suma con variables a y b:
a = 5
b = 3
print(a + b) # 8
🍒
La función print() mostrara directamente el resultado de sumar el valor contenido en las variables a y b.
 
Pasar una variable resultado a print():
a = 5
b = 3

resultado = a + b

print(resultado) # 8
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero 8 es calculado y almacenado, print() lo mostrara en pantalla.
 
Resta (-):
La resta entre dos números:
Resta directamente sobre la función print():
print(5 - 3) # 2
🍒
La función print() mostrara el resultado de restar 5 - 3 directamente en pantalla.
 
Resta negativa -:
print(3 - 5) # -2
🍒
Si el numero que carga el signo - (5) es mayor que el otro (3) el resultado sera negativo (-2). Esto puede ocasionar problemas si buscas hallar la diferencia entre dos variables.
 
Resta con variables a y b:
a = 5
b = 3
print(a - b) # 2
a = 5
b = 3
print(b - a) # -2
a = 5
b = 3
print(a - a) # 0
🍒
La función print() mostrara directamente el resultado de restar los valores contenidos en las variables a y b.
 
Pasar una variable resultado a print():
a = 5
b = 3

resultado = a - b

print(resultado) # 2
a = 5
b = 3

resultado = b - a

print(resultado) # -2
a = 5
b = 3

resultado = a - a

print(resultado) # 0
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero es calculado y almacenado, print() lo mostrara en pantalla.
 
Multiplicación(*):
La multiplicación entre dos números:
Multiplicación directamente sobre la función print():
print(5 * 3) # 15
🍒
La función print() mostrara el resultado de multiplicar 5 * 3 directamente en pantalla.
 
Multiplicación negativa:
print(5 * -3) # -15
🍒
La multiplicacion entre un numero positivo y uno negativo dara como resultado un numero negativo.
 
Multiplicación con variables a y b:
a = 5
b = 3
print(a * b) # 15
a = 5
b = -3
print(a * b) # -15
a = 5
b = 3
print(a * -b) # -15
🍒
La función print() mostrara directamente el resultado de multiplicar los valores contenidos en las variables a y b.
 
Pasar una variable resultado a print():
a = 5
b = 3

resultado = a * b

print(resultado) # 15
a = 5
b = -3

resultado = a * b

print(resultado) # -15
a = 5
b = 3

resultado = a * -b

print(resultado) # -15
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero es calculado y almacenado, print() lo mostrara en pantalla.
 
Division(/):
La division entre dos números:
Division directamente sobre la función print():
print(15 / 3) # 5.0
🍒
La función print() mostrara el resultado de dividir 15 / 3 directamente en pantalla.
 
Division por 0:
El cociente de una division consiste en hallar un numero que multiplicado el divisor nos entregue como resultado el dividendo.
print(15 / 0) # ZeroDivisionError: division by zero
🍒
Si todo numero multiplicado por 0 nos entrega como resultado 0; se nos hace imposible encontrar un cociente que nos de como resultado el numero 15. Python nos entregara el Error: ZeroDivisionError: division by zero.
 
Division con variables a y b:
a = 15
b = 3
print(a / b) # 5.0
a = 7
b = 3
print(a / b) # 2.3333333333333335
a = 15
b = 0
print(b / a) # 0
🍒
La función print() mostrara directamente el resultado de dividir los valores contenidos en las variables a y b.
 
Pasar una variable resultado a print():
a = 15
b = 3

resultado = a / b

print(resultado) # 5.0
a = 15
b = 3

resultado = a / a

print(resultado) # 1.0
a = 7
b = 3

resultado = b / a

print(resultado) # 0.42857142857142855
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero es calculado y almacenado, print() lo mostrara en pantalla.
 
Modulo(%):
Se utiliza para encontrar el residuo de la división.
Modulo directamente sobre la función print():
print(3 % 15) # 3
🍒
La función print() mostrara el residuo de dividir 3 / 15 directamente en pantalla.
 
 
Modulo por 0:
print(15 % 0) # ZeroDivisionError: division by zero
🍒
El módulo realiza una división para extraer el residuo. Por tanto, intentar extraer el residuo de una división por 0, retornara el Error: ZeroDivisionError: division by zero.
 
Modulo con variables a y b:
a = 15
b = 3
print(a % b) # 0
a = 7
b = 3
print(a % b) # 1
a = 15
b = 0
print(b / a) # 0.0
🍒
La función print() mostrara directamente el residuo de dividir los valores contenidos en las variables a y b.
 
Pasar una variable resultado a print():
a = 15
b = 3

resultado = a % b

print(resultado) # 0
a = 15
b = 3

resultado = a % a

print(resultado) # 0
a = 7
b = 3

resultado = b % a

print(resultado) # 3
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero es calculado y almacenado, print() lo mostrara en pantalla.
 
Division Entera(//):
Realiza una division entera donde se omite completamente la parte decimal sin realizar ningún redondeo.
Division Entera directamente sobre la función print():
print(15 // 2) # 7
🍒
La función print() mostrara el resultado entero de dividir 15 // 2 directamente en pantalla.
 
Division Entera por 0:
print(15 // 0) # ZeroDivisionError: division by zero
🍒
En la división entera se aplican las mismas reglas que en la división regular. Por lo tanto, la división por 0, retornara el Error: ZeroDivisionError: division by zero.
 
Division Entera con variables a y b:
a = 15
b = 3
print(a // b) # 15
a = 7
b = 3
print(a // b) # 2
a = 15
b = 0
print(a // b) # ZeroDivisionError: division by zero
🍒
La función print() mostrara directamente la division entera los valores contenidos en las variables a y b.
 
Pasar una variable resultado a print():
a = 15
b = 3

resultado = a // b

print(resultado) # 5
a = 15
b = 3

resultado = a // a

print(resultado) # 1
a = 15
b = 3

resultado = b // a

print(resultado) # 0
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero es calculado y almacenado, print() lo mostrara en pantalla.
 
Potencia(**):
Potencia directamente sobre la función print():
print(5 ** 3) # 125
🍒
La función print() mostrara el resultado de restar 5 * 3 directamente en pantalla.
 
Potencia negativa:
Potencia con variables a y b:
a = 5
b = 3
print(a ** b) # 125
a = 5
b = -3
print(a ** b) # 0.008
a = 5
b = 3
print(-a ** b) # # -125
🍒
La función print() mostrara directamente el resultado de elevar el valor a a el valor b.
 
Pasar una variable resultado a print():
a = 5
b = 3

resultado = a ** b

print(resultado) # 125
a = 5
b = -3

resultado = a ** b

print(resultado) # 0.008
a = 5
b = 3

resultado = -a ** b

print(resultado) # -125
🍒
La variable resultado almacena el resultado ya operado entre a y b. Una vez el numero es calculado y almacenado, print() lo mostrara en pantalla.
 

Cadenas de Caracteres

Concatenación(+):
Dado que el texto se interpreta como una cadena de caracteres, la concatenación es la union de dos o mas cadenas, donde caracteres como el espacio también hacen parte de la cadena.
Concatenación de strings + strings
nombre = "David"
oracion = "Mi nombre es " + nombre
🍒
Sumar el string "Mi nombre es " con el contenido de la variable nombre ("David"), nos dará como resultado el string "Mi nombre es David".
 
Concatenación de strings + Integers
edad = 28
oracion = "Tengo " + edad + " años de edad"
🍒
Sumar el string "Tengo " con el contenido de la variable edad (28), nos dará como resultado un Error: TypeError: can only concatenate str (not "int") to str.
Puedes solucionar este Error usando la función str() para convertir el valor de edad en un dato de tipo string.
edad = 28
oracion = "Tengo " + str(edad) + " años de edad"
🍒
Convertir edad a un string con str() nos permite concadenar "28" a la oracion, dandonos como resultado string: "Tengo 28 años de edad".
 

Proceso de Asignación

En los ejemplos anteriores hacemos uso de las operaciones directamente dentro de la función print(). Sin embargo, ¿cómo podemos asignar el resultado de una operación a una variable?
El proceso de asignación de una operación a una variable y su posterior visualización puede dividirse en tres pasos fundamentales:
  • Evaluación:
    • Durante la evaluación, Python analiza el tipo de operación que se está realizando y calcula el resultado correspondiente.
  • Asignación:
    • El resultado obtenido durante la evaluación se asigna finalmente a la variable correspondiente.
  • Visualización:
    • Para mostrar el resultado en la pantalla, se utiliza la función print() junto con la variable asignada.
notion image

Entrada del usuario

La capacidad de permitir que un usuario ingrese datos en nuestro programa es fundamental para asignar valores a nuestras variables y trabajar en función de ellas.

Entrada (Input)

En Python, la forma más básica de entrada de datos es mediante la función input(). Esta función representa de manera excelente el esquema de entrada, proceso y salida en un programa.

Entrada

Input es una función que toma como entrada un string. Esta entrada se mostrara en pantalla de igual manera que la función print()

Proceso

  • Cuando se llama a input(), el programa se detiene y espera a que el usuario ingrese una línea de texto.
  • El usuario ingresa una línea de texto y presiona la tecla "Enter".
  • La función input() lee la línea de texto ingresada y la devuelve como una cadena de caracteres.

Salida

  • Puedes asignar el valor devuelto por input() a una variable para almacenar y utilizar la entrada del usuario en tu programa.
  • Una vez asignado el valor a una variable podemos hacer uso de print() para mostrarla en pantalla.
 
Ejemplo
  • Escribimos la función input() con el mensaje de entrada: “Por favor, ingresa tu nombre: ”.
  • Esto imprimirá el mensaje en pantalla, seguido de un espacio donde el usuario podrá escribir su nombre y luego presionar "Enter" para enviarlo.
  • Al enviar el mensaje este es almacenado en la variable resultado.
  • Finalmente Utilizamos la función print() para mostrar el contenido de la variable resultado en pantalla, lo que nos permitirá visualizar el nombre John.
    • notion image
 

Calculadora Básica

Ahora que hemos comprendido los conceptos fundamentales relacionados con las variables y las entradas de usuario, procedamos a crear una calculadora básica que sume dos números proporcionados por el usuario.
numero_a = input("Por favor, ingrese el primer número: ")
numero_b = input("Por favor, ingrese el segundo número: ")

print(numero_a + numero_b)
Este programa solicita al usuario ingresar dos números y utiliza la función input para capturarlos. Durante la ejecución, en el primer paso, se pide al usuario que ingrese el primer número y, una vez almacenado en la variable numero_a, el programa procede a solicitar el segundo número para luego asignarlo a la variable numero_b. Una vez que ambos números están almacenados en sus respectivas variables, la función print mostrará la suma de estos en la pantalla.
Supongamos que nuestras entradas consisten en los números 1 y 1; nuestra salida esperada sería el número "2". Sin embargo, hay un problema fundamental en nuestro código cuando lo ejecutamos.
# Salida
'11'
La razón por la cual nuestra salida muestra el número 11 es porque la función input toma lo que ingresamos como texto y lo almacena como una cadena de caracteres string. Si utilizamos el operador de suma + en dos cadenas de texto, estas se concatenarán, lo que resulta en que nuestros dos números se unan en un solo texto.

Coerción de Tipos

La coerción de tipos, en resumen, se refiere a la capacidad de un lenguaje de programación para cambiar un tipo de dato a otro.

Entero (int)

La función int() se utiliza para convertir un valor en un número entero integer. Puede aceptar varios tipos de valores y producir un entero como resultado.

Entrada

La función int() puede aceptar varios tipos de datos como entrada, pero en este caso, utilizaremos números en formato de cadena (string) como entrada.

Proceso

La función int() toma el valor de entrada y tratara de convertirlo en un valor entero.

Salida

  • Si el string no representa un valor numérico válido, la función int() generará un error.
  • Si el string representa un valor numérico válido, por ejemplo, "2023", la función int() nos devolverá el valor convertido en forma de número entero.
 
Ejemplo
  • Escribimos la función int() con el string de entrada: “2023”.
  • Esto convertirá el valor de string a un integer lo que nos permitirá realizar operaciones aritméticas con un valor que inicialmente solo representaba texto.
  • El numero es almacenado en la variable resultado.
  • Finalmente Utilizamos la función print() para mostrar la suma entre resultado y el numero 1, lo que nos permite visualizar el numero 2024.
    • notion image
 

Calculadora Básica Corregida

Ahora que tenemos una forma de convertir los datos de tipo string que nos proporciona la función input en datos numéricos mediante la función int, podemos incorporar esta funcionalidad en nuestro programa.
numero_a = input("Por favor, ingrese el primer número: ")
numero_b = input("Por favor, ingrese el segundo número: ")

print(numero_a + numero_b)
Al analizar nuestro código inicial, se destacan dos aspectos importantes:
  • Después de que el usuario ha ingresado los datos, obtenemos dos variables, numero_a y numero_b, que contienen datos de tipo string.
 
  • Es crucial asegurarnos de que numero_a y numero_b sean de tipo numérico antes de realizar la operación.
 
Solución 1
Podemos hacer uso de la reasignación de variables para reestablecer el valor de numero_a y numero_b como valores de tipo entero.
numero_a = input("Por favor, ingrese el primer número: ")
numero_b = input("Por favor, ingrese el segundo número: ")

numero_a = int(numero_a)
numero_b = int(numero_b)

print(numero_a + numero_b)
 
 
Solución 2
Una solución mas directa involucra dar a input como entrada a int.
numero_a = int(input("Por favor, ingrese el primer número: "))
numero_b = int(input("Por favor, ingrese el segundo número: "))

print(numero_a + numero_b)
 

Control de Flujo

Se refiere a la capacidad de un programa para tomar decisiones y permite que un programa "fluya" por diferentes caminos o ramas de ejecución según ciertas condiciones o reglas predefinidas.

Declaraciones Condicionales

Las declaraciones condicionales nos permiten determinar el flujo de ejecución de nuestro programa, dividiéndolo en ramificaciones según nuestras decisiones.
Estas decisiones se basan en condiciones lógicas, que son afirmaciones que pueden ser verdaderas o falsas.

Declaración "if"

La declaración if se puede entender como la expresión si en español. Es un condicional que permite que el código continúe su ejecución si se cumple una condición específica.
if condición:
    # Bloque de código que se ejecuta si la condición es verdadera
Ejemplo:
edad = 20

if edad >= 18:
    print("Eres mayor de edad.")
  • Iniciamos declarando una variable llamada edad con un valor de 20.
  • Luego, utilizamos la declaración if seguida de una condición.
  • La condición verifica si la variable edad es mayor o igual a 18 usando el operador >=.
  • Si la condición es Verdadera, el programa imprimirá en pantalla el mensaje Eres mayor de edad.
  • Caso contrario, si la condición es Falsa, Python omitirá esa línea y la ejecución continuará sin mostrar ningún mensaje en pantalla.
 
Análisis:
Al analizar el código, podemos identificar varios puntos clave:
  • Condición:
    • Nuestra condición implica la comparación de dos valores numéricos, 20 y 18, utilizando el operador de comparación >=.
      Dado que la edad es un número mayor o igual a 18, esta condición se evaluará como un valor booleano True.
  • Sintaxis:
    • Para comunicar claramente a Python que deseamos iniciar un bloque de código, es fundamental prestar atención a otros dos puntos clave para asegurar una ejecución sin errores:
    • Para indicar el inicio de una rama o bloque de código, Python interpreta el uso de los dos puntos : como el inicio de una ramificación.
    • Después de que el bloque es declarado con los 2 puntos, debemos hacer uso de la indentación para escribir el código de esta ramificación. Escribir código sin esta indotación dará a entender a python que ese código hace parte de la rama principal o el flujo principal del programa.
  • Operadores de comparación:
    • A diferencia de los operadores aritméticos, los operadores de comparación buscan comparar dos valores de cualquier tipo y devolver un valor booleano, ya sea True o False.
      Lista de los operadores de comparación
      • Igualdad (==)
      • Desigualdad (!=)
      • Mayor que (>)
      • Menor que (<)
      • Mayor o igual que (>=)
      • Menor o igual que (<=)
       
  • Activación del condicional (if):
    • Es importante notar que todo lo que if realmente necesita para ejecutar un bloque de código, es un valor booleano True.
      Escribir directamente True como condición es completamente válido y hará que ese bloque de cogido siempre se ejecute.
      if True:
        print("Ese codigo siempre se ejecuta!")
       

Declaración "else"

La declaración else se puede entender como la expresión si no. Este condicional nos permite la ejecución de una ramificación “Por defecto”. Si la condición if no resulta ser verdadera el código pasara a ejecutar el código else sin verificar ningún tipo de condición siendo este el código por defecto que se ejecutara si nuestra condición anterior resulta no ser verdadera
if condición:
    # Código 
else:
	  # Código
Ejemplo:
edad = 17

if edad >= 18:
	print("Eres mayor de edad.")
else:
	print("Eres menor de edad.")
 
  • La condición verifica si la variable edad es mayor o igual a 18 usando el operador >=.
  • Si la condición es Verdadera, el programa imprimirá en pantalla el mensaje Eres mayor de edad.
  • Caso contrario, si la condición es Falsa, Python dará la ejecución a la declaración else y el programa imprimirá el mensaje Eres menor de edad.

Declaración "elif"

La declaración elif se puede entender como la expresión si no si, Este condicional nos permite añadir condiciones extra a nuestro arbol lógico. en el ejemplo anterior interpretamos a todos los números sobre 18 como mayores de edad y a todos los demás números fuera de ese rango como menores de edad.
Ejemplo:
edad = 18

if edad > 18:
	print("Eres mayor de edad.")
elif edad == 18:
	print("Tu edad es exactamente 18 años.")
else:
	print("Eres menor de edad.")
  • Ahora la condición verifica únicamente si la variable edad es mayor a 18 usando el operador >.
  • Si la condición es Verdadera, el programa imprimirá en pantalla el mensaje Eres mayor de edad.
  • Caso contrario, si la condición es Falsa, Python dará la ejecución a la declaración elif y la condición ahora verificara si la variable edad es igual a 18 usando el operador ==.
  • Si la condición es Verdadera, el programa imprimirá en pantalla el mensaje Tu edad es exactamente 18 años
  • Caso contrario, si la condición es Falsa, Python dará la ejecución a la declaración else y el programa imprimirá el mensaje Eres menor de edad.
 

Operadores lógicos

Los operadores lógicos se utilizan para combinar expresiones lógicas y evaluarlas.
Al continuar con nuestro código anterior, podemos identificar un problema en los rangos de edad.
Según nuestro programa, ser mayor de edad involucra un rango de números mayores a 18, usuarios pueden ingresar números enormes siendo estos interpretados por el programa como mayores de edad. El problema se agrava aún más, ya que un usuario puede ingresar números negativos, y la lógica consideraría cualquier número menor de 18 como menor de edad.
Es en este punto donde los operadores lógicos pueden ayudarnos a establecer un rango más realista.
edad = 0

if edad > 18 and edad < 200:
    print("Eres mayor de edad.")
elif edad == 18:
		("Tu edad es exactamente 18 años.")
elif edad > 0 and edad < 18:
		("Eres menor de edad.")
else:
		("La edad ingresada no es valida.")
	
 
Análisis:
En esta version modificada del código añadimos el operador lógico and cuya contraparte en el español puede igualarse a y.
  • En la primera declaración de nuestro código, podemos apreciar dos condiciones unidas por el operador and. Este operador se encarga de asegurarse de que ambas condiciones sean evaluadas como verdaderas. Si una de las dos condiciones resulta ser falsa, el operador retornará el valor booleano False, omitiendo la ejecución de nuestra declaración.
    • Esta declaración ahora maneja un rango entre los 19 y los 199, lo cual es mucho más realista.
  • La segunda declaración se mantiene igual, verificando si el usuario ingreso exactamente el valor 18.
  • Modificamos la declaración else par convertirla en un elif, ahora maneja un rango entre los 1 y los 17 para determinar si la edad corresponde a un menor de edad.
  • Finalmente, recuperamos la declaración else para manejar todas las edades fuera de nuestro rango, utilizando else imprimiendo el mensaje correspondiente.

Calculadora con Selección Múltiple

Ahora que tenemos la capacidad de tomar decisiones dentro de nuestro programa, incorporémoslo en nuestra calculadora.
print("Suma: 1, Resta: 2, Multiplicacion: 3, Division: 4, Potencia: 5")
operacion = input("Selecciona la operacion que deseas realizar: ")

numero_a = int(input("Por favor, ingrese el primer número: "))
numero_b = int(input("Por favor, ingrese el segundo número: "))

if operacion == "1":
  resultado = numero_a + numero_b

elif operacion == "2":
  resultado = numero_a - numero_b

elif operacion == "3":
  resultado = numero_a * numero_b

elif operacion == "4":
  resultado = numero_a / numero_b

elif operacion == "5":
  resultado = numero_a ** numero_b

else:
  resultado = "El tipo de operacion seleccionado no es valido"

print(resultado)
Análisis:
  • Comenzamos proporcionando al usuario una lista de operaciones Suma: 1, Resta: 2, Multiplicación: 3, División: 4, Potencia: 5
  • Ahora utilizamos la función input para solicitar al usuario que elija una operación y almacenamos su respuesta en la variable operacion.
  • Solicitamos al usuario que ingrese dos números, el resultado de cada input es entregado a la función int para convertirlos en un números que puedan ser operados en cálculos.
  • A continuación, comparamos el valor almacenado en operacion con los números asignados a cada operación. Si el valor coincide con uno de los números (por ejemplo, "1" ), realizaremos la suma entre numero_a y numero_b asignando el resultado a la variable resultado.
  • Si operacion no coincide con ninguna de las opciones, Python dará la ejecución a la declaración else y el programa asignara el texto "El tipo de operacion seleccionado no es valido” a la variable resultado.
  • Finalmente nuestra calculadora imprimirá en pantalla el contenido de resultado.

Grupos de Datos

Las entradas de los programas no se limitan usualmente a solo un dato. A la hora de procesar información, esta información se nos puede entregar grupos de datos.

Listas

Las listas son secuencias de elementos que pueden ser de diferentes tipos. Se definen utilizando corchetes []:
lista = [1, 2.0, "Hola", True, False]
Cada elemento de una lista tiene un numero que lo identifica, este numero es el índice del elemento. Estos indices comienzan a partir del 0 y aumentan en una unidad por cada elemento en la lista.
notion image

Acceder a los elementos de una lista

Para obtener un elemento específico, utiliza el índice correspondiente dentro de corchetes [].
lista = [1, 2.0, "Hola", True, False]

print(lista[2]) # Hola!
🍒
Asegúrate de separar cada elemento de la lista con una coma.

Diccionarios

Los diccionarios son colecciones de pares "llave" : valor que permiten asociar valores con sus respectivas etiquetas. Se definen utilizando llaves {}:
persona = {
	"nombre": "Juan",
	"edad": 30,
	"ciudad": "Barrrancabermeja"
}
🍒
Es importante notar que cada par "llave" : valor, al igual que las listas, debe estar separado por comas.

Acceder a los elementos de un diccionario

Para obtener un elemento específico, puedes utilizar el nombre de la etiqueta correspondiente dentro de corchetes [].
persona = {
	"nombre": "Juan",
	"edad": 30,
	"ciudad": "Barrrancabermeja"
}

print(persona["edad"]) # 30
🍒
Las llaves de los diccionarios deben escribirse con comillas dobles " o comillas simples ', de forma similar a los strings. Los valores que corresponden a cada llave pueden ser de cualquier tipo de dato, incluyendo otras listas o diccionarios.
Ejemplos:
Los diccionarios son herramientas excepcionales para definir estructuras de datos en un formato que resulta comprensible tanto para las personas como para lenguajes de programación.
producto = {
    "nombre": "Smartphone",
    "precio": 499.99,
    "disponible": True
}
En este ejemplo, se muestra una descripción de un producto escrita en un formato diccionario. Cada clave del producto tiene un valor correspondiente: por ejemplo, podemos observar que la clave 'nombre' contiene un valor de tipo string, la clave 'precio' un valor de tipo número float, y la clave 'disponible' un valor de tipo boolean.
 
estudiante = {
    "nombre": "Ana",
    "edad": 20,
    "identificacion": "A12345",
    "cursos": ["Matemáticas", "Historia", "Inglés"],
    "calificaciones": {"Matemáticas": 90, "Historia": 85, "Inglés": 95}
}
En este diccionario ahora podemos ver una estructura de datos mas compleja. cada estudiante tiene una serie de cursos a los que asistir. Por lo tanto, es razonable asignar una lista como valor a la clave "cursos". De igual manera, el estudiante tiene un conjunto de calificaciones, pero estas calificaciones corresponden a materias específicas. Por tanto, la decisión de asignar un diccionario a la clave "calificaciones" tiene sentido dentro de este contexto, ya que nos permite asignar un valor a cada materia.
🍒
Al igual que las listas, cada par "llave" : valor, se pueden escribir en una sucesión: "calificaciones": {"Matemáticas": 90, "Historia"85"Inglés"95}

Automatización

La automatización se fundamenta en la capacidad de identificar tareas que se tornan repetitivas o rutinarias.

Ciclo for

El ciclo for se utiliza para recorrer una secuencia y ejecutar un bloque de código una vez por cada elemento en esa secuencia.
for elemento in secuencia:
    # Bloque de código que se ejecuta para cada elemento
Las secuencias involucran datos como listas, strings o diccionarios, y el elemento puede interpretarse como una variable que va cambiando su valor por cada dato en nuestra secuencia.
🍒
La sintaxis de un ciclo for puede interpretarse de la siguiente manera: Por cada elemento en mi secuencia: Realiza una acción.
Ejemplo:
numeros = [1, 2, 3, 4, 5]

for numero in numeros:
    print(numero)
  • Asignamos una lista de números a la variable numeros.
  • Iniciamos el ciclo utilizando la palabra reservada for y damos el nombre numero a la variable en la que se almacenará cada número.
  • A continuación de numero, utilizamos la palabra reservada in para indicar que numero es un elemento contenido en numeros.
  • Utilizamos los dos puntos : y en este caso, 4 espacios para iniciar un bloque de código. Este bloque de código se ejecutará por cada elemento en nuestra lista.
  • Finalmente, utilizamos print para mostrar numero por cada elemento.
🍒
numero es el nombre asignado a cada elemento en nuestra lista numeros. Es importante notar que durante un bucle, el elemento se nombra en singular, mientras que la variable que almacena nuestra secuencia se nombra en plural.
 
Siguiendo la sintaxis de for podemos leer este ciclo como:
por_cada numero en mi_lista_de_numeros:
		imprime(el_numero_actual)
 
 
# Lista de compras
lista_de_compras = ["manzanas", "bananas", "leche", "pan", "yogur", "huevos"]

# Artículo que estamos buscando
articulo_a_buscar = "pan"

# Bucle para buscar el artículo en la lista
for elemento in lista_de_compras:
    if elemento == articulo_a_buscar:
        print(f"Encontraste el {articulo_a_buscar} en la lista.")
        break  # Detén la búsqueda si encontraste el artículo
    else:
        print(f"No es el {articulo_a_buscar}, continuemos buscando.")
        continue  # Continúa buscando otros elementos en la lista

print("Fin de la búsqueda.")

Bucle while

El bucle while se utiliza para ejecutar un bloque de código repetidamente mientras una condición sea verdadera. La estructura básica de un bucle en Python es la siguiente:
while condicion:
    # Bloque de código que se ejecuta mientras la condición sea verdadera
El bloque de código dentro del bucle while se ejecuta repetidamente mientras la condicion sea True. Si la condición se vuelve False, el bucle se detiene y la ejecución continúa después del bucle.
Ejemplo:
contador = 0
while contador < 5:
    print(contador)
    contador += 1
Este bucle while imprimirá los números del 0 al 4.

Manejo de errores

El manejo de errores es crucial en cualquier programa para mantener su flujo y evitar interrupciones inesperadas. En Python, los errores se manejan mediante excepciones, permitiendo que el código responda de manera adecuada a situaciones imprevistas.

¿Por qué manejar errores?

El manejo de errores es esencial para mantener la integridad y la ejecución de una aplicación.
  1. Evitar la interrupción del programa: Los errores no controlados pueden detener por completo la ejecución de un programa, lo que resulta en una experiencia frustrante.
  1. Prevenir comportamientos inesperados: Al manejar los errores de manera adecuada, podemos controlar cómo reacciona el programa ante situaciones inesperadas.
  1. Proporcionar retroalimentación al usuario: Al manejar errores, podemos informar al usuario sobre lo que salió mal y cómo pueden corregirlo, mejorando la experiencia del usuario.

El bloque try-except

El bloque try-except es una estructura fundamental en Python que se utiliza para gestionar errores durante la ejecución de un programa.
try:
    # Código que puede generar un error
    # ...
except ExceptionType as error:
    # Código para manejar el error
 
  • Dentro del bloque try, colocamos el código que puede potencialmente generar un error. Esto puede ser cualquier operación que podría causar un problema, como la división entre cero o el acceso a un índice fuera de rango en una lista.
  • Si ocurre algún error durante la ejecución del código dentro del bloque try, en lugar de que el programa se detenga, Python salta inmediatamente al bloque except. Aquí es donde podemos manejar el error de manera controlada.
En la sección except, especificamos el tipo de error que queremos manejar.
Por ejemplo, podríamos tener un bloque except como este:
 try:
		result = 8 / 0
except ZeroDivisionError as error:
	  print("Error: Division by zero is not allowed.")
	  print("Error details:", error)
Aquí, error contendrá información específica sobre la excepción ZeroDivisionError.
 
Tipos de errores mas comunes.
Funciones
Función
Excepción
Descripción
int()
ValueError
Se levanta cuando la conversión falla, por ejemplo, al pasar un string con caracteres no numéricos.
float()
ValueError
Se levanta cuando la conversión falla, por ejemplo, al pasar un string con caracteres no numéricos.
str()
TypeError
Se levanta cuando se intenta convertir un objeto no convertible a cadena. Generalmente no lanza excepciones, ya que la mayoría de los objetos pueden ser convertidos a string.
list()
TypeError
Se levanta cuando se intenta convertir un objeto no iterable a lista. Al igual que srt(), no suele lanzar excepciones, ya que puede crear una lista a partir de cualquier iterable.
dict()
ValueError
Se levanta cuando se proporcionan cantidades desiguales de claves y valores.
print()
OSError TypeError
OSError: Puede ocurrir si hay un problema al escribir en la salida estándar. TypeError: Se levanta cuando se pasa un argumento que no pueda ser convertido a string. Al igual que srt(), no suele lanzar excepciones, ya que print depende de que el objeto pueda ser transformado a string, proceso que print realiza automáticamente.
input()
KeyboardInterrupt
Se levanta si el usuario interrumpe la ejecución con Ctrl+C mientras la función input() espera la entrada.
 
  • Cuando no conocemos el tipo exacto de excepción que podría ocurrir o si queremos manejar cualquier tipo de excepción de manera general, podemos utilizar Exception como ExceptionType. Esto capturará cualquier tipo de excepción y la almacenará en la variable error:
    • try:
          # Código que puede generar un error
          # ...
      except Exception as error:
          # Código para manejar el error general
       
  • Por otro lado, si prefieres no mostrar mensajes técnicos durante la ejecución de la aplicación, puedes optar por ignorar completamente el tipo de excepción y simplemente manejar cualquier error de manera general:
    • try:
          # Código que puede generar un error
          # ...
      except:
          # Código para manejar el error
       
Ejemplos
El siguiente código tiene como objetivo convertir un valor ingresado por un usuario a un valor de tipo entero:
try:
    numero = int(input("Ingrese un número entero: "))
    print("El número ingresado es:", numero)
except Exception as error:
    print("Error:", error)
    print("Por favor, ingrese un número entero válido.")
Análisis:
  • Dentro del bloque try, se solicita al usuario que ingrese un número entero utilizando la función input(), y se intenta convertir esta entrada a un entero utilizando la función int().
  • Si el usuario ingresa un valor que no puede ser convertido a un entero, se genera una excepción. En este caso, se captura la excepción utilizando el bloque except:
  • Dentro del bloque except, se captura la excepción Exception y se almacena en la variable error. Luego, se imprime un mensaje de error que indica al usuario que ha ocurrido un problema y se le pide que ingrese un número entero válido.
Se imprime el mensaje específico asociado con la excepción Exception, proporcionando información adicional sobre el tipo de error que ocurrió.
Error durante ejecución
Ingrese un número entero: Gato
Error: invalid literal for int() with base 10: 'Gato'
Por favor, ingrese un número entero válido.
  • Durante la ejecución se ingresa el string "Gato" como valor de entrada a la función int(). Levantando La excepción ValueError, y se muestra nuestro mensaje de error solicitando un numero valido.
Si deseamos simplificar el manejo de errores y no necesitamos almacenar información específica sobre la excepción, podemos eliminar la variable error y utilizar simplemente el bloque except sin especificar el tipo de excepción:
try:
    numero = int(input("Ingrese un número entero: "))
    print("El número ingresado es:", numero)
except:
    print("Por favor, ingrese un número entero válido.")
Error durante ejecución
Ingrese un número entero: Gato
Por favor, ingrese un número entero válido.
 
Es importante comprender que la función int() puede convertir diferentes tipos de strings en números enteros, dependiendo de la base numérica especificada.
Por ejemplo: En el sistema decimal, puede interpretar números como "123", mientras que en el sistema binario, puede interpretar "1011" como el número entero correspondiente. La capacidad de la función int() para interpretar diferentes tipos de strings se basa en el sistema numérico especificado.
  • Si el usuario ingresa un string que pueda ser procesado por int(), se almacenara el numero en la variable numero y se continuara con la ejecución del programa.
 

Modularización

Funciones

# Leer dos números enteros de dos dígitos y determinar a cuánto es igual la suma de todos los dígitos. 

def has_two_digits(number:int) -> bool:
    string_number = str(number)

    if len(string_number) == 2:
        return True
    else:
        return False

def sum_of_digits(number_a:int, number_b:int) -> str:
    string_number_a = str(number_a)
    string_number_b = str(number_b)

    if has_two_digits(number_a) and has_two_digits(number_b):
        digits = string_number_a + string_number_b

        total_sum = 0

        for digit in digits:
            total_sum += int(digit)

        return "La suma de todos los digitos es: " + str(total_sum)
    else:
        return "Los numeros ingresados no tienen 2 digitos"

print(sum_of_digits(99,99))