Introducción a la Programación
Tema 4: Fundamentos de Python · Funciones, listas y diccionarios
1. Funciones en Python
Una función es un bloque de código reutilizable que realiza una tarea específica. Se definen con la
palabra clave def:
def saludar(nombre): mensaje = 'Hola, ' + nombre + '!' return mensaje
print(saludar('Ana')) # → Hola, Ana!
1.1 Parámetros por defecto y *args
Los parámetros pueden tener valores por defecto, y se puede aceptar un número variable de
argumentos con *args y **kwargs:
def potencia(base, exponente=2): return base ** exponente potencia(3) # → 9
potencia(3, 3) # → 27
1.2 Funciones lambda
Las lambdas son funciones anónimas de una sola expresión, útiles como argumento de funciones
de orden superior:
cuadrado = lambda x: x ** 2 lista = [1, 2, 3, 4, 5] resultado =
list(map(cuadrado, lista)) # resultado = [1, 4, 9, 16, 25]
2. Listas
Una lista es una colección ordenada y mutable de elementos de cualquier tipo.
2.1 Operaciones básicas
frutas = ['manzana', 'naranja', 'kiwi'] [Link]('mango') # añadir al
final [Link](1, 'pera') # insertar en posición [Link]('kiwi')
# eliminar elemento del frutas[0] # eliminar por índice print(len(frutas)) #
longitud
2.2 List comprehensions
Forma compacta y pythónica de crear listas a partir de iterables:
# Cuadrados de números pares entre 0 y 20 pares_cuad = [x**2 for x in
range(21) if x % 2 == 0] # [0, 4, 16, 36, 64, 100, 144, 196, 256, 324, 400]
3. Diccionarios
Un diccionario almacena pares clave: valor. Las claves deben ser inmutables (strings, números,
tuplas).
alumno = { 'nombre': 'Carlos', 'edad': 21, 'notas': [8.5, 7.0, 9.2] } #
Acceso y modificación print(alumno['nombre']) # → Carlos alumno['edad'] = 22
alumno['carrera'] = 'Física' # nueva clave # Iteración for clave, valor in
[Link](): print(f'{clave}: {valor}')
4. Manejo de errores – try / except
Python usa excepciones para gestionar errores en tiempo de ejecución. El bloque try/except
permite capturarlas y reaccionar de forma controlada:
try: numero = int(input('Introduce un número: ')) resultado = 100 / numero
print(f'Resultado: {resultado}') except ValueError: print('Error: debes
introducir un número entero.') except ZeroDivisionError: print('Error: no se
puede dividir entre cero.') finally: print('Bloque finally: se ejecuta
siempre.')
5. Módulos y paquetes
Python organiza el código en módulos (archivos .py) y paquetes (directorios con __init__.py). Se
importan con import:
import math from random import randint, choice import os
print([Link](144)) # → 12.0 print(randint(1, 10)) # entero aleatorio
entre 1 y 10 print([Link]()) # directorio de trabajo actual
Funciones built-in más usadas
Función Descripción Ejemplo
len(x) Longitud de x len([1,2,3]) → 3
range(n) Secuencia 0..n-1 range(5) → 0,1,2,3,4
type(x) Tipo de x type(3.14) → float
sorted(x) Lista ordenada sorted([3,1,2]) → [1,2,3]
zip(a,b) Combina iterables zip([1,2],[a,b])
enumerate Índice + valor for i,v in enumerate(lst)
6. Programación Orientada a Objetos (POO)
La POO organiza el código en clases que encapsulan datos (atributos) y comportamiento
(métodos). Es el paradigma central de Python.
6.1 Clases e instancias
class Estudiante: # Atributo de clase universidad = 'UCM' def __init__(self,
nombre, edad): # Atributos de instancia [Link] = nombre [Link] =
edad [Link] = [] def agregar_nota(self, nota): [Link](nota)
def promedio(self): return sum([Link]) / len([Link]) if [Link]
else 0 def __str__(self): return f'{[Link]} ({[Link]} años)' # Uso e
= Estudiante('Marta', 20) e.agregar_nota(8.5) e.agregar_nota(9.0) print(e) #
→ Marta (20 años) print([Link]()) # → 8.75
6.2 Herencia
Una clase hija hereda atributos y métodos de la clase padre y puede sobreescribirlos:
class EstudianteDoctorado(Estudiante): def __init__(self, nombre, edad,
tesis): super().__init__(nombre, edad) # llama al padre [Link] = tesis
def __str__(self): return f'{super().__str__()} | Tesis: {[Link]}'
6.3 Métodos especiales (dunder methods)
Método Cuándo se llama
__init__ Al crear una instancia (constructor)
__str__ Al usar str() o print()
__repr__ Representación oficial del objeto
__len__ Al usar len()
__eq__ Al comparar con ==
__add__ Al usar el operador +
7. Ficheros y Persistencia de Datos
Python permite leer y escribir ficheros de texto y binarios con la función built-in open(). Siempre es
recomendable usar el gestor de contexto with para garantizar el cierre del fichero:
# Escritura with open('[Link]', 'w', encoding='utf-8') as f:
[Link]('Alumno: Ana\nNota: 9.5\n') # Lectura línea a línea with
open('[Link]', 'r', encoding='utf-8') as f: for linea in f:
print([Link]()) # Lectura completa en una lista with open('[Link]')
as f: lineas = [Link]() # → lista de strings
7.1 JSON: serialización de datos
El módulo json permite guardar y cargar estructuras de datos Python (dicts, listas):
import json datos = {'nombre': 'Luis', 'notas': [7, 8.5, 9]} # Guardar with
open('[Link]', 'w') as f: [Link](datos, f, indent=4) # Cargar with
open('[Link]') as f: cargado = [Link](f) print(cargado['nombre']) #
→ Luis
8. Decoradores
Un decorador es una función que envuelve a otra función añadiéndole funcionalidad sin modificar
su código. Se aplican con la sintaxis @nombre_decorador:
import time def medir_tiempo(func): def wrapper(*args, **kwargs): inicio =
[Link]() resultado = func(*args, **kwargs) fin = [Link]()
print(f'{func.__name__} tardó {fin-inicio:.4f}s') return resultado return
wrapper @medir_tiempo def calcular_suma(n): return sum(range(n))
calcular_suma(1_000_000) # → calcular_suma tardó 0.0234s
Consejo de estudio: Practica escribiendo una clase completa por tema (Persona, Producto,
CuentaBancaria…). Añade __str__, __eq__ y al menos un método de negocio. Luego guarda
objetos en JSON y recupéralos. Es la mejor forma de afianzar POO y ficheros a la vez.