# 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
Categoría: Python
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]
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)
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)
Listas en python
# listas: colección de variables nota = 7 # Una variable en la que guardo un valor notas = [5, 8, 6, 4] # Una lista es una colección de variables vacia = [] foo = ["hola"] varios = ["a", "b", "c"] mixta = [1, 4, "cadena", False, 3.56, "otra cadena", 28] # Los elementos pueden ser de cualquier tipo print(mixta[2]) # cadena print(mixta[-1]) # 28 (el último) for elemento in mixta: print(elemento) print(mixta[2:4]) print(mixta[2:5]) print(mixta[2:3]) clase = ["Ana", "Pep", "Eva", "Iu"] # la variable alumno va a ir tomando los valores de la lista 'clase' # es decir, primero Ana, después Pep, luego Eva y por último Iu for alumno in clase: print(alumno) # Mutables: que se pueden cambiar clase[1] = "Juan" print(clase) # Métodos de las listas # append añade un elemento al final de la lista clase.append("Rosa") print(clase) # extend nos añade una lista al final de otra lista otraclase = ["John", "Mary"] clase.extend(otraclase) print(clase) # también podemos hacerlo simplemente sumando otraclasemas = ["Luis", "María"] clase += otraclasemas print(clase) # el append también se puede hacer sumando pero ¡ojo! entre corchetes clase += ["Fernando"] print(clase) # Podemos insertar un elemento en cualquier posición con insert clase.insert(2, "Florencia") # ¡Ojo! No es lo mismo insertar que cambiar. Añado Florencia y el resto se desplaza print(clase) # Eliminamos la primera ocurrencia de Florencia clase.remove("Florencia") print(clase) # Extraer elementos # Estoy extrayendo el último elemento y lo estoy guardando en último ultimo = clase.pop() print(ultimo) print(clase) # Puedo hacer pop sin guardar, simplemente elimino el último elemento clase.pop() print(clase) # pop puede tener como parámetro una posición al = clase.pop(3) # extraigo el elemento 3 (Iu) print(al) print(clase) for i in range(len(clase)): clase.pop() print(clase)
Soluciones ejercicios
# Cread una función a la que le pasamos dos cadenas y nos devuelve la cadena más larga # si son iguales nos devuelve la primera # masLarga("hola","adios")-> "adios" def masLarga(cadena1, cadena2): if len(cadena1) >= len(cadena2): return cadena1 else: return cadena2 print(masLarga("hola", "adios")) # Cread una función que nos devuelva True si la cadena empieza y acaba por la misma letra, False en caso contrario # mismoInicioFin("hola")->False mismoInicioFin("ajada")->True def mismoInicioFin(cadena): return cadena[0] == cadena[-1] # if cadena[0]==cadena[-1] return True else: return False def mismoInicioFinOtro(cadena): if cadena[0] == cadena[-1]: return "Empiezan y acaban por la misma letra" else: return "Tiene inicio y fin distinto" print(mismoInicioFin("hola")) print(mismoInicioFin("ajada")) print(mismoInicioFinOtro("ajada")) # Cread una función a la que le pasemos una cadena y nos reemplace todas las 'l' por un '1' # y todas las 'e' por '3' independientemente de si son mayúsculas o minúsculas # numerizar("leche")->"13ch3" def numerizar(cadena): cadena = cadena.lower() cadena = cadena.replace("l", "1") cadena = cadena.replace("e", "3") return cadena def numerizarCompacto(cadena): cadena = cadena.lower().replace("l", "1").replace("e", "3") return cadena print(numerizarCompacto("leche")) # Cread una función a la que le pasemos una cadena y nos devuelva la cadena invertida # alreves("hola")->"aloh" def alreves(cadena): resultado = "" for letra in cadena: resultado = letra + resultado return resultado def alrevesNinja(cadena): return cadena[::-1] cadena = "en un lugar de la mancha" print(cadena[2:5]) print(cadena[:10]) print(cadena[:]) print(cadena[2:5:2]) # el primer número es el inicio. El segundo el final. El tercero el paso print(cadena[:10:2]) # Si no pongo el primero se entiende que desde el principio print(cadena[::3]) # Si no pongo tampoco el segundo se entiende que hasta el final print(cadena[::-1]) print(alreves("hola")) print(alrevesNinja("hola")) # Cread una función que nos diga si en una cadena hay letras repetidas consecutivas # repetidas("hola que tal")-> False repetidas("sevilla")->True def repetidas(cadena): anterior = "" for letra in cadena: # si la letra es igual a la anterior devuelvo True[ if letra == anterior: return True # Guardo en anterior la letra actual, que será la anterior del siguient paso del bucle anterior = letra # He recorrido toda la cadena y no he encontrado una letra repetida, devuelvo False return False def repetidasDos(cadena): # Ir desde el 1 hasta el final de la cadena # Porque antes del 0 no hay letra for i in range(1, len(cadena)): if cadena[i] == cadena[i - 1]: return True return False print(repetidasDos("sevilla")) print(repetidasDos("hola que tal"))
Ejercicios cadenas
# Cread una función a la que le pasamos dos cadenas y nos devuelve la cadena más larga # si son iguales nos devuelve la primera # masLarga("hola","adios")-> "adios" # Cread una función que nos devuelva True si la cadena empieza y acaba por la misma letra, False en caso contrario # mismoInicioFin("hola")->False mismoInicioFin("ajada")->True # Cread una función a la que le pasemos una cadena y nos reemplace todas las 'l' por un '1' # y todas las 'e' por '3' independientemente de si son mayúsculas o minúsculas # nnumerizar("leche")->"13ch3" # Cread una función a la que le pasemos una cadena y nos devuelva la cadena invertida # alreves("hola")->"aloh" # Cread una función que nos diga si en una cadena hay letras repetidas consecutivas # repetidas("hola que tal")-> False repetidas("sevilla")->True
Ejemplos funciones de cadena
# podemos definir nuestras propias funciones # pero python tiene muchas funciones predefinidas cadena = "Hola que tal" print(len(cadena)) # Funciones de cadena: nos permiten manipular cadenas de texto # Acceder a un carácter específico de la cadena o a un rango de caracteres print(cadena[3]) # imprime la letra 'a' # Con los dos puntos obtenemos una subcadena de la cadena desde el primer carácter hasta el último NO INCLUÍDO print(cadena[3:7]) # imprime 'a qu' va del 3 al 6 (incluído) for i in range(0, len(cadena) + 1): print(cadena[0:i]) mayusculas = cadena.upper() print(mayusculas) minusculas = cadena.lower() print(minusculas) print(cadena.title()) # Si una cadena está dentro de otra print("que" in cadena) print("pepe" in cadena) # Nos busca la posición de una cadena dentro de otra # Si no está nos devuelve -1 posicion = cadena.find("que") print(posicion) posicion = cadena.find("pepe") print(posicion) # Podemos reemplazar una cadena por otra print(cadena.replace("que", "ke")) print(cadena.replace("a", "@")) print(cadena.replace("a", "")) # Podemos indicar las veces que queremos reemplazar cadena = "patatas para ana" print(cadena.replace("a", "@", 3)) cadena = " hola que tal " # con strip quito espacios del principio y del final print(cadena.strip().upper()) # encadenamiento y funciona porque las funciones devuelven un valor sinespacios = cadena.strip() mayus = sinespacios.upper() print(mayus) # en una cadena reemplazar las A por @ independentemiente de mayúsculas o minúsculas cad = "CADA PATATA tiene carbohidratos" print(cad.lower().replace("a", "@")) some_string = 'Hello World' print('Testing a String') print('-' * 20) print('some_string', some_string) print("some_string.startswith('H')", some_string.startswith('H')) print("some_string.startswith('h')", some_string.startswith('h')) print("some_string.endswith('d')", some_string.endswith('d')) print('some_string.istitle()', some_string.istitle()) print('some_string.isupper()', some_string.isupper()) print('some_string.islower()', some_string.islower()) print('some_string.isalpha()', some_string.isalpha()) print('String conversions') print('-' * 20) print('some_string.upper()', some_string.upper()) print('some_string.lower()', some_string.lower()) print('some_string.title()', some_string.title()) print('some_string.swapcase()', some_string.swapcase()) print('String leading, trailing spaces', " xyz ".strip())