Repaso while

# =============================================================================
# FUNCIONES CON VALIDACIÓN Y LISTAS EN PYTHON
# =============================================================================
# En este programa vamos a ver cómo crear una función que:
#   1. Pide un dato al usuario
#   2. Comprueba que el dato sea correcto (validación)
#   3. Devuelve el dato para usarlo desde fuera
#
# Después veremos TRES formas distintas de usar esa función:
#   - Imprimir el resultado directamente
#   - Guardarlo en una variable
#   - Añadirlo a una lista
#
# Y por último, un ejemplo real: recoger las notas de un grupo de alumnos.
# =============================================================================


# =============================================================================
# DEFINICIÓN DE LA FUNCIÓN pedir_nota()
# =============================================================================
# Una función es un bloque de código con nombre que podemos reutilizar
# tantas veces como queramos sin tener que reescribirlo.
#
# Esta función:
#   - No recibe ningún parámetro (los paréntesis están vacíos)
#   - Se encarga de pedir una nota válida al usuario
#   - Devuelve la nota una vez validada
# =============================================================================

def pedir_nota():
    # "def" le dice a Python que vamos a definir una función.
    # "pedir_nota" es el nombre que le damos (debe ser descriptivo).
    # Los "():" al final son obligatorios aunque no haya parámetros.
    # Todo lo que esté indentado (con sangría) pertenece a la función.

    print("Introduce una nota entre 1 y 10")
    # Mensaje informativo para que el usuario sepa qué se espera de él.

    nota = int(input("Introduce la nota (1 y 10): "))
    # input() pide texto al usuario. int() lo convierte a número entero.
    # Si el usuario escribe "7", sin int() tendríamos la cadena "7", no el número.
    # PRUEBA: quita el int() y verás que la comparación nota < 1 da error.

    while nota < 1 or nota > 10:
        # Bucle de validación: se repite MIENTRAS la nota sea incorrecta.
        # "or" significa que basta con que UNA de las dos condiciones sea True
        # para que el bucle continúe.
        # Ejemplos de notas incorrectas: 0, -5, 11, 100
        # ALTERNATIVA equivalente: while not (1 <= nota <= 10):

        print("Nota incorrecta, mendrugo")
        # Mensaje de error. En un programa real usaríamos algo más amable,
        # como: print("Nota incorrecta. Debe estar entre 1 y 10.")

        nota = int(input("Introduce la nota (1 y 10): "))
        # Volvemos a pedir la nota para que el usuario pueda corregirla.
        # Esto SOBREESCRIBE el valor anterior de "nota".
        # En la siguiente vuelta del while, se comprobará este nuevo valor.

    return nota
    # "return" devuelve el valor de "nota" al lugar donde se llamó la función.
    # Solo llegamos aquí cuando la nota ES válida (el while ha terminado).
    # Sin "return", la función haría todo el proceso pero no nos daría el resultado.
    # Sería como una máquina expendedora que acepta el dinero pero no da el producto.


# =============================================================================
# CASOS DE USO: TRES FORMAS DE USAR LA FUNCIÓN
# =============================================================================
# Una función puede usarse de varias maneras según lo que necesitemos hacer
# con el valor que devuelve. Aquí vemos las tres más habituales.
# =============================================================================

# --- CASO 1: Imprimir el resultado directamente ---
print(pedir_nota())
# Python ejecuta pedir_nota(), obtiene la nota válida y la pasa a print().
# El valor devuelto por la función se usa al momento y no se guarda en ningún sitio.
# Útil cuando solo queremos mostrar el resultado una vez.

# --- CASO 2: Guardar el resultado en una variable ---
nota_alumno = pedir_nota()
# El valor que devuelve pedir_nota() se guarda en la variable "nota_alumno".
# A partir de aquí podemos usar "nota_alumno" tantas veces como queramos.
# VENTAJA respecto al caso 1: podemos usar el valor varias veces sin pedir
# la nota de nuevo. Por ejemplo: print(nota_alumno), calcular media, etc.

# --- CASO 3: Añadir el resultado a una lista ---
lista_notas = []
# Creamos una lista vacía con []. Aquí iremos acumulando notas.

lista_notas.append(nota_alumno)
# .append() añade un elemento AL FINAL de la lista.
# Aquí añadimos la nota que ya teníamos guardada en la variable del caso 2.
# lista_notas pasa de [] a [nota_alumno], por ejemplo: [7]

lista_notas.append(pedir_nota())
# Llamamos a pedir_nota() y el valor que devuelve se añade directamente a la lista.
# Es lo mismo que hacer:
#   nueva_nota = pedir_nota()
#   lista_notas.append(nueva_nota)
# pero en una sola línea.

print(lista_notas)
# Imprime la lista completa con los dos valores acumulados.
# Ejemplo de salida: [7, 9]


# =============================================================================
# EJEMPLO REAL: RECOGER LAS NOTAS DE UN GRUPO DE ALUMNOS
# =============================================================================
# Ahora combinamos todo lo anterior con un bucle for para recorrer
# una lista de nombres y pedir la nota de cada alumno.
# Este es el patrón más habitual en programas reales.
# =============================================================================

alumnos = ["Monica", "Ermengol", "Jordi", "Marisol"]
# Lista con los nombres de los alumnos del grupo.
# ALTERNATIVA: pedir los nombres por teclado con un bucle while.

notas = []
# Lista vacía donde iremos guardando las notas según las vayamos pidiendo.
# Es importante crearla ANTES del bucle para no borrarla en cada vuelta.

for alumno in alumnos:
    # El bucle recorre la lista "alumnos" de principio a fin.
    # En cada vuelta, "alumno" toma el valor del siguiente nombre:
    #   Vuelta 1: alumno = "Monica"
    #   Vuelta 2: alumno = "Ermengol"
    #   Vuelta 3: alumno = "Jordi"
    #   Vuelta 4: alumno = "Marisol"

    print("Dime la nota del alumno", alumno)
    # Informamos de qué alumno estamos introduciendo.
    # Ejemplo de salida: "Dime la nota del alumno Monica"
    # ALTERNATIVA con f-string: print(f"Dime la nota de {alumno}")

    notas.append(pedir_nota())
    # Llamamos a pedir_nota() para obtener una nota válida
    # y la añadimos al final de la lista "notas".
    # Al terminar el bucle, "notas" tendrá una nota por cada alumno.
    # Ejemplo: [8, 6, 9, 7]

# Al salir del bucle tenemos dos listas relacionadas:
#   alumnos = ["Monica", "Ermengol", "Jordi",  "Marisol"]
#   notas   = [8,        6,          9,         7       ]
# El alumno de la posición 0 tiene la nota de la posición 0, etc.
#
# RETO 1: imprime cada alumno con su nota usando un bucle for y range().
# RETO 2: calcula la nota media del grupo con sum(notas) / len(notas).
# RETO 3: encuentra al alumno con la nota más alta.

Publicado por

Juan Pablo Fuentes

Formador de programación y bases de datos