# bucle anidado: bucle dentro de otro bucle
def palabrascon2A(cadena):
res=[]
for palabra in cadena.split():
cont=0
for i in palabra:
if i == "a":
cont+=1
if (cont==2):
res.append(palabra)
return res
print(palabrascon2A("hola que tal hacia mañana"))
def contarLetra(palabra,letra):
cont=0
for l in palabra:
if l==letra:
cont+=1
return cont
def palabrasConLetrasContadas(cadena,letra,cantidad):
res=[]
for palabra in cadena.split():
if contarLetra(palabra,letra)==cantidad:
res+=[palabra]
return res
print(palabrasConLetrasContadas("ojo con los monstruos horrososo","o",2))
Ejemplos datos
cadena="holi"
tupla=(1,2,3)
lista=[1,2,3]
diccionario={"a":1,"b":2}
conjunto={1,2,3}
print(tupla[0])
for i in tupla:
print(i)
a,b,c=tupla # desempaquetado
print(a,b,c)
def extremos(lista):
menor=lista[0]
mayor=lista[0]
for numero in lista:
if numero<menor:
menor=numero
if numero>mayor:
mayor=numero
return (menor, mayor)
print(extremos([2,23,4,5,23,5,23,9,67,4]))
menor,mayor=extremos([2,23,4,5,23,5,23,9,67,4])
ana,pepe=extremos([2,23,4,5,23,5,23,9,67,4])
print("menor",menor)
print("mayor",mayor)
Ejemplos for
# for en python es muy sencillo, solo recorre cosas
lista=[1,2,3,4]
for i in lista:
print(i)
for letra in "hola":
print(letra)
for numero in range(10):
print(numero)
for n in range(1,11):
print(n)
for n in range(10,1000,10):
print(n)
tupla=(4,8,1)
for t in tupla:
print(t)
diccionario={"nombre":"Ana","nota":6}
for d in diccionario:
print(d)
for v in diccionario.values():
print(v)
for j in diccionario.items():
print(j)
print(list(range(1,11)))
# recorrer una lista de numeros y sumarla
total=0
for n in lista:
total+=n
print(total)
# recorrer una lista de numeros y sumarla si son pares
total=0
for n in lista:
if n%2==0:
total+=n
print(total)
# recorrer una cadena y contar las 'a'
contador=0
for letra in "hola que tal":
if letra=='a':
contador+=1
print(contador)
Ejercicios listas
# funcion pivote de una lista de números nos divide la lista en 2 partes
# primero los menores del número que pasemos y por otra los mayores
# pivote([4,1,9,5,3,7],6)->([4,1,5,3],[9,7])
def pivote(lista,numero):
menores=[]
mayores=[]
for i in lista:
if i<numero:
menores.append(i)
else:
mayores.append(i)
return(menores,mayores)
print(pivote([4,1,9,5,3,7],5))
# definir la función con los parámetros def pivote(lista,numero)
# saber que tengo que devolver ¿un número? p. ej. un total, una cuenta, un promedio..
# ¿Una lista? los que cumplen una condicion, un filtro
# ¿Una tupla con diferentes valores? (menores,mayores)
# son una lista pues lo tengo que definir.
# Cualquier cosa que vaya a devolver la tengo definir: total, res, menores, mayores...
# recorrer la lista de numeros, de palabras, de lo que sea
# Con cada uno de los elementos de la lista tenemos que hacer algo
# sumarlo, contarlo, añadirlo, transformarlo
# Si cumple alguna condicion: es par, si es mayor si es algo...
# sacar todos lo anagramas de una palabra
# mar->amr arm mar mra ram rma
# vamos a crear una función a la que pasamos una lista de números y nos diga cuantos
# pares hay contarPares([1,2,3,4])->2
def contarPares(lista):
cont=0
for numero in lista:
# que condicion es relevante aquí: numero sea par
if numero%2==0:
cont+=1
return cont
print(contarPares([1,5,7,9]))
# Una función palabras con a a la que le pasamos una cadena y nos devuelve
# la lista de palabras que tienen una a
# palabrasConA('hola que tal')->['hola','tal']
def palabrasConA(cadena):
res=[]
for palabra in cadena.split():
# si la palabra tiene una a la añado a res
if 'a' in palabra:
res+=[palabra]
return res
print(palabrasConA('hola que tal'))
def palabrasconA2(cadena):
res=[]
for palabra in cadena.split():
for i in palabra:
if i == "a":
res.append(palabra)
break
return res
print(palabrasconA2("hola que tal mejor mañana"))
Ejercicios ifs
# Vamos a hacer una función que calcule el PVP de un producto
# le pasamos el precio, el tipo y si está en oferta o no
# Tenemos que devolver:
# Si el tipo es reducido el iva es un 10% en cualquier otro caso es un 21%
# Si está en oferta hacemos un descuento del 5%
def PvP(precio,tipo,oferta=False): # precio de un producto es el precio mas el iva menos el descuento
if tipo=='reducido':
iva=precio*0.1
else:
iva=precio*.21
if oferta:
descuento=precio*.05
else:
descuento=0
return precio+iva-descuento
print(PvP(100,'normal',True))
print(PvP(100,'normal'))
# vamos a hacer una función a la que le pasamos un tipo de bono
# un tipo de cliente y una cantidad y nos calcule el precio de acuerdo a lo siguiente
# bono=vip precio=3000
# bono=extra precio=2000
# bono=normal precio=1000
# tipo cliente= standard, el precio no cambia
# tipo cliente=premium, el precio es la mitad
def precioBono(cantidad,bono,cliente): # precio por cantidad
if bono=='vip':
precio=3000
elif bono=='extra':
precio=2000
else:
precio=1000
if cliente=='premium':
precio/=2
return precio*cantidad
# por defecto el bono sea normal y el cliente tambien
# los parámetros por defecto siempre al final
def precioBono2(cantidad,bono='normal',cliente='normal'): # precio por cantidad
if cliente=='premium':
coeficiente=.5
else:
coeficiente=1
if bono=='vip':
precio=3000
elif bono=='extra':
precio=2000
else:
precio=1000
return precio*cantidad*coeficiente
print(precioBono2(1))
Ejercicios corregir código
# esta función, en teoría, cuenta el número de pares que hay en la lista
# ¿Funciona? Si es que no por qué y como arreglarlo
def contarPares(lista):
total=0
for i in lista:
if total%2==0:
total+=i
return total
lista=[2,3,4,5,6]
print(contarPares(lista)) #debería imprimir 2
# esta funcion nos debería devolver las palabras más largas de un numero
def palabrasLargas(cadena, numero):
res=[]
for palabra in cadena:
if len(palabra)>=numero:
res+=[palabra]
return res
cadena="Hola mi amigo piensa un poco"
print(palabrasLargas(cadena,5)) # ['amigo','piensa']
def separarParidad(lista):
pares=[]
impares=[]
for numero in lista:
if numero%2==0:
impares.append(numero)
else:
pares.append(numero)
return (pares, impares)
print(separarParidad([1,2,3,4,5])) # ([2,4],[1,3,5])
Ejemplo test unitario
def acceso(departamento,categoria):
res=False
if departamento=='gerencia':
res=True
if departamento=='administracion' and categoria=='mando intermedio':
res=True
if departamento=='marketing' and categoria=='mando intermedio' or categoria=='jefe de proyecto':
res=True
return res
El test:
from unittest import TestCase
from acceso import acceso
class Test(TestCase):
def test_acceso(self):
test = acceso('gerencia', 'jefe de proyecto')
self.assertTrue(test)
test = acceso('gerencia', 'becario')
self.assertTrue(test)
test = acceso('administracion', 'becario')
self.assertFalse(test)
test = acceso('administracion', 'mando intermedio')
self.assertTrue(test)
test = acceso('administracion', 'jefe de proyecto')
self.assertFalse(test)
Ejemplo test unitario
def cuadrado(lado=1):
return lado**2
def rectangulo(lado1,lado2):
return lado1*lado2
El test:
from unittest import TestCase
import areas
class Test(TestCase):
def test_cuadrado(self):
resultado = areas.cuadrado(1)
self.assertEqual(resultado, 1)
resultado = areas.cuadrado(3)
self.assertEqual(resultado, 9)
resultado = areas.cuadrado(10)
self.assertEqual(resultado, 100)
def test_rectangulo(self):
resultado=areas.rectangulo(2,3)
self.assertEqual(resultado,6)
resultado = areas.rectangulo(0, 3)
self.assertEqual(resultado, 0)
resultado = areas.rectangulo(20, 3)
self.assertEqual(resultado, 60)
Ejemplos manejo de errores
try:
num = input("Ingrese un número: ")
print(num)
num=int(num)
print(num)
resultado = 10 / num
print(resultado)
except Exception as e:
print(f"Ocurrió una excepción no manejada: {e}")
else:
print("esto se imprime si va bien")
# cualquier código lo podemos 'envolver' dentro de un
# try:
#...
# except Exception as e:
# Y si sucede un error salta a except
# sintaxis del C
# java, c++, c#, php, js...
# try catch if (){...}
# python NO TIENE la sintaxis del C
Soluciones fechas
# PENSAR -> ¿Cómo lo haría yo? ¿Cómo le explico al ordenador como lo haría yo?
# divide y vencerás: Todo problema está hecho de problemas más pequeños
# PRACTICAR y practicar y practicar MAS QUE LEER
import datetime
# Crear una función cuanto_falta que nos devuelva los dias que faltan para el fin de
# semana. Si ya es fin de semana devolvemos 0 (es mucho más fácil de lo que parece)
# cuanto_falta(fecha) -> dias hasta el siguiente fin de semana
# saber el día de la semana weekday (0-lunes y 6 domingo)
# 0 lunes faltan 5 0+5=5
# 1 martes faltan 4 1+4=5
#... 4 viernes falta 1 4+1=5 5-weekday
# 5 sabado faltan 0
# 6 domingo 0
def cuanto_falta(fecha):
dia_semana=fecha.weekday()
if dia_semana>=5: # in [5,6]
return 0
else:
return 5-dia_semana
print(cuanto_falta(datetime.date(2023,10,16)))
# Crear una función primero_de_mes a la que le pasemos un año y nos devuelva una lista
# de fechas del 1 de cada mes de ese año:
#
# primero_de_mes(2024) -> ['2024-01-01'.'2024-02-01',...'2024-12-01']
# ¿Cómo creo yo una fecha a partir de numeros?
# datetime.date(año,mes,dia) año->check me lo pasan dia->check siempre es 1
# ¿mes? del 1 al 12 ¿Se hacer un bucle del 1 al 12? for i in range(1,13)
# crear una lista lista vacia: []
# añado a la lista: append
# ¿Cuantas fechas tengo que crear? 12 una por cada mes
def primero_de_mes(anyo):
res=[]
for i in range(1,13):
res.append(datetime.date(anyo,i,1))
return res
print(primero_de_mes(2023))
# Crear una funcion fines_de_semana a la que le pasemos un año y un mes y nos devuelva
# una lista con todos los fines de semana:
#
# fines_de_semana(10,2023) -> ['2023-10-01','2023-10-07','2023-10-08',...,'2023-10-29']
# me recorro todos los dias de ese mes y si es fin de semana lo añado a la lista
# empiezo por el 1 del mes de ese año, voy sumando un día en un bucle y si el dia es fin
# de semana lo añado a la lista
# crear una fecha a partir de año mes y dia
# sumar un dia a una fecha? + timedelta(days=1)
# se si es fin de semana? si el weekday es 5 o 6
# febrero tego que ir del 1 al 28 ¿Cómo lo se yo?
# lista con los dias del mes [31,28,31,30,31,30,31,31,30,31,30,31]
# el bucle lo hago añadiendo un día, 2023-2-27, 2023-2-28,2023-3-1
# 2023-10-29,2023-10-30,2023-10-31,2023-11-1
# mientras el mes de mi fecha sea el mes que me han pasado sigo en el bucle
# en cuanto sea diferente paro
def fines_de_semana(mes,anyo):
fecha=datetime.date(anyo,mes,1)
res=[]
while fecha.month==mes:
if fecha.weekday() in [5,6]:
res.append(fecha)
fecha+=datetime.timedelta(days=1)
return res
print(fines_de_semana(10,2023))