# 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())