Funciones#

Python es un lenguaje indentado, no usa corchetes para delimitar el alcance de las estructuras de programación sino que se fija en los cambios de indentación.

No se declara el tipo de los argumentos de las funciones. La semática de la implementación ha de estar preparada para funcionar con los tipos de datos que quieres.

Las funciones son bloques de código reutilizables que realizan una tarea específica. En Python, las funciones se definen utilizando la palabra clave def, seguida del nombre de la función y los paréntesis que pueden contener parámetros.

# Definir funciones
def saludar(nombre):
    return f"Hola, {nombre}!"
print(saludar("Ana"))
Hola, Ana!
def suma(a, b):
    return a + b
print(suma(3, 5))
8
# Definir funciones
def funcion_1(a,b):
    r = a**2
    return r+b
def greatest(a,b):
    if a>b:
        return a
    else:
        return b
# Llamados de funciones
funcion_1 (10.4,2)
110.16000000000001
greatest(10,2)
10

Podemos definir valores por defecto para los argumentos de las funciones y llamarlas usando explícitamente el nombre de los argumentos. Además, las funciones pueden devolver varios valores.

# Valores por defecto
def saludar(nombre="Mundo"):
    return f"Hola, {nombre}!"
print(saludar())
print(saludar("Carlos"))
Hola, Mundo!
Hola, Carlos!
def f_power(x, p=2):
    return x**p
f_power(x=3)
9
f_power(p=4, x=3)
81
def f_power(x, p=2):
    return x**p, x*p
r = f_power(p=4, x=3)
print(r[0],r[1],"\n")
81 12 
r1, r2 = f_power(p=4, x=3)
print(r1)
print(r2,"\n")
81
12 
def f_power(x, p=2):
    return x**p

def f_powers(x, p1=2, p2=3):
    return x**p1, x**p2
f_power(4)
16
f_power(4,3)
64
f_powers(4, p1=3)
(64, 64)
xp1, xp2 = f_powers(4, p2=4, p1=3)
print("power1",xp1, "power2", xp2)
power1 64 power2 256

Paso por valor y referencia#

Dependiendo del tipo de dato que enviemos a la función, podemos diferenciar dos comportamientos:

Paso por valor: Se crea una copia local de la variable dentro de la función.

Paso por referencia: Se maneja directamente la variable, los cambios realizados dentro de la función le afectarán también fuera.

Tradicionalmente:

Los tipos simples se pasan por valor: Enteros, flotantes, cadenas, lógicos…

Los tipos compuestos se pasan por referencia: Listas, diccionarios, conjuntos…

Ejemplo de paso por valor

Como ya sabemos los números se pasan por valor y crean una copia dentro de la función, por eso no les afecta externamente lo que hagamos con ellos:

def doblar_valor(x):
    x = 2*x
    return x
x=10
doblar_valor(x)
print(x,doblar_valor(x))
10 20

Para modificar los tipos simples podemos devolverlos modificados y reasignarlos:

x = 10
x = doblar_valor(x)
print(x)
20

Ejemplo de paso por referencia

Sin embargo las listas u otras colecciones, al ser tipos compuestos se pasan por referencia, y si las modificamos dentro de la función estaremos modificándolas también fuera:

def doblar_valores(y):
    for i,n in enumerate(y):
        y[i] = 2*y[i]
y=[1,2,3]
doblar_valores(y)
print(y)
[2, 4, 6]

Ejemplo: Sistema de Gestión de Tareas#

Crea un programa para gestionar tareas en una institución pública. Debe permitir agregar tareas con su descripción y estado (pendiente, en progreso, completada), actualizar el estado de una tarea específica y mostrar un resumen de todas las tareas.

  1. Definir una lista de tareas.

  2. Crear funciones para agregar una tarea, actualizar el estado de una tarea y mostrar un resumen de todas las tareas.

  3. Asegurarse de que las tareas se pasen por referencia para que los cambios se reflejen fuera de las funciones.

def agregar_tarea(tareas, descripcion, estado="pendiente"):
    tarea = {"descripcion": descripcion, "estado": estado}
    tareas.append(tarea)

def actualizar_estado(tareas, descripcion, nuevo_estado):
    for tarea in tareas:
        if tarea["descripcion"] == descripcion:
            tarea["estado"] = nuevo_estado

def mostrar_resumen(tareas):
    for tarea in tareas:
        print(f"Descripción: {tarea['descripcion']}, Estado: {tarea['estado']}")
# Lista de tareas
tareas = []

# Agregar tareas
agregar_tarea(tareas, "Revisión de documentos")
agregar_tarea(tareas, "Reparación de equipo", "en progreso")
agregar_tarea(tareas, "Solicitud de información", "completada")
# Actualizar estado de una tarea
actualizar_estado(tareas, "Revisión de documentos", "completada")
# Mostrar resumen de tareas
mostrar_resumen(tareas)
Descripción: Revisión de documentos, Estado: completada
Descripción: Reparación de equipo, Estado: en progreso
Descripción: Solicitud de información, Estado: completada

Ejemplo: Registro de Asistencia#

Crea un programa que registre la asistencia de empleados en una institución pública. El programa debe permitir agregar registros de asistencia diaria (nombre del empleado, fecha, asistencia: True/False). Luego, debe calcular el porcentaje de asistencia de cada empleado y mostrar un resumen.

  1. Crear una lista de registros de asistencia.

  2. Crear funciones para agregar un registro de asistencia, calcular el porcentaje de asistencia y mostrar un resumen de la asistencia de todos los empleados.

def agregar_asistencia(asistencias, nombre, fecha, presente):
    registro = {"nombre": nombre, "fecha": fecha, "asistencia": presente}
    asistencias.append(registro)

def calcular_porcentaje_asistencia(asistencias, nombre):
    total_dias = 0
    dias_asistidos = 0
    for registro in asistencias:
        if registro["nombre"] == nombre:
            total_dias += 1
            if registro["asistencia"]:
                dias_asistidos += 1
    if total_dias == 0:
        return 0
    return (dias_asistidos / total_dias) * 100
def mostrar_resumen_asistencia(asistencias):
    empleados = {}
    for registro in asistencias:
        nombre = registro["nombre"]
        if nombre not in empleados:
            empleados[nombre] = {"asistencias": 0, "total": 0}
        empleados[nombre]["total"] += 1
        if registro["asistencia"]:
            empleados[nombre]["asistencias"] += 1

    for nombre, datos in empleados.items():
        porcentaje_asistencia = (datos["asistencias"] / datos["total"]) * 100
        print(f"{nombre}: {porcentaje_asistencia:.2f}% de asistencia")
# Lista de registros de asistencia
asistencias = []

# Agregar registros de asistencia
agregar_asistencia(asistencias, "Juan", "2023-06-01", True)
agregar_asistencia(asistencias, "Ana", "2023-06-01", True)
agregar_asistencia(asistencias, "Carlos", "2023-06-01", False)
agregar_asistencia(asistencias, "Juan", "2023-06-02", False)
agregar_asistencia(asistencias, "Ana", "2023-06-02", True)
# Calcular porcentaje de asistencia de un empleado específico
porcentaje_juan = calcular_porcentaje_asistencia(asistencias, "Juan")
print(f"Juan: {porcentaje_juan:.2f}% de asistencia")
Juan: 50.00% de asistencia
# Mostrar resumen de asistencia de todos los empleados
mostrar_resumen_asistencia(asistencias)
Juan: 50.00% de asistencia
Ana: 100.00% de asistencia
Carlos: 0.00% de asistencia

Reto 1: Sistema de Gestión de Proyectos#

Crea un programa para gestionar proyectos en una institución pública. El programa debe permitir agregar proyectos con su nombre, descripción, fecha de inicio y fecha de finalización. Además, debe permitir actualizar el estado de un proyecto (planificado, en curso, completado), y mostrar un resumen de todos los proyectos.

  1. Definir una lista de proyectos.

  2. Crear funciones para agregar un proyecto, actualizar el estado de un proyecto, y mostrar un resumen de todos los proyectos.

  3. Asegurarse de que los proyectos se pasen por referencia para que los cambios se reflejen fuera de las funciones.

# Tu código va acá

Reto 2: Sistema de Registro de Vehículos#

Crea un programa que registre los vehículos de una institución pública. El programa debe permitir agregar vehículos con su número de placa, marca, modelo, año y estado (activo, en mantenimiento, dado de baja). Además, debe permitir actualizar el estado de un vehículo específico y mostrar un resumen de todos los vehículos.

  1. Crear una lista de vehículos.

  2. Crear funciones para agregar un vehículo, actualizar el estado de un vehículo y mostrar un resumen de todos los vehículos.

  3. Asegurarse de que los vehículos se pasen por referencia para que los cambios se reflejen fuera de las funciones.