Restructure content and add notes from HolaMundo

Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
2023-05-20 09:36:26 +02:00
parent 64ed03f811
commit f4e9797c4b
430 changed files with 889 additions and 24 deletions

View File

@@ -0,0 +1,34 @@
"""
Métodos, ayuda y documentación
"""
dic = {'clave1': 100, 'clave2': 500}
a = dic.popitem()
print(a)
print(dic)
# Ejercicio 1
exer1 = ",:_#,,,,,,:::____##Pyt%on_ _Total,,,,,,::#".lstrip(",:%_#")
print(exer1)
# Ejercicio 2
frutas = ["mango", "banana", "cereza", "ciruela", "pomelo"]
frutas.insert(3, "naranja")
print(frutas)
# Ejercicio 3
marcas_smartphones = {"Samsung", "Xiaomi", "Apple", "Huawei", "LG"}
marcas_tv = {"Sony", "Philips", "Samsung", "LG"}
conjuntos_aislados = marcas_smartphones.isdisjoint(marcas_tv)
print(conjuntos_aislados)

View File

@@ -0,0 +1,32 @@
"""
funciones
"""
# Simpple
def suma5(nombre):
"""
Esto es una función para decir hola
"""
print("Hola! " + nombre)
name = input("Dime tu nombre: ")
for i in range(5):
suma5(name)
# return
def sumar(num1,num2):
total = num1 + num2
return total
resultado = sumar(10,5)
print(resultado)
# Ejercicio de codificación
def invertir_palabra(palabra):
reverso = palabra[::-1]
return reverso
print(invertir_palabra("Python").upper())

View File

@@ -0,0 +1,61 @@
"""
funciones Dinamicas
"""
# Simple, comprobar numeros de 3 cifras
def chequear_3_cifras(numero):
return numero in range(100,1000)
suma = 347 + 231
resultado = chequear_3_cifras(suma)
print(resultado)
# Comprobar de listas si los numeros tienen 3 cifras
# return hará que se pare el bucle, como un break
def chequear_3_cifras_listas(lista):
for n in lista:
if n in range(100,1000):
return True
else:
pass
# Para que el return false funcione bien debería estar indentado aquí
lista_num = [1,34,21,15,23,2000]
comprobacion = chequear_3_cifras_listas(lista_num)
print(comprobacion)
## Siendo falso dará un tipo None
print(type(comprobacion))
## No tenía un return False
# Ejercicio comprobar positivos
def todos_positivos(lista):
for n in lista:
if n < 0:
return False
else:
pass
return True
lista_posibles_pos = [13,234,5343,7276,-1]
print(todos_positivos(lista_posibles_pos))
# Ejercicio sumar numeros entre 0 y 1000
def suma_menores(lista):
resultado2 = 0
for num in lista:
if num > 0 and num < 1000:
resultado2 += num
else:
pass
return resultado2
lista_numeros = [13,234,5343,7276,-1]
ver = suma_menores(lista_numeros)
print(ver)

View File

@@ -0,0 +1,34 @@
"""
Ejemplo de función
"""
# Para desempacar tuples sin funciones
# por ejemplo, para saber el costo de los precios
precios_cafe = [('capuchino',1.5),('expresso',2.2),('moka',1.9)]
for cafe,precio in precios_cafe:
print(precio * 0.45)
# Pero para saber cual es el café mas caro no nos sirve
# Debemos usar una función:
def cafe_mas_caro(lista_precios):
precio_mayor = 0
cafe_mas_caro = ''
for cafe,precio in lista_precios:
if precio > precio_mayor:
precio_mayor = precio
cafe_mas_caro = cafe
else:
pass
return(cafe_mas_caro, precio_mayor)
## Podemos extraer las variables que retorna la función
cafe, precio = cafe_mas_caro(precios_cafe)
print(f"El café más caro es {cafe} con un precio de {precio}")

View File

@@ -0,0 +1,47 @@
"""
Interacción entre funciones
Programa "Escoge un palito"
"""
from random import shuffle
# Lista inicial y presentación
palitos = ['-','--','---','----']
print("¡Hola!\n")
print(f"Tenemos estos palitos:")
for palito in palitos:
print(palito)
print("\nVamos a mezclarlos y a relacionarlos con un número.\n")
# Mezclar palitos
def mezclar(lista):
shuffle(palitos)
return lista
# Pedir al usuario intento
def probar_suerte():
intento = ''
while intento not in ['1','2','3','4']:
intento = input("Elige un número del 1 al 4: ")
if intento not in ['1','2','3','4']:
print("\nError: Ingresa un valor válido\n")
else:
pass
return int(intento)
# Comprobar intento
def chequear_intento(lista,intento):
if lista[intento - 1] == '-':
print("¡Cogiste el palito más corto!\n")
else:
print("Lo siento, no es el más corto: \n")
print(lista[intento-1])
print()
# Invocamos las funciones
palitos_mezclados = mezclar(palitos)
seleccion = probar_suerte()
chequear_intento(palitos_mezclados, seleccion)

View File

@@ -0,0 +1,59 @@
"""
Interacción entre funciones
LANZAR DOS DADOS
"""
from random import randint
# Función para obtener dos valores aleatorios
# entre el 1 y el 6
def lanzar_dados():
dado1 = randint(1, 6)
dado2 = randint(1, 6)
return dado1, dado2
# Función para evaluar la tirada
def evaluar_jugada(num1, num2):
suma_dados = num1 + num2
text1 = "La suma de tus dados es "
if suma_dados <= 4:
suma_dados = str(suma_dados)
mensaje = text1 + suma_dados + ". \nLamentable\n"
elif suma_dados > 4 and suma_dados <= 7:
suma_dados = str(suma_dados)
mensaje = text1 + suma_dados + ". \nBueno... esta bien.\n"
elif suma_dados > 7 and suma_dados < 10:
suma_dados = str(suma_dados)
mensaje = text1 + suma_dados + ". \nBuena tirada!\n"
else:
suma_dados = str(suma_dados)
mensaje = text1 + suma_dados + ". \nParece una jugada ganadora\n"
return mensaje
# Presentación
print("¡Vamos a tirar los dados!\n")
bandera = 's'
while bandera.lower() != "n":
# Control de flujo
if bandera.lower() == 's':
# Recogida de los valores
n1, n2 = lanzar_dados()
resultado = evaluar_jugada(n1, n2)
print(f"{resultado}")
elif bandera.lower() != 'n' or bandera.lower() != 's':
print("¿Que me estás contando?\n\t Sí ---> s\n\t No ---> n")
bandera = 's'
else:
print("\n¡Ciao!")
break
# Pregunta si quieres seguir jugando
bandera = input("¿Quieres tirar de nuevo? (s/n) ")

View File

@@ -0,0 +1,44 @@
lista_numeros = [1, 2, 15, 7, 2, 3]
def reducir_lista(lista):
lista.sort()
lista_limpia = set(lista)
max_value = max(lista_limpia)
lista_limpia.remove(max_value)
return lista_limpia
def promedio(lista):
total = 0
for x in lista:
total += x
resultado = total / len(lista)
return resultado
lista2 = reducir_lista(lista_numeros)
media = promedio(lista2)
print(f"La lista limpia es {lista2}")
print(f"El valor medio de la lista resultante es {media}")
# Otra opción de limpiar la lista
def reducir_lista2(lista):
lista.sort()
lista_limpia = []
for n in lista:
if n not in lista_limpia:
lista_limpia.append(n)
max_value = max(lista_limpia)
lista_limpia.remove(max_value)
return lista_limpia
lista3 = reducir_lista2(lista_numeros)
print(f"Otra opción de limpiar la lista: {lista3}")

View File

@@ -0,0 +1,26 @@
from random import choice
def lanzar_moneda():
lista = ['Cara', 'Cruz']
cara_moneda = choice(lista)
return cara_moneda
def probar_suerte(resultado, lista):
if resultado == 'Cara':
print('La lista se autodestruirá')
lista.clear()
elif resultado == 'Cruz':
print("La lista fue salvada")
else:
pass
return lista
lista_numeros = [1, 3, 5, 2, 3, 145]
mon = lanzar_moneda()
mensaje = probar_suerte(mon, lista_numeros)
print(mon, mensaje)

View File

@@ -0,0 +1,172 @@
"""
Argumentos indeterminados
*args ---> Arguments
Para definir funciones que acepten
un número indeterminado de variables
**kwargs ---> Keyword arguments
Definen funciones que acepten
diccionarios. Podemos añadir un número indeterminado
de variables y de key=value
"""
# Ejemplo de *args
# Argumentos args es una tupla, no se puede modificar
def suma(*numeros):
resultado = 0
for numero in numeros:
resultado += numero
return resultado
calculo = suma(24, 45, 22, 43, 454, 23, 12)
print(calculo)
# Ejercicio 1 - Suma cuadrados
def suma_cuadrados(*numeros):
resultado = 0
for numero in numeros:
resultado += numero**2
return resultado
print(suma_cuadrados(1, 2, 3))
# Ejercicio 2 - Suma solo absolutos
def suma_absolutos(*numeros):
resultado = 0
for numero in numeros:
resultado += abs(numero)
return resultado
print(suma_absolutos(1, -2, 3))
# Ejercicio 3 - mezclar variable y *args
def numeros_persona(nombre, *numeros):
suma_numeros = 0
for numero in numeros:
suma_numeros += numero
suma_numeros = str(suma_numeros)
para_devolver = nombre + " la suma de tus números es " + suma_numeros
return para_devolver
print(numeros_persona("Mun", 1, 3, 4, 2, 4))
# Ejemplo de **kwargs - Explicación conceptual
# Cuando pasamos los valores al kwargs
# este lo convierte en diccionario
def suma_dic(**kwargs):
print(type(kwargs))
suma_dic(x=3, y=5, z=2)
# Otro ejemplo
def suma_diccio(**kwargs):
total = 0
for clave, valor in kwargs.items():
print(f"{clave} es igual a {valor}")
total += valor
return total
print(suma_diccio(x=3, y=5, z=2))
# Con lo cual, también podemos añadir
# - Parámetros
# - *args
# - **kwargs
# Y todo en la misma función
# Deberían seguir siempre este orden
def prueba(num1, num2, *args, **kwargs):
print(f'El primer valor es {num1}')
print(f'El segundo valor es {num2}')
for arg in args:
print(f"arg es igual a {arg}")
for clave, valor in kwargs.items():
print(f"{clave} es igual a {valor}")
prueba(15, 50, 100, 200, 300, 400, x='uno', y='dos', z='tres')
# Truco para desempacar listas o tuplas
# Poner los astericos en los argumentos que se le pasa a la función
def la_lista(*lista, **dic):
for arg in lista:
print(f"arg es igual a {arg}")
for clave, valor in dic.items():
print(f"{clave} es igual a {valor}")
para_args = [1000, 2000, 3000, 4000]
kwargs = {'x': 'uno', 'y': 'dos', 'z': 'tres'}
la_lista(*para_args, **kwargs)
# Ejercicio 1 - cantidad de atributos
def cantidad_atributos(**cuentas):
contador = 0
for x in cuentas.items():
contador += 1
return contador
print(len(cuentas))
print(cantidad_atributos(x='color_ojos'))
# Ejercicio 2 - Lista atributos de values
def lista_atributos(**lista):
listado = []
for clave in lista.values():
listado.append(clave)
return listado
print(lista_atributos(x='uno', y='dos', z='tres'))
# Ejercicio 3 -
def describir_persona(nombre, **kwargs):
print(f'Características de {nombre}:')
for nombre_argumento, valor_argumento in kwargs.items():
print(f'{nombre_argumento}: {valor_argumento}')
describir_persona("María", color_ojos="azules", color_pelo="rubio")

View File

@@ -0,0 +1,163 @@
"""
Problemas prácticos
"""
# Ejercicio ############
# Crea una función llamada devolver_distintos() que reciba 3 integers como parámetros.
# Si la suma de los 3 números es mayor a 15, va a devolver el número mayor.
# Si la suma de los 3 números es menor a 10, va a devolver el número menor.
# Si la suma de los 3 números es un valor entre 10 y 15 (incluidos) va a devolver el número de valor intermedio.
def devolver_distintos(num1, num2, num3):
suma = num1 + num2 + num3
lista = [num1, num2, num3]
if suma > 15:
return max(lista)
elif suma < 10:
return min(lista)
else:
lista.sort()
return lista[1]
print(devolver_distintos(6, 5, 3))
# Ejercicio 2 ############
# Escribe una función (puedes ponerle cualquier nombre que quieras)
# que reciba cualquier palabra como parámetro,
# y que devuelva todas sus letras únicas (sin repetir) pero en orden alfabético.
# Por ejemplo si al invocar esta función pasamos la palabra "entretenido",
# debería devolver ['d', 'e', 'i', 'n', 'o', 'r', 't']
def cualquier(palabra):
mi_set = set()
for letra in palabra:
mi_set.add(letra)
lista = list(mi_set)
lista.sort()
return lista
print("\n")
print(cualquier('entretenido'))
print(cualquier('cascarrabias'))
# Ejercicio 3 ############
# Escribe una función que requiera una cantidad indefinida de argumentos.
# Lo que hará esta función es devolver True
# si en algún momento se ha ingresado al numero cero repetido dos veces consecutivas.
# Por ejemplo:
# (5,6,1,0,0,9,3,5) >>> True
# (6,0,5,1,0,3,0,1) >>> False
def me_gustan_los_ceros(*ceros):
contador = 0
for num in ceros:
if num == 0:
contador += 1
if contador == 2:
contador = 0
return True
elif num != 0:
contador = 0
else:
pass
return False
print("\n")
print(me_gustan_los_ceros(5, 6, 1, 0, 0, 9, 3, 5))
print(me_gustan_los_ceros(6, 0, 5, 1, 0, 3, 0, 1))
# Solución curso
def ceros_vecinos(*args):
contador = 0
for num in args:
if contador + 1 == len(args):
return False
elif args[contador] == 0 and args[contador + 1] == 0:
return True
else:
contador += 1
return False
print("\n")
print(ceros_vecinos(5, 6, 1, 0, 0, 9, 3, 5))
print(ceros_vecinos(6, 0, 5, 1, 0, 3, 0, 1))
# Ejercicio 4 ############
# Escribe una función llamada contar_primos() que requiera un solo argumento numérico.
# Esta función va a mostrar en pantalla todos los números primos existentes
# en el rango que va desde cero hasta ese número incluido,
# y va a devolver la cantidad de números primos que encontró.
# Aclaración, por convención el 0 y el 1 no se consideran primos.
def primo(numero):
if numero == 0 or numero == 1 or numero == 4:
return False
for x in range(2, int(numero/2)):
if numero % x == 0:
return False
return True
def primos(rango_max):
rango_max += 1
lista_num = [n for n in range(1, rango_max)]
primos = []
for numero in lista_num:
es_primo = primo(numero)
if es_primo:
primos.append(numero)
contar = len(primos)
rango_max -= 1
print(f"\nEntre 0 y el {rango_max} hay {contar} números primos:")
print(*primos, sep=' ')
primos(1000)
# Solución curso
def contar_primos(numero):
primos2 = [2]
iteracion = 3
if numero < 2:
return 0
while iteracion <= numero:
for n in range(3, iteracion, 2):
if iteracion % n == 0:
iteracion += 2
break
else:
primos2.append(iteracion)
iteracion += 2
print(primos2)
return len(primos2)
print("\n")
print(contar_primos(1000))

View File

@@ -0,0 +1,349 @@
'''
Programa día 5 - Juego del ahorcado
'''
from random import choice
import os
def clearConsole():
# Función limpiar consola
command = 'clear'
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
command = 'cls'
os.system(command)
def palabra_aleatoria():
# Función que guarda palabras en una lista y escoge una aleatoria con choice
lista_palabras = ('Argentina', 'Colombia', 'Guadalupe', 'Herramientas', 'Hogar', 'Murcielago',
'Uruguay', 'abdomen', 'abrelatas', 'abrigo', 'abuelo', 'aburrimiento',
'accion', 'agridulce', 'aguila', 'aguja', 'ahorcado', 'aire',
'alegria', 'Alemania', 'alfabeto', 'alimento', 'alma', 'almacen',
'almendra', 'alto', 'altura', 'amanecer', 'amarillo', 'ambiente',
'ambulancia', 'amiga', 'amigo', 'amor', 'analisis', 'ancho',
'anciano', 'animal', 'anochecer', 'aparato', 'apartamento', 'apoyo',
'araña', 'arbol', 'archiduque', 'area', 'aritmetica', 'arma',
'arroz', 'arte', 'articulo', 'ascensor', 'asiento', 'asociacion',
'aspecto', 'ataque', 'atencion', 'atmosfera', 'atomo', 'atun',
'aumento', 'autobus', 'automovil', 'coche', 'auto', 'autopista',
'autor', 'autoridad', 'avance', 'avena', 'avenida', 'avion',
'ayer', 'ayuda', 'azul', 'año', 'babosa', 'baloncesto',
'bambu', 'barba', 'barco', 'barro', 'lodo', 'base',
'bateria', 'bebe', 'bebida', 'beneficio', 'bicho', 'bigote',
'billete', 'bisabuelo', 'bisnieto', 'blanco', 'boca', 'boleto',
'bolsa', 'bolsillo', 'bolso', 'bomberos', 'bondad', 'bosque',
'boton', 'bragas', 'calzon', 'brazo', 'buey', 'bufanda',
'bus', 'busqueda', 'caballo', 'yegua', 'cabello', 'cabeza',
'cable', 'cabo', 'cadera', 'calamar', 'calcetines', 'calculadora',
'calendario', 'calidad', 'calle', 'calor', 'calzoncillo', 'cama',
'camara', 'camaron', 'cambio', 'camino', 'camisa', 'camiseta',
'campaña', 'campo', 'cansancio', 'cantidad', 'capacidad', 'capital',
'cara', 'caracol', 'caracter', 'caracteristica', 'cargo', 'carne',
'carpeta', 'carrera', 'carretera', 'carta', 'cartera', 'casa',
'casco', 'caso', 'castaña', 'castaño', 'causa', 'cebada',
'celeste', 'celular', 'centimetro', 'cerdo', 'cerebro', 'cero',
'cerradura', 'cerro', 'monte', 'montaña', 'cesped', 'chaqueta',
'chino', 'cielo', 'cien', 'ciento', 'ciencia', 'cierre',
'ciervo', 'cinco', 'cine', 'cintura', 'cinturon', 'circulo',
'ciruela', 'ciudad', 'claridad', 'clase', 'clavel', 'clavo',
'clima', 'club', 'cocodrilo', 'codigo', 'codo', 'cola',
'colega', 'colegio', 'color', 'coma', 'comercio', 'comida',
'comienzo', 'comision', 'compañia', 'competencia', 'competicion',
'competencia', 'computadora', 'comunicacion', 'comunidad', 'concepto',
'conciencia', 'condicion', 'conejo', 'conexion', 'confianza', 'conflicto',
'congreso', 'conjunto', 'conocido', 'conocimiento', 'consecuencia', 'consejo',
'constitucion', 'construccion', 'consumo', 'contenido', 'control', 'corazon',
'cordones', 'corriente', 'corte', 'cosa', 'costa', 'creacion',
'crecimiento', 'cremallera', 'criatura', 'crisis', 'cuaderno', 'cuadro',
'cuarto', 'cuatro', 'cucaracha', 'cuello', 'cuenta', 'cuerda',
'cordel', 'cordon', 'cuerpo', 'cuervo', 'cuestion', 'culo',
'cultura', 'curiosidad', 'curso', 'dama', 'dato', 'decada',
'decision', 'decreto', 'dedo', 'defensa', 'demanda', 'democracia',
'departamento', 'deporte', 'derecha', 'derecho', 'desarrollo', 'deseo',
'desierto', 'despejado', 'destino', 'destruccion', 'deterioro', 'dia',
'diagonal', 'diario', 'diarrea', 'dibujo', 'diccionario', 'dictadura',
'diente', 'diez', 'diferencia', 'dinero', 'dios', 'direccion',
'director', 'disposición', 'documento', 'dolor', 'domingo', 'don',
'dormitorio', 'dos', 'doña', 'dragon', 'duda', 'economia',
'edad', 'edificio', 'educacion', 'efecto', 'ejemplo', 'eleccion',
'electricidad', 'elefante', 'elemento', 'elevador', 'empatia', 'empleo',
'empresa', 'encuentro', 'energia', 'enfermedad', 'enojo', 'enfado',
'entorno', 'entrada', 'entretenimiento', 'epoca', 'equipo', 'equivocacion',
'era', 'escalera', 'escritorio', 'escritura', 'escuela', 'escultura',
'esfera', 'esfuerzo', 'espacio', 'espalda', 'español', 'especie',
'espectaculo', 'espectador', 'espera', 'espinilla', 'espiritu', 'esposa',
'esposo', 'esquina', 'estacion', 'parada', 'estado', 'este',
'estilo', 'estomago', 'estrella', 'estructura', 'estruendo', 'estudio',
'etapa', 'existencia', 'exito', 'experiencia', 'expresion', 'extasis',
'exterior', 'fabrica', 'facilidad', 'falda', 'falta', 'familia',
'fase', 'favor', 'fecha', 'ferrocarril', 'figura', 'fin',
'final', 'flor', 'fondo', 'forma', 'formacion', 'formalidad',
'fracaso', 'frances', 'frente', 'fruta', 'fuego', 'fuerza',
'funcion', 'futuro', 'gafas', 'galaxia', 'galleta', 'gallina',
'gas', 'gaseosa', 'gato', 'gente', 'geografia', 'gluteos',
'gobernador', 'intendente', 'alcalde', 'gobierno', 'gorrion', 'grabado',
'grado', 'gramo', 'gripe', 'gris', 'grupo', 'guerra',
'guitarra', 'habitacion', 'halcon', 'harina', 'hermano', 'hielo',
'hierro', 'higado', 'hijo', 'hilo', 'historia', 'hogar',
'hoja', 'hombre', 'hombro', 'hongo', 'hora', 'hotel',
'hoy', 'hueso', 'humanidad', 'humano', 'idea', 'extranjero',
'imagen', 'individuo', 'informacion', 'informatica', 'informe', 'ingles',
'inicio', 'insecto', 'instante', 'instituto', 'intento', 'interes',
'interior', 'interrupcion', 'investigacion', 'izquierda', 'japones',
'jirafa', 'joroba', 'judias', 'guisantes', 'jueves', 'juguete',
'julio', 'kilo', 'kilometro', 'labio', 'lado', 'lagarto',
'laguna', 'lago', 'langosta', 'largo', 'longitud', 'leon',
'ley', 'libertad', 'libro', 'libros', 'limon', 'litro',
'llave', 'llero', 'lluvia', 'logro', 'lombriz', 'loro',
'lugar', 'luna', 'lunes', 'luz', 'madre', 'manantial',
'manera', 'manga', 'mano', 'manzana', 'mar', 'oceano',
'maravilla', 'mariposa', 'marisco', 'marron', 'cafe', 'martes',
'matrimonio', 'mausoleo', 'mayoria', 'mañana', 'medida', 'mediodia',
'mejora', 'memoria', 'mente', 'mentira', 'mercado', 'mes',
'mesa', 'metal', 'metalico', 'metro', 'miedo', 'miercoles',
'mil', 'milenio', 'milimetro', 'millon', 'ministro', 'minoria',
'minuto', 'modo', 'molecula', 'molusco', 'momento', 'moneda',
'mono', 'mosca', 'mosquito', 'movimiento', 'mueble', 'muerte',
'mujer', 'mundo', 'municipio', 'musculo', 'musica', 'muslo',
'muñeca', 'nacimiento', 'nacion', 'naranja', 'naranja', 'anaranjado',
'nariz', 'naturaleza', 'necesidad', 'negro', 'nieto', 'nieve',
'nivel', 'niño', 'noche', 'nombre', 'norma', 'norte',
'notas', 'noticia', 'nublado', 'nueve', 'nuez', 'numero',
'objetivo', 'meta', 'objeto', 'obligacion', 'obra', 'ocasion',
'ocho', 'oeste', 'oficina', 'oido', 'ojo', 'olfato',
'omnibus', 'orden', 'ordenador', 'oreja', 'organizacion', 'origen',
'oro', 'oveja', 'padre', 'pais', 'pajaro', 'palabra',
'palma', 'panel', 'pantalla', 'pantalon', 'papel', 'paraguas',
'parasol', 'pareja', 'parlamentario', 'congresista', 'senador', 'diputado',
'parlante', 'parte', 'partido', 'pasado', 'paso', 'pasto',
'cesped', 'pata', 'patatas', 'papas', 'paz', 'pecho',
'pelusa', 'pensamiento', 'pera', 'percepcion', 'periferia', 'periodico',
'periodismo', 'perjuicio', 'permiso', 'perro', 'persona', 'personalidad',
'peso', 'pez', 'pie', 'piel', 'pierna', 'pilar',
'pino', 'pintura', 'piscina', 'piso', 'placer', 'planeta',
'planta', 'plata', 'platano', 'playa', 'plomo', 'poblacion',
'policia', 'polilla', 'politica', 'politico', 'pomelo', 'pomo',
'posavasos', 'posibilidad', 'posicion', 'potencia', 'precio', 'tarifa',
'pregunta', 'prenda', 'presencia', 'presente', 'presidente', 'primo',
'principio', 'probabilidad', 'problema', 'proceso', 'produccion', 'producto',
'profesion', 'programa', 'progreso', 'prohibicion', 'provincia', 'proyecto',
'pueblo', 'puerta', 'pulpo', 'punto', 'quejido', 'rabano',
'raiz', 'raiz', 'origen', 'fuente', 'rana', 'raton',
'rata', 'rayo', 'razon', 'realidad', 'rectangulo', 'recuerdo',
'reduccion', 'relacion', 'religion', 'representante', 'reproduccion',
'resfriado', 'respuesta', 'resultado', 'retroceso', 'reunion', 'revista',
'rio', 'rodilla', 'rojo', 'ropa', 'rosa', 'rosado', 'ruta',
'sabado', 'sal', 'salchicha', 'saltamontes', 'salud', 'sandia',
'sangre', 'sardina', 'secreto', 'sector', 'secuencia', 'segundo',
'seguridad', 'seis', 'selva', 'jungla', 'semana', 'semilla',
'sensacion', 'sentido', 'ser', 'serie', 'serpiente', 'servicio',
'señor', 'señora', 'siete', 'siglo', 'significado', 'silla', 'simbolo',
'similitud', 'sistema', 'situacion', 'sobrino', 'sociedad', 'sol',
'solapa', 'cuello', 'solicitud', 'solucion', 'sombrilla', 'sonido',
'sorpresa', 'subterraneo, metro', 'suciedad', 'suelo', 'suerte',
'sugerencia', 'sujetador', 'sosten', 'superficie', 'sur',
'sustancia', 'susto', 'tacto', 'tallo', 'talon', 'tamaño', 'tarde',
'tarima', 'telefono', 'televidente', 'tema', 'temor', 'texto',
'tiempo', 'tierra', 'tigre', 'tio', 'tipo', 'tomate', 'tormenta',
'torrefacto', 'total', 'trabajo', 'trafico', 'trancar', 'transaccion',
'transcurso', 'transito', 'transporte', 'trasero', 'tren', 'tres',
'triangulo', 'trigo', 'tristeza', 'trueno', 'tulipan', 'universidad',
'universo', 'uno', 'uso', 'utilizacion', 'utensilio', 'uña', 'vaca',
'vacaciones', 'valor', 'vanidad', 'vapor', 'vaso', 'vegetal',
'vehiculo', 'velocidad', 'ventana', 'verano', 'verdad', 'verde',
'verdura', 'vez', 'via', 'vida', 'vidrio', 'viento', 'viernes',
'villa', 'violeta', 'violin', 'visita', 'vista', 'volumen',
'voz', 'vuelto, cambio', 'xilofonoGente', 'zanahoria',
'region', 'zapatilla', 'zapato', 'zona')
palabra_secreta = choice(lista_palabras).lower()
palabra_secreta = palabra_secreta.replace('á', 'a').replace('é', 'e').replace(
'í', 'i').replace('ó', 'o').replace('ú', 'u')
return palabra_secreta
def mostrar_guiones(palabra_secreta):
# Recibe la palabra de la función anterior.
# Crea los guiones y separa las letras en una lista
clave = 0
dic = {}
rallitas = {}
for i in palabra_secreta:
clave += 1
dic[clave] = i
rallitas[clave] = '-'
return dic, rallitas
def mostrar_letras_acertadas():
cuenta_letra = 0
for k, v in dic_letras.items():
if v == letra_user:
cuenta_letra += 1
dic_guiones[k] = letra_user
else:
pass
if cuenta_letra == 1:
sing_plural = 'letra'
else:
sing_plural = 'letras'
print(f'Desvelamos {cuenta_letra} {sing_plural}: ')
print(*dic_guiones.values(), sep=' ')
print()
def ahorcado_intentos():
if intentos == 6:
print(" ____")
print(" | |")
print(" | ")
print(" | ")
print(" | ")
print("_|_")
elif intentos == 5:
print(" ____")
print(" | |")
print(" | O")
print(" | ")
print(" | ")
print("_|_")
elif intentos == 4:
print(" ____")
print(" | |")
print(" | O")
print(" | |")
print(" | ")
print("_|_")
elif intentos == 3:
print(" ____")
print(" | |")
print(" | O")
print(" | /|")
print(" | ")
print("_|_")
elif intentos == 2:
print(" ____")
print(" | |")
print(" | O")
print(" | /|\\")
print(" | ")
print("_|_")
elif intentos == 1:
print(" ____")
print(" | |")
print(" | O")
print(" | /|\\")
print(" | / ")
print("_|_")
# Limpiar la terminal
clearConsole()
# Mensaje bienvenida
print('\n###################')
print('JUEGO - El ahorcado')
print('###################\n')
# Escoger palabra aleatoria
secret = palabra_aleatoria()
# Extraer diccionario de guiones con el número de letras de la palabra
# Extraer diccionario con letras de la palabra con indice
dic_letras, dic_guiones = mostrar_guiones(secret)
# ############## PRUEBAS
# print(*dic_letras, sep=' ')
# print(*dic_letras.values(), sep=' ')
# Iniciar variable de INTENTOS
intentos = 8
SECRET = secret.upper()
# Instrucciones juego
print(
f'\nTu palabra tiene {len(dic_letras)} letras y tienes {intentos} intentos para acertarla.\n¡Suerte!\n'
)
# Mostrar guiones
print(*dic_guiones.values(), sep=' ')
print()
# Pedir letra a usuario
comando = ''
# listado para letras incorrectas y acertadas
incorrectas = list()
acertadas = list()
while comando.lower() != 'salir':
letra_user = input('Dime una letra: ')
comando = letra_user
# Validar letra
# Comando salir
if letra_user == 'salir':
print('\n\n¡Ciao!\n')
break
# # Letra ya acertada
elif letra_user in acertadas:
print('\nEsa letra ya la acertaste primo...\n')
elif letra_user in incorrectas:
print('\n¡Perdiendo intentos a lo loco! ¡A lo loco!\n')
intentos -= 1
ahorcado_intentos()
print('\nTe quedan {intentos} intentos\n')
# # acierto - Desvelar letra
elif letra_user in dic_letras.values():
print('\n¡Ole!')
acertadas.append(letra_user)
# Mostrar guiones y letras acertadas
mostrar_letras_acertadas()
# # fallo. Restar intentos
else:
intentos -= 1
incorrectas.append(letra_user)
print(f'Lo siento, no has acertado. Te quedan {intentos} intentos\n')
ahorcado_intentos()
print('\nTus errores por ahora: ')
print(*incorrectas, sep=', ')
print()
# Comprobación game over / Win / nuevo intento
if intentos == 0:
clearConsole()
print(" ____")
print(" | |")
print(" | O")
print(" | /|\\ \t\tGAME OVER")
print(" | / \\")
print("_|_")
print(f'\n\nLa palabra era: {SECRET}\n')
break
# Controlar si tiene la palabra correcta
elif '-' not in dic_guiones.values():
clearConsole()
print('\n\n\n\n\n\n\n\t\t\tWIN\t\t\t\n\n\n\n\n\n\n')
print(f'La palabra era: {SECRET}\nTe sobraron {intentos} intentos\n')
break
# Nuevo intento
else:
print("¡Inténtalo de nuevo!")

View File

@@ -0,0 +1,311 @@
# Día 5 - Programa el juego "El ahorcado"
- [Día 5 - Programa el juego "El ahorcado"](#día-5---programa-el-juego-el-ahorcado)
- [5.1. - Documentación](#51---documentación)
- [5.2. - Funciones](#52---funciones)
- [5.3. - return](#53---return)
- [5.4. - Funciones dinámicas](#54---funciones-dinámicas)
- [5.5. - Interacción entre funciones](#55---interacción-entre-funciones)
- [5.6. - \*args](#56---args)
- [5.7. - \*\*kwargs](#57---kwargs)
- [5.8. - Ejercicios](#58---ejercicios)
- [5.8.1. - Ejercicio 1](#581---ejercicio-1)
- [5.8.2. - Ejercicio 2](#582---ejercicio-2)
- [5.8.3. - Ejercicio 3](#583---ejercicio-3)
- [5.8.4. - Ejercicio 4](#584---ejercicio-4)
- [5.9. - Proyecto del Día 5](#59---proyecto-del-día-5)
- [Ficheros y documentación del día 5](#ficheros-y-documentación-del-día-5)
## 5.1. - Documentación
La documentación es nuestra biblioteca de consulta en Python. Al escribir código, es de uso permanentemente para solucionar dudas relacionadas al funcionamiento de métodos y los argumentos que reciben.
Si utilizas PyCharm, sostén el cursor sobre el nombre del método del que deseas obtener información. Se desplegará una ventana flotante.
Esto funcionará en otros IDEs del mismo modo.
![](../img/dia05_01.png)
También, debes mantener cerca la documentación oficial de Python (o Biblioteca Estándar de Python), que contiene toda la información necesaria: https://docs.python.org/es/3.9/library/index.html
No dejes de buscar en Google tus dudas, para hallar una explicación que se ajuste a ti.
## 5.2. - Funciones
Una función es un bloque de código que solamente se ejecuta cuando es llamada. Puede recibir información (en forma de parámetros), y devolver datos una vez procesados como resultado.
Una función es definida mediante la palabra clave **def**
```python
def mi_funcion(argumento):
```
Los argumentos contienen información que la función utiliza o transforma para devolver un resultado
```python
mi_funcion(mi_argumento)
```
Para llamar a una función, basta utilizar su nombre, entregando los argumentos que la misma requiere entre paréntesis.
## 5.3. - return
Para que una función pueda devolver un valor (y que pueda ser almacenado en una variable, por ejemplo), utilizamos la declaración return.
```python
def mi_funcion():
return [algo]
```
La declaración return provoca la salida de la función. Cualquier código que se encuentre después en el bloque de la función, no se ejecutará
```python
resultado = mi_funcion()
```
La variable resultado almacenará el valor devuelto por la función mi_funcion( )
## 5.4. - Funciones dinámicas
La integración de diferentes herramientas de control de flujo, nos permite crear funciones dinámicas y flexibles. Si debemos utilizarlas varias veces, lograremos un programa más limpio y sencillo de mantener, evitando repeticiones de código.
- Funciones
- Loops (for/while)
- Estructuras condicionales
- Palabras clave (return, break, continue, pass)
```python
def mi_funcion(argumento):
for item in ...
if a == b ...
...
else:
return ...
return ...
```
## 5.5. - Interacción entre funciones
Las salidas de una determinada función pueden convertirse en entradas de otras funciones. De esa manera, cada función realiza una tarea definida, y el programa se construye a partir de la interacción entre funciones.
```python
def funcion_1():
|...
|return a
def funcion_2(a):
|...
|return b
def funcion_3(b):
|...
|return c
def funcion_4(a,c):
|...
|return d
```
## 5.6. - *args
En aquellos casos en los que no se conoce de antemano el número exacto de argumentos que se deben pasar a una función, se debe utilizar la sintaxis *args para referirse a todos los argumentos adicionales luego de los obligatorios.
El nombre *args no es mandatorio pero si es sugerido como buena práctica.
Cualquier nombre iniciado en * referirá a estos argumentos de cantidad variable.
La función recibirá los argumentos indefinidos *args en forma de tupla, a los que se podrá acceder o iterar de las formas habituales dentro del bloque de código de la función.
```python
def mi_funcion(arg_1, arg_2, *args):
```
```python
mi_funcion("ejemplo", 25, 40, 75, 10):
```
*arg_1* → "ejemplo"
*arg_2* → 25
*args* = (40, 75, 10)
## 5.7. - **kwargs
Los argumentos con palabras clave (keyword arguments, abreviado kwargs), sirven para identificar el argumento por su nombre, independientemente de la posición en la que se pasen a su función. Si no se conoce de antemano su cantidad, se utiliza el parámetro **kwargs que los agrupa en un diccionario.
Al igual que para *args, el nombre **kwargs no es mandatorio pero si es sugerido como buena práctica. Cualquier nombre iniciado en ** referirá a estos argumentos de cantidad variable.
```python
def atributos_persona(**kwargs):
```
```python
atributos_persona(ojos="azules", pelo="corto")
```
*kwargs* = {'ojos': 'azules', 'pelo': 'rubio'}
## 5.8. - Ejercicios
### 5.8.1. - Ejercicio 1
Crea una función llamada devolver_distintos() que reciba 3 integers como parámetros.
- Si la suma de los 3 numeros es mayor a 15, va a devolver el número mayor.
- Si la suma de los 3 numeros es menor a 10, va a devolver el número menor.
- Si la suma de los 3 números es un valor entre 10 y 15 (incluidos) va a devolver el número de valor intermedio.
**Solución:**
```python
def devolver_distintos(num1, num2, num3):
suma = num1 + num2 + num3
lista = [num1, num2, num3]
if suma > 15:
return max(lista)
elif suma < 10:
return min(lista)
else:
lista.sort()
return lista[1]
print(devolver_distintos(6, 5, 3))
```
### 5.8.2. - Ejercicio 2
Escribe una función (puedes ponerle cualquier nombre que quieras) que reciba cualquier palabra como parámetro, y que devuelva todas sus letras únicas (sin repetir) pero en orden alfabético.
Por ejemplo si al invocar esta función pasamos la palabra "entretenido", debería devolver ['d', 'e', 'i', 'n', 'o', 'r', 't']
**Solución:**
```python
def cualquier(palabra):
mi_set = set()
for letra in palabra:
mi_set.add(letra)
lista = list(mi_set)
lista.sort()
return lista
print("\n")
print(cualquier('entretenido'))
```
### 5.8.3. - Ejercicio 3
Escribe una función que requiera una cantidad indefinida de argumentos. Lo que hará esta función es devolver True si en algún momento se ha ingresado al numero cero repetido dos veces consecutivas.
Por ejemplo:
(5,6,1,0,0,9,3,5) >>> True
(6,0,5,1,0,3,0,1) >>> False
**Solución:**
```python
def me_gustan_los_ceros(*noceros):
contador = 0
for num in noceros:
if num == 0:
contador += 1
if contador == 2:
contador = 0
return True
elif num != 0:
contador = 0
else:
pass
return False
print("\n")
print(me_gustan_los_ceros(5, 6, 1, 0, 0, 9, 3, 5))
print(me_gustan_los_ceros(6, 0, 5, 1, 0, 3, 0, 1))
Solución curso:
def ceros_vecinos(*args):
contador = 0
for num in args:
if contador + 1 == len(args):
return False
elif args[contador] == 0 and args[contador + 1] == 0:
return True
else:
contador += 1
return False
print("\n")
print(ceros_vecinos(5, 6, 1, 0, 0, 9, 3, 5))
print(ceros_vecinos(6, 0, 5, 1, 0, 3, 0, 1))
```
### 5.8.4. - Ejercicio 4
Escribe una función llamada contar_primos() que requiera un solo argumento numérico.
Esta función va a mostrar en pantalla todos los números primos existentes en el rango que va desde cero hasta ese número incluido, y va a devolver la cantidad de números primos que encontró.
Aclaración, por convención el 0 y el 1 no se consideran primos.
**Solución:**
```python
def primo(numero):
if numero == 0 or numero == 1 or numero == 4:
return False
for x in range(2, int(numero/2)):
if numero % x == 0:
return False
return True
def primos(rango_max):
rango_max += 1
lista_num = [n for n in range(1, rango_max)]
primos = []
for numero in lista_num:
es_primo = primo(numero)
if es_primo:
primos.append(numero)
contar = len(primos)
rango_max -= 1
print(f"\nEntre 0 y el {rango_max} hay {contar} números primos.\n")
print(*primos, sep=' ')
primos(1000)
Solución curso:
def contar_primos(numero):
primos = [2]
iteracion = 3
if numero < 2:
return 0
while iteracion <= numero:
for n in range(3, iteracion, 2):
if iteracion % n == 0:
iteracion += 2
break
else:
primos.append(iteracion)
iteracion += 2
print(primos)
return len(primos)
print("\n")
print(contar_primos(1000))
```
## 5.9. - Proyecto del Día 5
Hoy vas a programar El Ahorcado. El programa va a elegir una palabra secreta y le va a mostrar al jugador solamente una serie de guiones que representa la cantidad de letras que tiene la palabra. El jugador en cada turno deberá elegir una letra y si la letra se encuentra en la palabra oculta, el sistema le va a mostrar en qué lugares se encuentra. Pero si el jugador dice una letra que no se encuentra en la palabra oculta, pierde una vida.
En el juego real del ahorcado, cada vez que perdemos una vida, se va completando el dibujo del ahorcado miembro por miembro. Pero en nuestro caso, como aún no tenemos elementos gráficos, simplemente le vamos a decir que tiene seis vidas y se las iremos descontando de una en una, cada vez que el jugador elija una letra incorrecta.
Si se agotan las vidas antes de adivinar la palabra, el jugador pierde. Pero si adivina la palabra completa antes de perder todas las vidas, el jugador gana.
Parece sencillo, pero ¿cómo diseñamos todo este código? Bueno, aquí van algunas ayudas:
- Primero vas a crear un código que importe el método choice, ya que lo vas a necesitar para que el sistema pueda elegir una palabra al azar dentro de una lista de palabras que también vas a crear al comienzo.
- Luego de eso, vas a crear tantas funciones como creas necesarias para que el programa haga cosas como pedirle al usuario que elija una letra, para corroborar si lo que el usuario ha ingresado es una letra válida, para chequear si la letra ingresada se encuentra en la palabra o no, para verificar si ha ganado o no, etc.
- Recuerda escribir primero las funciones y luego el código que las implementa ordenadamente.
Creo que este es un proyecto especial y de verdad quiero que sepas que no espero que lo puedas resolver sin ayuda. Las funciones parecen simples, pero cuando empezamos a poner funciones todas juntas en un código real, es difícil seguir mentalmente la sucesión del código porque se vuelve mucho menos lineal que antes. Lo importante es que lo intentes, que tu cabeza se zambulla en el problema y luego veremos cómo llegamos a la solución.
![](../img/dia05_02.png)
## Ficheros y documentación del día 5
- [01_metodos_ayuda_docs.py](01_metodos_ayuda_docs.py)
- [02_funciones.py](02_funciones.py)
- [03_funciones_dinamicas.py](03_funciones_dinamicas.py)
- [04_ejemplo_funcion.py](04_ejemplo_funcion.py)
- [05_palito_mas_corto.py](05_palito_mas_corto.py)
- [06_lanzar_dados.py](06_lanzar_dados.py)
- [07_limpiar_lista_promedio.py](07_limpiar_lista_promedio.py)
- [08_lanzar_moneda.py](08_lanzar_moneda.py)
- [09_args_indeterminados.py](09_args_indeterminados.py)
- [10_problemas_practicos.py](10_problemas_practicos.py)
- [11_programa05.py](11_programa05.py)
[Documentación del día](../doc_curso/05_ahorcado/)
---
Enlaces a todos los días: [dia 1 - creador de nombres](../dia_01/README.md) / [dia 2 - calculador de comisiones](../dia_02/README.md) / [dia 3 - analizador de texto](../dia_03/README.md) / [dia 4 - juego "adivina el número"](../dia_04/README.md) / [dia 5 - juego "El ahorcado"](../dia_05/README.md) / [dia 6 - recetario](../dia_06/README.md) / [dia 7 - cuenta bancaria](../dia_07/README.md) / [dia 8 - consola de turnos](../dia_08/README.md) / [dia 9 - buscador de números de serie](../dia_09/README.md) / [dia 10 - juego "Invasión espacial"](../dia_10/README.md) / [dia 11 - web scraping](../dia_11/README.md) / [dia 12 - gestor de restaurantes](../dia_12/README.md) / [dia 13 - asistente de voz](../dia_13/README.md) / [dia 14 - controlador de asistencia](../dia_14/README.md) / [dia 15 - machine learning](../dia_15/README.md) / [dia 16 - aplicación web de tareas pendientes](../dia_16/README.md)