Soluciones ejercicios

# Cread una función a la que le pasamos un número y nos lo devuelva multiplicado por 3
# triplicar(5) -> 15

def triplicar(numero):
    return numero * 3


# Cread una función a la que le pasamos una cadena y una letra y nos devuelva True si la cadena tiene esa letra
# tieneLetra("hola que tal","t")->true

def tieneLetra(cadena, letra):
    for i in cadena:
        if i == letra:
            return True

    return False


tieneLetra("hola que tal", "t")


# Cread una función a la que le pasamos una ciudad y un importe y nos devuelve los gastos de envío
# acordes a la siguiente:
# Barcelona: 0  Tarragona o Girona con importe < 500 5€, resto 0€ Resto de ciudades 6€
# gastosEnvio("Barcelona",50)->0 gastosEnvio("Logroño",50)->6

def gastosEnvio(ciudad, importe):
    if ciudad == "Barcelona":
        return 0
    elif ciudad == "Tarragona" or ciudad == "Girona":
        if importe < 500:
            return 5
        else:
            return 0
    else:
        return 6

# Otra manera
def gastosEnvio2(ciudad, importe):
    if ciudad == "Barcelona":
        return 0
    elif (ciudad == "Tarragona" or ciudad == "Girona") and importe<500:
        return 5
    elif (ciudad == "Tarragona" or ciudad == "Girona") and importe >= 500:
        return 0
    else:
        return 6

print(gastosEnvio("Barcelona", 50))  # 0
print(gastosEnvio("Logroño", 50))  # 6
print(gastosEnvio("Girona", 50))  # 5
print(gastosEnvio("Tarragona", 5000))  # 0


# cread una función que nos diga si alguien puede subir a una atracción de acuerdo a su edad y su altura
# si tiene más de 18 años o una altura superior a 135 cm puede subir, en caso contrario no
# puedeSubir(20,130)->True puedeSubir(10,140)->True puedeSubir(10,130)->False

def puedeSubir(edad, altura):
    if edad >= 18 or altura >= 135:
        return True
    else:
        return False


print(puedeSubir(20, 130))  # True
print(puedeSubir(10, 140))  # True
print(puedeSubir(10, 130))  # False

Ejercicios repaso

# Cread una función a la que le pasamos un número y nos lo devuelva multiplicado por 3
# triplicar(5) -> 15


# Cread una función a la que le pasamos una cadena y una letra y nos devuelva True si la cadena tiene esa letra
# tieneLetra("hola que tal","t")->true

# Cread una función a la que le pasamos una ciudad y un importe y nos devuelve los gastos de envío
# acordes a la siguiente: Barcelona: 0  Tarragona o Girona con importe < 500 5€, resto 0€ Resto de ciudades 6€
# gastosEnvio("Barcelona",50)->0 gastosEnvio("Logroño",50)->6


# cread una función que nos diga si alguien puede subir a una atracción de acuerdo a su edad y su altura
# si tiene más de 18 años o una altura superior a 135 cm puede subir, en caso contrario no
# puedeSubir(20,130)->True puedeSubir(10,140)->True puedeSubir(10,130)->False

Repaso general

# Variables

# Caja donde almacenar valores
edad = 90
nombre = "Ana"
sueldo = 5000
iva = .21
tieneSaldo = True

# Podemos hacer operaciones

edad += 1
sueldoneto = sueldo * .85
nombre = nombre + " Pi"

# Tema de los nombres, mayúsculas y minúsculas cuentan
# no es lo mismo 'nombre' que 'Nombre' que 'NOMBRE'
# empezamos con minuscula y si hay palabra nueva a) Usamos mayusculas b) usamos guión bajo

sueldoBruto = sueldo * 1.1

sueldo_bruto = sueldo * 1.1

sb = sueldo * 1.1

# Los operadores 'extraños' son el módulo %, la división entera // y la exponenciación

resto = 7 % 3  # El resto de divivir 7 entre 3, es decir 1

entero = 7 // 3  # división entera luego 2

potencia = 2 ** 10  # 2 elevado a la décima potencia, es decir 1024

cont = 0

# sumar 1
cont = cont + 1
cont += 1

# concatenar cadena
alumno = "Ana"
alumno = alumno + " Pi"
alumno += " Pi"


# >,>=,<,<= pero ojo igual es '==' y diferente es '!='

# Operadores booleanos, que nos dan cierto o falso
# and cierto si los dos son ciertos or cierto si alguno es cierto y not cierto si es falso y viceversa

# funciones
# trozo de código reutilizable al que le pasamos parámetros y frecuentemente devolvemos un resultado
# sintaxis
# def nombre_funcion(parametros):
#     codigo
#     return resultado

# IMPORTANTE: Una función debe ser 'pura', es decir, solo depende de los parámetros que le pasamos
# devuelve un resultado que a igual parámetro igual resultado
# NO modifica el entorno, si yo le paso na variable fuera de la función debe tener el mismo valor
# con los tipos simples no hay problema, pero con las listas hay que tener cuidado
# si modificamos la lista dentro de la función también la modificamos fuera

def saludo():
    return "Hola que tal"


# Tengo la función, después la tengo que llamar

hola = saludo()
print(saludo())


def saludo2(nombre):
    return f"Hola {nombre} que tal estás"


print(saludo2("Ana"))

nombre = "Federido I de Prusia"

print(saludo2(nombre))


def saludos(cantidad=2):
    resultado = ""
    for i in range(cantidad):
        resultado += saludo() + "\n"  # resultado=resultado+saludo()+"\n"
    return resultado


print(saludos(5))
print(saludos())


# Condicional. Nos permite dirigir el flujo del código dependiendo de condiciones
# if condicion:
#   codigo si se cumple
# else:
#   codigo si no se cumple
# La condición puede ser compleja utilizando and, or y not

def mayor(a, b):
    if a > b:
        return a
    else:
        return b


print(mayor(6, 9))  # 9


def login(usuario, password):
    if usuario == "admin" and password == "1234":
        return True
    else:
        return False


print(login("Ana", "11212"))  # False
print(login("admin", "1234"))  # True

usuario = input("Dime tu usuario")
password = input("Dime la contraseña")
if login(usuario, password):
    print("Puedes entrar")
else:
    print("No puedes entrar")


def irpf(sueldo):
    if sueldo < 1000:
        return .02
    elif sueldo < 3000:
        return .05
    elif sueldo < 5000:
        return .1
    else:
        return .2


def sueldoNeto(sueldo):
    return sueldo - sueldo * irpf(sueldo)


print(irpf(2500))  # 0.05
print(sueldoNeto(2500))
miSueldo = sueldoNeto(2500)

totalAnyo = miSueldo * 12

print(f"Este año voy a ganar neto {totalAnyo}")


# bucles
# while y el for
# while es un bucle que se ejecuta mientras se cumpla una condición
def geometrica(inicio, razon, limite):
    while inicio < limite:
        inicio *= razon
    return inicio


print(geometrica(1, 2, 500))


# cogemos cualquier número, si es par dividimos entre 2 si impar *3+1

def serieAl1(numero):
    lista = [numero]
    while numero != 1:
        if numero % 2 == 0:
            numero = numero / 2
        else:
            numero = numero * 3 + 1
        lista.append(numero)
    return lista


print(serieAl1(4500))

# for nos permite recorrer 'iterables' ¿QUé es un iterable?
# Elementos de python que se pueden recorrer
# Una cadena se puede recorrer letra a letra
for letra in "hola":
    print(letra)

# Una lista se puede recorrer elemento a elemento
for elemento in [4, 2, 7, 9, 6]:
    print(elemento)

# Puedo crear rangos de números consecutivos con 'range'

for i in range(8):  # 0..7
    print(i)

for i in range(2, 8):  # 2..7
    print(i)

for i in range(2, 8, 2):  # 2,4,6
    print(i)

for i in range(7, 0, -1):  # 7,6,5,4,3,2,1
    print(i)

# Con esto de los rangos consecutivos también puedo hacer el repetir una acción
# un número determinado de veces

# Imprime "hola" 5 veces. En este caso no nos importa el valor de i, simplemente hacer algo 5 veces
for i in range(5):
    print("hola")

# Las cadenas tienen una serie de funciones para saber si tienen una subcadena, pasar mayúsculas/minúsculas
# obtener subcadenas con el 'slicing', etcétera

def fragmentos(cadena):
    resultado=[]
    for i in range(len(cadena)):
        resultado.append(cadena[0:i])
    return resultado

print(fragmentos("anastasia"))

# Listas: colecciones de elementos de cualquier tipo
lista = [1, 2, 5, 2, "hola", True]

# Se pueden recorrer con un for como hemos visto antes y tienen una serie de funciones
# para insertar, añadir, repetir, etcétera

def crearConsecutiva(veces):
    lista=[]
    for i in range(veces):
        lista.append(i)
    return lista

print(crearConsecutiva(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Solución ejercicios

# Definir el algoritmo
# Los pasos que vamos a implementar para resolver el problema
# La 'receta'
# Divide y vencerás: un problema grande se compone de otros más pequeños
# Lo primero es pensar ¿Cömo voy a resolver este problema?

# Cread una función a la que le pasamos una lista de números y nos devuelva una lista
# con el menor y el mayor
# menorMayor([3,1,8,5])->[1,8]

# Cual es el mayor y cual es el menor

# Esta solución es más fácil
def menorMayor(lista):
    ordenada = sorted(lista)
    return [ordenada[0], ordenada[-1]]


# Esta solución es más eficiente, porque ordenar es algo muy costoso
def menorMayor2(lista):
    menor = lista[0]
    mayor = lista[0]
    for numero in lista:
        if numero < menor:
            menor = numero
        if numero > mayor:
            mayor = numero
    return [menor, mayor]


# Esto de aquí hay que evitarlo: No se modifican los parámetros que pasamos
def menorMayor3(lista):
    lista.sort()
    menor = lista.pop(0)
    mayor = lista.pop(-1)
    return [menor, mayor]


print(menorMayor([3, 1, 8, 5]))
print(menorMayor2([3, 1, 8, 5]))

milista = [2, 1, 6, 8, 33, 4, 12, 25]
print(menorMayor3(milista))
print(milista)


# Cread una función a la que le pasamos una lista de nombres y nos devuelve una lista
# con todos los nombres en minúsculas
# minusculas(["Ana","Pep","Iu"])->["ana","pep","iu"]

# Tener un sitio donde guardar el resultado
# recorrer la lista
# como pasar una cadena a minúsculas
def minusculas(lista):
    resultado = []
    for elemento in lista:
        resultado.append(elemento.lower())
    return resultado


print(minusculas(["Ana", "Pep", "Iu"]))


# Cread una función a la que le pasamos una lista de cadenas y nos devuelve una lista
# con las que tengan una longitud par
# longitudPar(["aa","bbb","cccc","ddddd"])->["aa","cccc"]

# Tener un sitio donde guardar el resultado
# recorrer la lista
# Si la longitud es par, lo añado a la lista
def longitudPar(lista):
    resultado = []
    for elemento in lista:
        if len(elemento) % 2 == 0:
            resultado.append(elemento)
    return resultado


print(longitudPar(["aa", "bbb", "cccc", "ddddd"]))

Ejercicios listas

# Definir el algoritmo
# Los pasos que vamos a implementar para resolver el problema
# La 'receta'
# Divide y vencerás: un problema grande se compone de otros más pequeños
# Lo primero es pensar ¿Cömo voy a resolver este problema?

 # Cread una función a la que le pasamos una lista de números y nos devuelva una lista
 # con el menor y el mayor
 # menorMayor([3,1,8,5])->[1,8]
 
 # Cread una función a la que le pasamos una lista de nombres y nos devuelve una lista
 # con todos los nombres en minúsculas
 # minusculas(["Ana","Pep","Iu"])->["ana","pep","iu"]
 
 
 # Cread una función a la que le pasamos una lista de cadenas y nos devuelve una lista
 # con las que tengan una longitud par
 # longitudPar(["aa","bbb","cccc","ddddd"])->["aa","cccc"]

Más ejemplos listas

# Crea una función a la que le pasamos una lista de cadenas y me devuelva la más larga
# si hay varias cadenas con la misma longitud, la primera
# masLarga(["aa","eeeee","bbb"])->"eeeee"

# en algún sitio guardaré la cadena más larga
# recorrer la lista
# si la cadena que estoy mirando es más larga que la que ya tengo me quedo con ella

def masLarga(lista):
    larga = ""
    for cadena in lista:
        # Aquí está la magia
        if len(cadena) > len(larga):
            larga = cadena

    return larga

lista = ['a', 'b', 'c', 'a']
print(lista.index('a'))  # 0
print(lista.index('a', 1))  # 3

numeros = [2, 4, 6, 8, 9, 6, 9, 7, 6]
try:
    pos = numeros.index(6)  # 2
    print(pos)
    pos = numeros.index(6, pos + 1)  # 5
    print(pos)
    pos = numeros.index(6, pos + 1)  # 8
    print(pos)
    pos = numeros.index(6, pos + 1)  # Error
    print(pos)
except:
    print("No encontrado")

print(numeros.count(6))

copia_incorrecta = numeros
copia_correcta = numeros.copy()
numeros[0] = 27
print(copia_incorrecta)
print(copia_correcta)
copia_incorrecta[1] = 99
print(numeros)
print(copia_correcta)

# Cuidado con modificar las listas dentro de las funciones, porque la modificación afecta fuera
# Si por lo que sea tenemos que modificar, hagamos una copia
def sumar(lista):
    suma = 0
    for i in range(len(lista)):
        suma += lista.pop()
    return suma




def buscar(lista,elemento):
    posiciones=[]
    try:
       pos=lista.index(elemento)
       while True:
           posiciones.append(pos)
           pos = lista.index(elemento,pos + 1)
    except:
        return posiciones

print(buscar(numeros,6))

numeros = [2, 4, 6, 8, 9, 6, 9, 7, 6]

numeros.sort()
# Modificamos la propia lista, que queda ordenada
print(numeros)

numeros.sort(reverse=True)

print(numeros)

numeros = [2, 4, 6, 8, 9, 6, 9, 7, 6]
# Nos crea una copia ordenada de la lista y la lista original queda como estaba
ordenados = sorted(numeros)

print(numeros)
print(ordenados)

numeros.reverse()
print(numeros)

clase = ["Ana", "Pep", "Rosa", "Iu", "Eva"]
clase.reverse()
print(clase)

clase = ["Ana", "Pep", "Rosa", "Iu", "Eva"]
# Tengo que convertir a lista por cosillas del Python, que no devuelve una lista sino un iterador
clase_vuelta = list(reversed(clase))
print(clase)
print(clase_vuelta)
# Aquí no hace falta convertir a lista porque el in funciona con iteradores
for alumno in reversed(clase):
    print(alumno)

# El key nos permite ordenar por funciones diferentes a las alfabéticas
# En este caso, ordeno por longitud
clase_orden = sorted(clase, key=len)
print(clase_orden)

Soluciones ejercicios

# Cread una función a la que le pasamos un cantidad y nos devuelve una lista con
# esa cantidad de la cadena "hola" repetidas
# crearHolas(4)->["Hola","Hola","Hola","Hola"]

def crearHolas(cantidad):
    # devolver una lista con la cadena "Hola" repetida 'cantidad' veces
    resultado = []
    # Tengo añadir la cadena "Hola" a esa lista n veces
    # 1.- Hacer algo n veces for
    # 2.- Añadir una cadena a una lista append
    for i in range(cantidad):
        resultado.append("Hola")

    return resultado


def crearHolas2(cantidad):
    return ["Hola"] * cantidad


print(crearHolas(4))
print(crearHolas2(4))


# tengo la siguiente función que me calcula la media de una lista
def media(lista):
    suma = 0
    for numero in lista:
        suma += numero
    return (suma / len(lista))


# Cread una función mediaAprobados que nos calcule la media pero solo de aquellos números
# que son >=5

def mediaAprobados(lista):
    suma = 0
    cont = 0
    for numero in lista:
        if numero >= 5:
            suma += numero
            cont += 1
    print(suma)
    return (suma / cont)


def mediaAprobados2(lista):
    aprobados = []
    for numero in lista:
        if numero >= 5:
            aprobados.append(numero)
    return media(aprobados)


lista = [1, 8, 3, 4, 5, 6, 2, 8, 9]
calculo = mediaAprobados(lista)
print(calculo)
calculo = mediaAprobados2(lista)
print(calculo)


# Cread una función a la que le pasemos una lista de cadenas y una longitud y nos diga
# cuantas cadenas son mayores de esa longitud
# contarCadenas(["aaa","bbbb","ccccc"],3)->2

def contarCadenas(lista, longitud):
    # una variable donde contar
    cont = 0
    # recorrer la lista de cadenas
    for cadena in lista:
        # Si la cadena tiene una longitud mayor de 'longitud' contarla y si no hago nada
        if len(cadena) > longitud:
            cont += 1
    return cont


print(contarCadenas(["aaa", "bbbb", "ccccc"], 3))
print(contarCadenas(["aaa", "bbbb", "ccccc"], 2))


# Cread una función a la que le pasamos una lista de cadenas y nos devuelve True si
# alguna de las cadenas tiene una 'j'
# tieneJ(["aa","bb"])->False   tieneJ(["aa","bb","ajo"])->True

def tieneJ(lista):
    # recorrer la lista
    for cadena in lista:
        # si la cadena tiene una j devuelvo true si no tiene NO HAGO NADA
        if "j" in cadena:
            return True
    # si al final ninguna ha tenido una j devolvemos false
    return False


print(tieneJ(["aa", "bb"]))
print(tieneJ(["aa", "bb", "ajo"]))


# Crea una función a la que le pasamos una lista de cadenas y me devuelva la más larga
# si hay varias cadenas con la misma longitud, la primera
# masLarga(["aa","eeeee","bbb"])->"eeeee"

# en algún sitio guardaré la cadena más larga
# recorrer la lista
# si la cadena que estoy mirando es más larga que la que ya tengo me quedo con ella

def masLarga(lista):
    larga = ""
    for cadena in lista:
        # Aquí está la magia
        if len(cadena) > len(larga):
            larga = cadena

    return larga

Ejercicios listas

# Cread una función a la que le pasamos un cantidad y nos devuelve una lista con
# esa cantidad de la cadena "hola" repetidas
# crearHolas(4)->["Hola","Hola","Hola","Hola"]


# tengo la siguiente función que me calcula la media de una lista
def media(lista):
    suma = 0
    for numero in lista:
        suma += numero
    return(suma / len(lista))

# Cread una función mediaAprobados que nos calcule la media pero solo de aquellos números
# que son >=5

# Cread una función a la que le pasemos una lista de cadenas y una longitud y nos diga
# cuantas cadenas son mayores de esa longitud
# contarCadenas(["aaa","bbbb","ccccc",3)->2



# Cread una función a la que le pasamos una lista de cadenas y nos devuelve True si
# alguna de las cadenas tiene una 'j'
# tieneJ(["aa","bb"])->False   tieneJ(["aa","bb","ajo"])->True

Ejemplos listas

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

# Calcula media
suma = 0
for nota in notas:
    suma += nota
print(suma / len(notas))

# Si mas o igual a 5 es aprobado cuantos aprobados tenemos
aprobados = 0
for nota in notas:
    if nota >= 5:
        aprobados += 1

print(aprobados)

# Crea una lista con las notas de los suspendidos
suspendidos = []
for nota in notas:
    if nota < 5:
        suspendidos.append(nota)

print(suspendidos)