Ejercicios repaso examen

# función a la que le pasamos una lista de números y nos devuelve una tupla
# con el número de pares y el número de impares
# contarParidad([1,2,3,4,5])->(2,3) (dos pares y tres impares)

def contarParidad(lista):
    pares = 0
    impares = 0
    for numero in lista:
        if numero % 2 == 0:
            pares += 1
        else:
            impares += 1
    return (pares, impares)


def contarParidad2(lista):
    pares = len([numero for numero in lista if numero % 2 == 0])
    return (pares, len(lista) - pares)


print(contarParidad([1, 2, 3, 4, 5]))
print(contarParidad2([1, 2, 3, 4, 5]))
concesionario = [{"marca": "Tesla", "tipo": "Electrico", "autonomía": 500, "precio": 40000},
                 {"marca": "Citroen", "tipo": "Gasolina", "autonomía": 2500, "precio": 10000},
                 {"marca": "Ford", "tipo": "Gasolina", "autonomía": 3500, "precio": 20000},
                 {"marca": "Ferrari", "tipo": "Gasolina", "autonomía": 5500, "precio": 120000},
                 {"marca": "Seat", "tipo": "Electrico", "autonomía": 700, "precio": 10000},
                 {"marca": "Skoda", "tipo": "Gasolina", "autonomía": 3500, "precio": 7000},
                 ]

# Cread una función que nos devuelva la suma de precios del concesionario
def sumaPrecios(concesionario):
    total=0
    for coche in concesionario:
        total+=coche["precio"]
    return total

def sumaPrecios2(concesionario):
    return sum([coche["precio"] for coche in concesionario])
print(sumaPrecios(concesionario))
print(sumaPrecios2(concesionario))
# Cread una función a la que le pasamos una cadena y una longitud y nos devuelve las cadenas
# que superan esa longitud
# masLargas("hola que tal vamos",3)->["hola","vamos"]

def masLargas(cadena, longitud):
    palabras=cadena.split(" ")
    resultado=[]
    for palabra in palabras:
        if len(palabra)>longitud:
            resultado.append(palabra)
    return resultado

def masLargas2(cadena, longitud):
    palabras=cadena.split(" ")
    return [palabra for palabra in palabras if len(palabra)>longitud]

print(masLargas("hola que tal vamos",3))
print(masLargas2("hola que tal vamos",3))


Repaso examen tipo

# corregir código

def factorial(numero):
    total = 1
    while numero > 1:
        total *= numero
        numero -= 1
    return total


print(factorial(5))  # 120 5*4*3*2*1


def palabraMaslarga(cadena):
    palabras = cadena.split(" ")
    masLarga = palabras[0]  # Aquí NO hay un error
    for palabra in palabras:
        if len(palabra) > len(masLarga):  # Aquí hay un error (al revés)
            masLarga = palabra  # Aquí hay un error
    return masLarga


def numeroMayor(lista):
    mayor = lista[0]
    for numero in lista:
        if numero > mayor:  # Aquí hay un error (al revés)
            mayor = numero  # Aquí hay un error
    return mayor


print(palabraMaslarga("En un lugar de la mancha de cuyo nombre no quiero acordarme"))
print(numeroMayor([1, 2, 3, 7, 6, 5, 2]))
print(numeroMayor([-5, -2, -17 - 3]))


# Cread una función porcentajeIva que nos devuelva:
# 0 si el producto es "primera necesidad"
# 4 si es 'libro' o 'revista'
# 10 si es 'pañales'
# 21 en otros casos
def porcentajeIva(producto):
    if producto == "primera necesidad":
        return 0
    elif producto == "libro" or producto == "revista":
        return 4
    elif producto == "pañales":
        return 10
    else:
        return 21


print(porcentajeIva("primera necesidad"))
print(porcentajeIva("libro"))
print(porcentajeIva("revista"))
print(porcentajeIva("pañales"))
print(porcentajeIva("cacahuetes"))


# define una función a la que le pasamos una cadena y nos dice la media de longitud
# de las palabras de la cadena
def mediaLongitud(cadena):
    palabras = cadena.split(" ")
    longitudTotal = 0
    for palabra in palabras:
        longitudTotal += len(palabra)
    return longitudTotal / len(palabras)


def mediaLongitud2(cadena):
    palabras = cadena.split(" ")
    longitudes = [len(palabra) for palabra in palabras]
    return sum(longitudes) / len(palabras)


print(mediaLongitud("aa bbbb ccc"))
print(mediaLongitud2("aa bbbb ccc"))


# Una función números pares a la que le pasamos una lista de números y nos devuelve los pares

def numerosPares(lista):
    resultado = []
    for numero in lista:
        if numero % 2 == 0:
            resultado.append(numero)
    return resultado


def numerosPares2(lista):
    return [numero for numero in lista if numero % 2 == 0]


print(numerosPares([1, 2, 3, 4, 5, 6, 7, 8]))
print(numerosPares2([1, 2, 3, 4, 5, 6, 7, 8]))

clase = [{
    "nombre": "Ana",
    "creditos": 15,
    "curso": "Python"
}, {
    "nombre": "Iu",
    "creditos": 5,
    "curso": "Python"
}, {
    "nombre": "Eva",
    "creditos": 25,
    "curso": "BBDD"
}, {
    "nombre": "Pep",
    "creditos": 7,
    "curso": "BBDD"
}, ]


# Crea una función a la que le pasamos una clase y nos devuelve el total de créditos
def totalCreditos(clase):
    total = 0
    for alumno in clase:
        total += alumno['creditos']
    return total


def totalCreditos2(clase):
    total = sum([alumno['creditos'] for alumno in clase])
    return total


def totalCreditosCurso(clase, curso):
    total = 0
    for alumno in clase:
        if alumno['curso'] == curso:
            total += alumno['creditos']
    return total


def totalCreditosCurso2(clase, curso):
    total = sum([alumno['creditos'] for alumno in clase if alumno['curso'] == curso])
    return total


print(totalCreditos(clase))
print(totalCreditos2(clase))
print(totalCreditosCurso(clase, "BBDD"))
print(totalCreditosCurso2(clase, "BBDD"))


# ordenar los alumnos por crédito

def ordenCredito(clase):
    ordenados = sorted(clase, key=lambda x: x['creditos'])
    return ordenados


def ordenarCredito(clase):
    ordenados = sorted([alumno['creditos'] for alumno in clase])
    return ordenados


def mayorCredito(clase):
    mayor = max(clase, key=lambda x: x['creditos'])
    return mayor


def mayorCredito2(clase):
    mayor = max([alumno['creditos'] for alumno in clase])
    return mayor


print(ordenCredito(clase))
print(ordenarCredito(clase))
print(mayorCredito(clase))
print(mayorCredito2(clase))


# Cread una función a la que le pasamos una cadena y una letra y nos devueve una
# lista con las palabras que tienen esa letra

def palabrasConLetra(cadena, letra):
    palabras = cadena.split(" ")
    resultado = []
    for palabra in palabras:
        if letra in palabra:
            resultado.append(palabra)
    return resultado


def palabrasConLetra2(cadena, letra):
    palabras = cadena.split(" ")
    return [palabra for palabra in palabras if letra in palabra]


print(palabrasConLetra("hola que tal yo mal", "a"))
print(palabrasConLetra2("hola que tal yo mal", "a"))


# Una función a la que le pasamos una cadena y nos devuelve una lista
# con la primera letra de cada palabra

def primeraLetra(cadena):
    palabras = cadena.split(" ")
    resultado = []
    for palabra in palabras:
        resultado.append(palabra[0])
    return resultado


def primeraLetra2(cadena):
    palabras = cadena.split(" ")
    return [palabra[0] for palabra in palabras]


print(primeraLetra("hola que tal yo muy bien"))
print(primeraLetra2("hola que tal yo muy bien"))

# Cread una función a la que le pasamos una cadena y nos devuelve una lista de palabras
# que empiecen y acaben con la misma letra
def inicioFin(cadena):
    palabras = cadena.split(" ")
    resultado=[]
    for palabra in palabras:
        if palabra[0]==palabra[-1]:
            resultado.append(palabra)
    return resultado

def inicioFin2(cadena):
    palabras = cadena.split(" ")
    return [palabra for palabra in palabras if palabra[0]==palabra[-1]]

print(inicioFin("hola ana como sales tan pronto"))
print(inicioFin2("hola ana como sales tan pronto"))


Soluciones ejercicios

import datetime
import random


# Cread una función tiradaDado que nos devuelva un número aleatorio del 1 al 6

def tiradaDado(limite=6):
    return random.randint(1, limite)


for i in range(10):
    print(tiradaDado())


# Cread una función que nos devuelva al azar una provincia de Barcelona
def provinciaAzar():
    provincias = ["Barcelona", "Tarragona", "Lleida", "Girona"]
    return random.choice(provincias)


for i in range(10):
    print(provinciaAzar())


# Cread una función que nos devuelva el año actual
def anyoActual():
    return datetime.date.today().year


print(anyoActual())


# Cread una función que nos devuelva True si hoy es viernes y false en caso contrario
def esViernes():
    return datetime.date.today().weekday() == 4  # 0 lunes hasta 6 domingo


print(esViernes())


# Cread una función que nos devuelva la fecha actual en formato día/mes/año

def fechaActual():
    return datetime.date.today().strftime("%d/%m/%Y")


print(fechaActual())


# Cread una función que nos devuelva el siguiente día laborable a partir de hoy
def siguienteLaborable():
    fecha = datetime.date.today()
    fecha += datetime.timedelta(days=1)
    while fecha.weekday() > 4:
        fecha += datetime.timedelta(days=1)
    return fecha


def siguienteLaborable2():
    fecha = datetime.date.today()
    fecha += datetime.timedelta(days=1)
    if fecha.weekday() > 4:
        fecha += datetime.timedelta(days=(7 - fecha.weekday()))
    return fecha


print(siguienteLaborable2())

Sesiones virtuales

SESIÓN VIRTUAL (10-04-2025 18_00_00)-20250410_180338-Grabación de la reunión.mp4

SESIÓN VIRTUAL (16-04-2025 18_00_00)-20250416_180432-Grabación de la reunión.mp4

SESIÓN VIRTUAL (22-04-2025 18_00_00)-20250422_180529-Grabación de la reunión.mp4

SESIÓN VIRTUAL (24-04-2025 18_00_00)-20250424_180332-Grabación de la reunión.mp4

SESIÓN VIRTUAL (25-04-2025 18_00_00)-20250425_180447-Grabación de la reunión.mp4

SESIÓN VIRTUAL (29-04-2025 18_00_00)-20250429_180841-Grabación de la reunión.mp4

SESIÓN VIRTUAL (30-04-2025 18_00_00)-20250430_180856-Grabación de la reunión.mp4

SESIÓN VIRTUAL (02-05-2025 18_00_00)-20250502_180552-Grabación de la reunión.mp4

SESIÓN VIRTUAL (05-05-2025 18_00_00)-20250505_180717-Grabación de la reunión.mp4

SESIÓN VIRTUAL (06-05-2025 18_00_00)-20250506_180919-Grabación de la reunión.mp4

SESIÓN VIRTUAL (07-05-2025 18_00_00)-20250507_181546-Grabación de la reunión.mp4

SESIÓN VIRTUAL (08-05-2025 18_00_00)-20250508_180607-Grabación de la reunión.mp4

SESIÓN VIRTUAL (09-05-2025 18_00_00)-20250509_181432-Grabación de la reunión.mp4

Ejercicios funciones

# Cread una función tiradaDado que nos devuelva un número aleatorio del 1 al 6

# Cread una función que nos devuelva al azar una provincia de Cataluña

# Cread una función que nos devuelva el año actual

# Cread una función que nos devuelva True si hoy es viernes y false en caso contrario

# Cread una función que nos devuelva la fecha actual en formato día/mes/año

# Cread una función que nos devuelva el siguiente día laborable a partir de hoy

Soluciones ejercicios lambda

biblioteca = [
    {"titulo": "El Quijote", "autor": "Cervantes", "precio": 20},
    {"titulo": "Las olas", "autor": "Virginia Woolf", "precio": 17},
    {"titulo": "Los detectives salvajes", "autor": "Roberto Bolaño", "precio": 23},
    {"titulo": "Tom va a la escuela", "autor": "Rick Sánchez", "precio": 10}
]

# Para resolver los siguientes ejercicios podéis usar cualquier método de los vistos en clase

# Calcular la suma de todos los precios

# obtener precio
# Haciendo el bucle de toda la vida y sumando los precios
suma = 0
for libro in biblioteca:
    suma += libro["precio"]
print(suma)
# Comprension de listas obteniendo solo el precio, entonces ya puedo usar 'sum'
precios = [libro["precio"] for libro in biblioteca]
print(sum(precios))
# Obteniendo los precios mediante el 'map' y una función lambda, después puedo usar 'sum'
precios = list(map(lambda x: x["precio"], biblioteca))
print(sum(precios))

# Queremos obtener el libro con el precio más alto
# Método tradicional con un for nos guardamos el más caro 'de momento'
libroCaro = None
precio = 0
for libro in biblioteca:
    # Si encontramos uno más caro nos lo quedamos
    if libro["precio"] > precio:
        precio = libro["precio"]
        libroCaro = libro
print(libroCaro)

# Usar max junto con lambda para que busque el máximo de la propiedad 'precio'
libroCaro = max(biblioteca, key=lambda x: x["precio"])
print(libroCaro)

# queremos ordenarlos por título

# Ordenamos mediante título usando una lambda
librosPorTitulo = sorted(biblioteca, key=lambda x: x["titulo"])
print(librosPorTitulo)

proyectos = [
    {"nombre": "Análisis", "horas": 10, "precio": 60},
    {"nombre": "Desarrollo", "horas": 50, "precio": 50},
    {"nombre": "Implementación", "horas": 5, "precio": 70},
    {"nombre": "Pruebas", "horas": 15, "precio": 40},
]

# Queremos calcular el coste total de todos los proyectos (horas*precio)

total = 0
for proyecto in proyectos:
    total += proyecto["horas"] * proyecto["precio"]
print(total)

importes = [proyecto["horas"] * proyecto["precio"] for proyecto in proyectos]
print(sum(importes))
importes = list(map(lambda x: x["precio"] * x["horas"], proyectos))
print(sum(importes))

# El proyecto con mayor coste (horas*precio)
mayorCoste = max(proyectos, key=lambda proyecto: proyecto["precio"] * proyecto["horas"])
print(mayorCoste)
# ordenar por número de horas
porHoras = sorted(proyectos, key=lambda x: x["horas"])
print(porHoras)
# Filtrar los que cuesten más 1000 €

caros = [proyecto for proyecto in proyectos if proyecto["horas"] * proyecto["precio"] > 1000]
print(caros)
caros = list(filter(lambda x: x["horas"] * x["precio"] > 1000, proyectos))
print(caros)

Ejercicios lambda

biblioteca = [
    {"titulo": "El Quijote", "autor": "Cervantes", "precio": 20},
    {"titulo": "Las olas", "autor": "Virginia Woolf", "precio": 17},
    {"titulo": "Los detectives salvajes", "autor": "Roberto Bolaño", "precio": 23},
    {"titulo": "Tom va a la escuela", "autor": "Rick Sánchez", "precio": 10}
]

# Para resolver los siguientes ejercicios podéis usar cualquier método de los vistos en clase

# Calcular la suma de todos los precios

# Queremos obtener el libro con el precio más alto

# queremos ordenarlos por título

proyecto = [
    {"nombre": "Análisis", "horas": 10, "precio": 60},
    {"nombre": "Desarrollo", "horas": 50, "precio": 50},
    {"nombre": "Implementación", "horas": 5, "precio": 70},
    {"nombre": "Pruebas", "horas": 15, "precio": 40},
]

# Queremos calcular el coste total de todos los proyectos (horas*precio)
# El proyecto con mayor coste (horas*precio)
# ordenar por número de horas
# Filtrar los que cuesten más 1000 €


Ejemplos funciones lambda

alumnos = ["Ana", "Iu", "Eva", "Victoria", "Ramon"]


def ultimaLetra(cadena):
    return cadena[-1]


ordenado = sorted(alumnos)
print(ordenado)
ordenado = sorted(alumnos, key=len)
print(ordenado)
ordenado = sorted(alumnos, key=ultimaLetra)
print(ordenado)
maslargo = max(alumnos, key=len)
print(maslargo)
maslargo = max(alumnos, key=ultimaLetra)
print(maslargo)

clase = [
    {"nombre": "Ana", "nota": 7},
    {"nombre": "Eva", "nota": 3},
    {"nombre": "Iu", "nota": 6},
    {"nombre": "Luis", "nota": 8},
    {"nombre": "Pep", "nota": 5},
]


def getNota(elemento):
    return elemento["nota"]


maslisto = max(clase, key=getNota)
print(maslisto)
peor = min(clase, key=getNota)
print(peor)

# Funciones lambda: Son funciones anónimas que se definen al momento
# lambda argumentos: expresion que se devuelve
maslisto = max(clase, key=lambda x: x["nota"])
print(maslisto)
# lo que hace el código de antes es recorrer la lista, obtener la nota de cada elemento
# ordenar por ese valor (es decir, por nota) y devolver el que tenga el valor máximo

suma_lambda = lambda x, y: x + y
print(suma_lambda(3, 4))
pornotas = sorted(clase, key=lambda alumno: alumno["nota"])
print(pornotas)

# Hay una función predefinida de python que es 'map'
# aplica una función a todos los elementos de un iterable
numeros = [1, 2, 3, 4, 5]


def cuadrado(x):
    return x ** 2


cuadrados = list(map(cuadrado, numeros))
print(cuadrados)

cuadrados2 = list(map(lambda x: x ** 2, numeros))
print(cuadrados2)

aprobados = list(filter(lambda x: x["nota"] >= 5, clase))
print(aprobados)


notas = [10, 2, 3, 4, 5, 6, 7, 8, 9]


def esPar(numero):
    return numero % 2 == 0


pares = []
for nota in notas:
    if esPar(nota):
        pares.append(nota)
print(pares)

pares2 = [nota for nota in notas if esPar(nota)]
print(pares2)

pares3 = list(filter(esPar, notas))
print(pares3)

# Reescribir esto sin usar esPar

pares = []
for nota in notas:
    if nota % 2 == 0:
        pares.append(nota)
print(pares)

pares2 = [nota for nota in notas if nota % 2 == 0]
print(pares2)

pares3 = list(filter(lambda nota: nota % 2 == 0, notas))
print(pares3)

pedidos = [{"producto": "Libro", "precio": 20}, {"producto": "Lápiz", "precio": 2},
           {"producto": "Cuaderno", "precio": 5}, {"producto": "Tablet", "precio": 200},
           {"producto": "Funda", "precio": 15}]

# pedidos de 20 de precio o más
masde20 = []
for pedido in pedidos:
    if pedido["precio"] >= 20:
        masde20.append(pedido)

print(masde20)

masde20b = [pedido for pedido in pedidos if pedido["precio"] >= 20]
print(masde20b)

masde20c = list(filter(lambda pedido: pedido["precio"] >= 20, pedidos))
print(masde20c)

Soluciones diccionarios y tuplas

alumnos = {
    "Ana": [8, 6, 10],
    "Luis": [5, 6, 7],
    "Marta": [9, 8, 9],
    "Eva": [9, 8, 9],

}
# Esto no se pedía, pero si queremos añadir notas personalizadas a cada alumno lo podemos hacer así
notasnuevas = [6, 7, 4, 8]
# Para guardar el que tenga la media más alta. Necesitamos la media para saber el valor
# y primerodelaclase para el nombre
mediaprimero = 0
primerodelaclase = ""
# recorrer un diccionario
for alumno, notas in alumnos.items():
    media = sum(notas) / len(notas)
    print(f"El alumno {alumno} tiene una nota media de {media:.2f}")
    if media > mediaprimero:
        mediaprimero = media
        primerodelaclase = alumno
    notas.append(notasnuevas.pop())
print("El primero de la clase es ", primerodelaclase)  #

# No es recomendable. Por varias cosas, una, si añado alumnos ya no funciona
# Si tengo muchos alumnos se me juntan demasiadas líneas
# Y no vale decir 'Así pongo una nota individualizada' ;)
alumnos["Ana"].append(3)
alumnos["Luis"].append(3)
alumnos["Marta"].append(3)

alumnos.keys()  # Las claves "Ana","Luis"...
alumnos.values()  # Los valores [8, 6, 10],...
alumnos.items()  # Los pares clave valor ("Ana",[8, 6, 10])....

alumnos  # python me devuelve alumnos.keys()

inventario = {
    "frutas": ["manzana", "pera", "plátano"],
    "verduras": ["zanahoria", "brócoli"],
    "bebidas": ["agua", "zumo"]
}

# Añade "sandía" a la categoría de frutas.
inventario["frutas"].append("sandía")
print(inventario)
# Imprime todos los productos (uno por línea).
for productos in inventario.values():
    for producto in productos:
        print(producto)

# Cuenta cuántos productos hay en total.
numproductos = 0
for productos in inventario.values():
    numproductos += len(productos)
print(numproductos)

# Diccionario donde cada cliente tiene una lista de pedidos (cada pedido es un dict)
clientes = {
    "Juan": [{"producto": "Libro", "precio": 20}, {"producto": "Lápiz", "precio": 2}],
    "Ana": [{"producto": "Cuaderno", "precio": 5}],
    "Luis": [{"producto": "Tablet", "precio": 200}, {"producto": "Funda", "precio": 15}]
}


def total_gastado(cliente, datos):  # Nos devuelve cuanto ha gastado cada cliente en total
    pedidos = datos[cliente]
    total = 0
    for pedido in pedidos:
        total += pedido["precio"]
    return total
def total_gastado_c(cliente, datos):
    return sum([pedido["precio"] for pedido in datos[cliente]])

def productosPorCliente(
        datos):  # nos devuelve un diccionario donde la clave es el nombre del cliente y el valor es el número de productos
    resultado = {}
    for clave, valor in datos.items():
       resultado[clave] = len(valor)
    return resultado

def productosPorCliente_c(
        datos):  # nos devuelve un diccionario donde la clave es el nombre del cliente y el valor es el número de productos
    return {clave:len(valor) for clave, valor in datos.items()}

# Para saber si un diccionario ya tiene una clave usamos ‘in’ como en las listas

# if "Ana" in clientes:
print(total_gastado("Luis", clientes))
print(total_gastado_c("Luis", clientes))
print(productosPorCliente(clientes))
print(productosPorCliente_c(clientes))