# Hemos visto en muchos ejercicios que recorrer y procesar una lista es habitual
# En python tenemos la comprension de listas
# [expresión for elemento in iterable]
cuadrados = [x ** 2 for x in range(1, 10)]
print(cuadrados)
# Hace exactamente lo mismo que esto
cuadrados = []
for x in range(1, 10):
cuadrados.append(x ** 2)
letrasdobles = [letra * 2 for letra in "hola que tal"]
print(letrasdobles)
notas = [4, 15, 7, 19, 12]
notas10 = [nota / 2 for nota in notas]
print(notas10)
notascopia = [nota for nota in notas]
print(notascopia)
# tabla de multiplicar del 7 (7,14,21,...,70)
tabla7 = [x * 7 for x in range(1, 11)]
print(tabla7)
# Añadir una condición: seleccionar lo elementos del iterable que cumplan una determinada condición
# [expresion for elementi in interable if condicion]
# Buscamos los que sean pares (x%2==0)
pares = [x for x in range(1, 11) if x % 2 == 0]
print(pares)
# Las cadenas de una determinada longitud
cadenas = ["a", "bb", "ccc", "dddd", "eeeeee", "fffffff"]
largas = [cadena for cadena in cadenas if len(cadena) > 4]
print(largas)
# Buscamos las notas aprobadas (>10) y además las transformamos
notas10aprobadas = [nota / 2 for nota in notas if nota >= 10]
print(notas10aprobadas)
# Operador ternario: Igual que un if pero en vez de controlar el flujo
# devuelve un valor dependiendo de la condicion
# valor_si_cierto if condicion else valor_si_falso
numero = 27
espar = "par" if numero % 2 == 0 else "impar"
print(espar)
if numero % 2 == 0:
espar = "par"
else:
espar = "impar"
ciudad = "Logroño"
envio = 5 if ciudad == "Barcelona" else 10
print(envio) # 10
def calculoEnvio(ciudad):
return 5 if ciudad == "Barcelona" else 10
print(calculoEnvio("Barcelona")) # 5
# Podemos usar como expresión un operador ternario
notasCorte = ["Aprobada" if nota >= 10 else "Suspendida" for nota in notas]
print(notasCorte)
longitudes = ["corta" if len(cadena) < 4 else "larga" for cadena in cadenas]
print(longitudes)
# Todo junto
numeros = [1, 4, -5, 7, -2, 20]
# A los números positivos si es par lo duplicamos y si es impar lo elevamos al cuadrado
calculo = [numero * 2 if numero % 2 == 0 else numero ** 2 for numero in numeros if numero >= 0]
print(calculo)
# nucleo que es recorer una lista
# for elemento in iterable: for numero in numeros
# Parte derecha yo puedo poner una condición: ejemplo if numero>=0 (los positivos) [1,4,7,20]
# parte izquierda pongo una expresión puede ser numero en cuyo caso no hacemos ninguna transformación
calculo = [numero for numero in numeros if numero >= 0]
print(calculo)
# Una expresión sencilla, por ejemplo, elevar al cubo
calculo = [numero ** 3 for numero in numeros if numero >= 0]
print(calculo)
# Liarme la manta a la cabeza y usar un operador ternario, en este caso
# si es par duplicamos, si es impar elevamos al cubo
# en el operador ternario hacemos lo mismo, empezamos por el núcleo, la condición
# if numero%2==0
# en la parte derecha ponemos lo que devolvemos si NO se cumple la condición numero**2
# en la parte izquierda ponemos lo que devolvemos si SÍ se cumple numero*2
# numero * 2 if numero % 2 == 0 else numero ** 2
# Juntando todo obtengo lo siguiente:
calculo = [numero * 2 if numero % 2 == 0 else numero ** 2 for numero in numeros if numero >= 0]
print(calculo)
frases = ["hola", "que tal", "epanadiplosis", "Bu", "En un lugar de la mancha", "otorrinolaringologo"]
# Vamos a hacer un código que filtre las palabras con una longitud mayor de 4
# Si tienen un espacio dejamos la cadena, si no tienen ningún espacio ponemos "No es frase"
# yo empiezo por el núcleo que siempre es recorrer la lista
filtro = [frase for frase in frases]
# puesto que ni filtro ni pongo expresión lo siguiente me devuelve la propia lista
print(filtro) # ["hola", "que tal", "epanadiplosis", "Bu", "En un lugar de la mancha", "otorrinolaringologo"]
# Aplico la condición, la longitud debe ser mayor de 4
filtro = [frase for frase in frases if len(frase) > 4]
print(filtro) # ["que tal", "epanadiplosis", "En un lugar de la mancha", "otorrinolaringologo"]
# Ahora tengo que construir el operador ternario que, si tiene un espacio me devuelve la frase
# Y si no lo tiene me devuelve "No hay frase2
# Empiezo por el núcleo
# if " " in frase
# Si se cumple: devuelvo frase
# Si no se cumple: devuelvo "No es frase"
# frase if " " in frase else "No es frase"
# Meto el operador ternario en lo que tenía antes
filtro = [frase if " " in frase else "No es frase" for frase in frases if len(frase) > 4]
print(filtro) # ['que tal', 'No es frase', 'En un lugar de la mancha', 'No es frase']
Autor: Juan Pablo Fuentes
Formador de programación y bases de datos
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
Vídeo última sesión
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