Fundamentos de Python


Fundamentos de Python

Python es un lenguaje de programación de alto nivel, interpretado y de propósito general. Es conocido por su filosofía de diseño que enfatiza la legibilidad del código con su notable uso de espacios en blanco significativos.

Instalación y Configuración

Windows

  1. Descarga el instalador desde python.org
  2. Ejecuta el instalador y marca la opción “Add Python to PATH”
  3. Verifica la instalación abriendo una terminal y escribiendo:
    python --version

macOS

  1. Instala Homebrew si no lo tienes:
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  2. Instala Python con Homebrew:
    brew install python
  3. Verifica la instalación con:
    python3 --version

Linux

En la mayoría de distribuciones Linux, Python ya viene preinstalado. Puedes verificar con:

python3 --version

Si no está instalado:

sudo apt update
sudo apt install python3 python3-pip

Sintaxis Básica

Variables y Tipos de Datos

Python es un lenguaje de tipado dinámico, lo que significa que no necesitas declarar el tipo de una variable:

# Enteros
edad = 25

# Flotantes
altura = 1.75

# Strings (cadenas de texto)
nombre = "Ana"
apellido = 'García'  # Puedes usar comillas simples o dobles

# Booleanos
es_estudiante = True
es_mayor_de_edad = False

# Listas (arrays mutables)
colores = ["rojo", "verde", "azul"]

# Tuplas (arrays inmutables)
coordenadas = (10, 20)

# Diccionarios (pares clave-valor)
persona = {"nombre": "Juan", "edad": 30, "ciudad": "Santiago"}

# Sets (conjuntos sin elementos duplicados)
numeros_unicos = {1, 2, 3, 4, 5}

Operadores

Aritméticos

suma = 5 + 3       # 8
resta = 5 - 3      # 2
multiplicacion = 5 * 3  # 15
division = 5 / 3   # 1.6666...
division_entera = 5 // 3  # 1
modulo = 5 % 3     # 2
potencia = 5 ** 3  # 125

Comparación

igual = 5 == 3     # False
diferente = 5 != 3  # True
mayor = 5 > 3      # True
menor = 5 < 3      # False
mayor_igual = 5 >= 3  # True
menor_igual = 5 <= 3  # False

Lógicos

and_logico = True and False  # False
or_logico = True or False   # True
not_logico = not True      # False

Estructuras de Control

Condicionales

edad = 18

if edad < 18:
    print("Menor de edad")
elif edad == 18:
    print("Justo en el límite")
else:
    print("Mayor de edad")

Bucles

For

# Iterando sobre una lista
frutas = ["manzana", "banana", "cereza"]
for fruta in frutas:
    print(fruta)

# Iterando con range
for i in range(5):  # 0, 1, 2, 3, 4
    print(i)

# Iterando con enumerate
for indice, fruta in enumerate(frutas):
    print(f"Índice {indice}: {fruta}")

While

contador = 0
while contador < 5:
    print(contador)
    contador += 1

Funciones

# Definición básica
def saludar(nombre):
    return f"Hola, {nombre}!"

# Llamada a la función
mensaje = saludar("María")
print(mensaje)  # Hola, María!

# Función con parámetros por defecto
def saludar_formal(nombre, titulo="Sr./Sra."):
    return f"Saludos, {titulo} {nombre}"

print(saludar_formal("Pérez"))  # Saludos, Sr./Sra. Pérez
print(saludar_formal("García", "Dr."))  # Saludos, Dr. García

# Función con número variable de argumentos
def sumar(*numeros):
    resultado = 0
    for num in numeros:
        resultado += num
    return resultado

print(sumar(1, 2, 3, 4, 5))  # 15

Estructuras de Datos

Listas

# Crear una lista
numeros = [1, 2, 3, 4, 5]

# Acceder a elementos
primer_numero = numeros[0]  # 1
ultimo_numero = numeros[-1]  # 5

# Slicing (rebanado)
primeros_tres = numeros[0:3]  # [1, 2, 3]
desde_el_segundo = numeros[1:]  # [2, 3, 4, 5]
hasta_el_cuarto = numeros[:4]  # [1, 2, 3, 4]

# Modificar elementos
numeros[0] = 10
print(numeros)  # [10, 2, 3, 4, 5]

# Añadir elementos
numeros.append(6)  # [10, 2, 3, 4, 5, 6]
numeros.insert(1, 15)  # [10, 15, 2, 3, 4, 5, 6]

# Eliminar elementos
numeros.remove(3)  # Elimina el valor 3
eliminado = numeros.pop(2)  # Elimina y devuelve el elemento en el índice 2

# Longitud
longitud = len(numeros)

Diccionarios

# Crear un diccionario
estudiante = {
    "nombre": "Carlos",
    "edad": 22,
    "carrera": "Ingeniería",
    "promedio": 6.7
}

# Acceder a valores
nombre = estudiante["nombre"]  # Carlos
edad = estudiante.get("edad")  # 22

# Modificar valores
estudiante["promedio"] = 6.8

# Añadir nuevos pares clave-valor
estudiante["semestre"] = 6

# Eliminar pares
del estudiante["edad"]
carrera = estudiante.pop("carrera")

# Verificar si una clave existe
if "nombre" in estudiante:
    print("El nombre está definido")

# Iterar sobre un diccionario
for clave in estudiante:
    print(f"{clave}: {estudiante[clave]}")

# Iterar sobre pares clave-valor
for clave, valor in estudiante.items():
    print(f"{clave}: {valor}")

Manejo de Excepciones

try:
    numero = int(input("Ingresa un número: "))
    resultado = 10 / numero
    print(f"El resultado es: {resultado}")
except ValueError:
    print("Error: Debes ingresar un número válido")
except ZeroDivisionError:
    print("Error: No puedes dividir por cero")
except Exception as e:
    print(f"Ocurrió un error inesperado: {e}")
finally:
    print("Este bloque siempre se ejecuta, haya error o no")

Importación de Módulos

# Importar un módulo completo
import math
raiz_cuadrada = math.sqrt(25)  # 5.0

# Importar funciones específicas
from datetime import datetime, timedelta
ahora = datetime.now()
manana = ahora + timedelta(days=1)

# Importar con alias
import numpy as np
matriz = np.array([1, 2, 3, 4, 5])

# Importar todo (no recomendado generalmente)
from math import *
seno = sin(3.14/2)  # Aproximadamente 1

Programación Orientada a Objetos

class Persona:
    # Constructor
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad
        self._privado = "Este atributo es privado por convención"
    
    # Método
    def saludar(self):
        return f"Hola, me llamo {self.nombre} y tengo {self.edad} años"
    
    # Método estático
    @staticmethod
    def es_adulto(edad):
        return edad >= 18
    
    # Property (getter)
    @property
    def nombre_completo(self):
        return f"{self.nombre} Apellido"
    
    # Setter
    @nombre_completo.setter
    def nombre_completo(self, valor):
        self.nombre = valor.split()[0]

# Crear instancia
juan = Persona("Juan", 25)
print(juan.saludar())

# Herencia
class Estudiante(Persona):
    def __init__(self, nombre, edad, carrera):
        super().__init__(nombre, edad)
        self.carrera = carrera
    
    # Sobrescribir método
    def saludar(self):
        return f"{super().saludar()}. Estudio {self.carrera}"

maria = Estudiante("María", 22, "Informática")
print(maria.saludar())

Gestión de Archivos

# Escribir en un archivo
with open("ejemplo.txt", "w") as archivo:
    archivo.write("Esta es la primera línea\n")
    archivo.write("Esta es la segunda línea\n")

# Leer de un archivo
with open("ejemplo.txt", "r") as archivo:
    contenido = archivo.read()
    print(contenido)

# Leer línea por línea
with open("ejemplo.txt", "r") as archivo:
    for linea in archivo:
        print(linea.strip())  # strip() elimina espacios en blanco y saltos de línea

# Añadir a un archivo existente
with open("ejemplo.txt", "a") as archivo:
    archivo.write("Esta línea se añade al final\n")

Recursos Adicionales