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,23 @@
"""
Operadores de comparación
== igual a
!= diferente a
> mayor que
< menor que
>= mayor o igual que
<= menor o igual que
"""
mi_bool = 5 >= 6
print(mi_bool)
mi_bool = 5 != 6
print(mi_bool)
mi_bool = 10 == 2*5
print(mi_bool)
mi_bool = 5 < 6
print(mi_bool)

View File

@@ -0,0 +1,22 @@
"""
Operadores lógicos
"""
a = 6 > 5
b = 30 == 15*3
mi_bool = a and b
print(mi_bool)
mi_bool = a or b
print(mi_bool)
mi_bool = not a
print(mi_bool)
mi_bool = (4>5) and (5 == 2+5)
print(mi_bool)
mi_bool = "perro" == "perro"
print()

View File

@@ -0,0 +1,31 @@
"""
Control de flujo
if condición:
print(codigo)
elif otra_condición:
print(codigo)
else:
"""
x = True
if 5 == 2:
print("Es correcto")
else:
print("Parece que es falso")
edad = input("Dime tu edad: ")
edad = int(edad)
if edad <= 17:
print("Eres menor de edad")
calificacion = input("Que nota sacaste? ")
calificacion = int(calificacion)
if calificacion >= 5:
print("Felicitaciones! Has aprobado")
else:
print("No aprobado")
else:
print("Eres adulto")

View File

@@ -0,0 +1,80 @@
"""
Ejemplos de bucles for
"""
nombres = ['Juan','Ana','Carlos','Belén','Fran']
for nombre in nombres:
print(f"Hola {nombre}")
print("")
lista = ['a','b','c','d']
for letra in lista:
numero_letra = lista.index(letra) + 1
print(f"Letra {numero_letra}: {letra}")
print("")
for nombre in nombres:
if nombre.startswith('B'):
print(f"Hola {nombre}")
print("")
numeros = [1,2,3,4,5]
mi_valor = 0
for numero in numeros:
mi_valor += numero
print(mi_valor)
print(f"Total ha sumado {mi_valor}")
print("")
# Si el numero de valores dentro de listas anidadas coincide
# se puede extraer su contenido buscando dos variables.
for i,j in [[1,2],['a','b'],[3,4]]:
print(i)
print(j)
print("")
# Diccionario
dic = {'clave1':'a', 'clave2':'b', 'clave3':'c'}
for item in dic:
print(item)
print("")
for item in dic.items():
print(item)
print("")
for item in dic.values():
print(item)
print("")
for a,b in dic.items():
print(a)
print(b)
print("")
# Ejercicio bonito de separar la suma de números de una lista
# por pares e impares
lista_numeros = [1,5,8,7,6,8,2,5,2,6,4,8,5,9,8,3,5,4,2,5,6,4]
suma_pares = 0
suma_impares = 0
for numero in lista_numeros:
if numero % 2 == 0:
suma_pares = suma_pares + numero
else:
suma_impares = suma_impares + numero
print(suma_pares)
print(suma_impares)

View File

@@ -0,0 +1,56 @@
"""
Ejemplos de bucle while
"""
contador = 0
while contador < 10:
contador += 1
print(f"Iteración número {contador}")
print("Se cumplió la condición")
respuesta = 's'
while respuesta == 's':
respuesta = input("quieres seguir? (s/n) ")
else:
print("Gracias")
print("")
# pass Sirve para reservar un lugar en un bucle,
# no utilizarlo para recuperar quizá luego
while respuesta == 's':
pass
print("hola")
print("")
# break Sirve para romper un bucle y salir
nombre = input("Tu nombre: ")
for letra in nombre:
if letra == 'D':
break
print(letra)
print("")
# continue Interrumpe la iteración pero no sale,
# vuelve al inicio de la iteración
nombre = input("Tu nombre: ")
for letra in nombre:
if letra == 'D':
continue
print(letra)
comando = ""
while comando.lower() != "salir":
comando = input("$ ")
print(comando)

View File

@@ -0,0 +1,17 @@
"""
Rango
"""
# lista = [1,2,3,4,5]
# Puedes evitar las listas de numeros con range
for numero in range(5):
print(numero)
# Puedes decir el inicio, el final y los saltos
for numero in range(10,100,10):
print(numero)
# Se puede meter en listas
lista = list(range(1,101))
print(lista)

View File

@@ -0,0 +1,30 @@
"""
Enumerador
"""
lista = ['a', 'b', 'c']
indice = 0
for item in lista:
print(indice, item)
indice += 1
# Con el enumerador es mucho más elegante
for item in enumerate(lista):
print(item)
# La anterior devuelve un tuple,
# podemos separarla con una variable
for indice,item in enumerate(lista):
print(indice, item)
# Junto a range podemos extraer un indice de la iteración
for indice,item in enumerate(range(50,55)):
print(indice, item)
# Se puede utilizar para transformar una lista en un tuple
mis_tuples = list(enumerate(lista))
print(mis_tuples)
# Podemos acceder a un valor concreto a través de los indices
print(mis_tuples[1][1])

View File

@@ -0,0 +1,14 @@
"""
Zip
"""
nombres = ['Ana','Hugo','Valeria']
edades = [65,29,42,55]
ciudades = ['Lima','Madrid','Mexico']
# Cuidao, zip guarda las listas con el numero mínimo de las listas
combinados = list(zip(nombres,edades, ciudades))
for nombre,edad,ciudad in combinados:
print(f'{nombre} tiene {edad} años y vive en {ciudad}')

View File

@@ -0,0 +1,29 @@
"""
min() y max()
"""
menor = min(56, 96, 72, 63, 35)
print(menor)
mayor = max(56, 96, 72, 63, 35)
print(mayor)
lista = [56, 96, 72, 63, 35]
print(f'El menor es {min(lista)} y el mayor es {max(lista)}')
# También funciona con strings, alfabéticamente, en listas
nombres = ['Juan', 'Pablo', 'Alicia', 'Carlos']
print(min(nombres))
# y en strings directamente. Buscando primero en las mayúsculas
# y después en las minúsculas
nombre = "Iñigo"
print(max(nombre))
# Y con los diccionarios
dic = {'C1':45,'C2':11}
print(min(dic)) # Esto revisa el diccionario completo
print(min(dic.values()))

View File

@@ -0,0 +1,31 @@
"""
random
Necesitaremos importar métodos,
porque están en una librería llamada random
Veremos estos métodos:
randint()
uniform()
random()
choice()
shuffle()
"""
from random import *
aleatorio = randint(1, 50)
print(aleatorio)
aleatorio_float = round(uniform(1, 10),4)
print(aleatorio_float)
aleatorio_random = random()
print(aleatorio_random)
colores = ['rosa', 'verde','negro','azul']
aleatorio_choice = choice(colores)
print(aleatorio_choice)
numeros = list(range(5,50,5))
shuffle(numeros)
print(numeros)

View File

@@ -0,0 +1,70 @@
"""
Compresión de listas
"""
# Las compresión de listas susituye el siguiente ejemplo
lista = []
palabra = "python"
for letra in palabra:
lista.append(letra)
print(lista)
# Con una sintaxis más breve, de 4 a 1 linea
lista_comp = [letra for letra in "python"]
print(lista_comp)
# Ejemplo con operación
lista_num = [n /2 for n in range(0,21,2)]
print(lista_num)
# Ejemplo con condicional para agregar en la lista
lista_condici = [n for n in range(0,21,2) if n * 2 > 10]
print(lista_condici)
# Ejemplo anterior pero con else. Ahora es menos legible
# porque hay que ponerlo delante
# Lo que hacemos es sustituir el n por un texto
lista_else = [n if n * 2 > 10 else 'no' for n in range(0,21,2)]
print(lista_else)
# Ejemplo práctico
## Transformar pies en metros
pies = [10,20,30,40,50]
metros = []
for pie in pies:
metros.append(pie*3.281)
print(metros)
## Ahora la compresión del código
metros_compr = [pie*3.281 for pie in pies]
print(metros_compr)
# Valores cuadrados
valores = [1, 2, 3, 4, 5, 6, 9.5]
valores_cuadrados = [v**2 for v in valores]
print(valores_cuadrados)
# Guardar pares en la lista
valores_pares = [v for v in valores if (v%2 == 0)]
print(valores_pares)
# De fahrenheit a celsius
temperatura_fahrenheit = [32, 212, 275]
grados_celsius = [(grados_fahrenheit-32)*(5/9) for grados_fahrenheit in temperatura_fahrenheit]
print(grados_celsius)

View File

@@ -0,0 +1,57 @@
"""
match
"""
# Hasta ahora se usaba el if
serie = "N-02"
if serie == "N-01":
print("Samsung")
elif serie == "N-02":
print("Nokia")
elif serie == "N-03":
print("Motorola")
else:
print("No existe ese producto")
# En otros lenguajes ya se usaba swich case o parecidos
# A partir de la versión 3.10, python incorpora match
match serie:
case "N-01":
print("Samsung")
case "N-02":
print("Nokia")
case "N-03":
print("Motorola")
case _:
print("No existe ese producto")
# Ejemplo que muestra todo el potencial
# Permite encontrar patrones
cliente = {'nombre':
'Federico',
'edad': 45,
'ocupacion': 'instructor'}
pelicula = {'titulo':'matrix',
'ficha_tecnica':{'protagonista':'Keanu reeves',
'director':'Lana y Lilly Wachowski'}}
elementos = [cliente, pelicula, 'libro']
for e in elementos:
match e:
case {'nombre':nombre,
'edad': edad,
'ocupacion': ocupacion}:
print("Es un cliente")
print(nombre, edad, ocupacion)
case {'titulo':titulo,
'ficha_tecnica':{'protagonista': protagonista,
'director': director}}:
print("Es una pelicula")
print(titulo, protagonista, director)
case _:
print("No se que es esto")

View File

@@ -0,0 +1,123 @@
"""
Programa día 4 - Juego "Adivina el número"
"""
# Importamos módulos
from random import randint
import itertools
import threading
import time
import sys
import os
# Funciones
# Función limpiar consola
def clearConsole():
command = 'clear'
if os.name in ('nt', 'dos'): # If Machine is running on Windows, use cls
command = 'cls'
os.system(command)
# Función de la animación para 'pensar'
def animate():
for c in itertools.cycle(['|', '/', '-', '\\']):
if DONE:
break
sys.stdout.write('\rPensando un número ' + c)
sys.stdout.flush()
time.sleep(0.1)
sys.stdout.write('\rYa tengo el número! ')
sys.stdout.write('\nA ver si aciertas, dime un número: ')
# Función validar input es un número
def validar(dato, tipos):
for tipo in tipos:
try:
return tipo(dato)
except ValueError:
pass
return None
# Limpiar la terminal
clearConsole()
# Mensaje bienvenida
print("\n#########################")
print("JUEGO - Adivina el número")
print("#########################\n")
# Pregunta nombre, saluda y explica el juego (Con opción a salir)
nombre = input("¿Cuál es tu nombre? ")
print(f"\nOk {nombre}, voy a pensar un número del 1 al 100.")
print("Tienes 8 intentos para adivinarlo\n")
# Filigrana como que piensa la máquina
DONE = False
t = threading.Thread(target=animate)
t.start()
# El tiempo de ejecución
time.sleep(3)
DONE = True
# Guardando el número secreto
n_secreto = randint(1, 100)
# Bucle de intentos y control de flujo
for intentos in range(8):
# Calcular intentos restantes
lista_intentos = list(range(8))
lista_intentos.reverse()
intentos_restantes = lista_intentos.pop(intentos)
# Pregunta posible número y valida que es de type número
while True:
n_posible = input("Dime un número: ")
x = validar(n_posible, (int, float, complex))
if x is None:
print("Error: El dato introducido no es un número\n")
else:
break
# Para comparar el número se necesita que sea integer
n_posible = int(n_posible)
# Posibles casuísticas
# Si el número no está en el rango especificado
if (n_posible < 1) or (n_posible > 100):
print("\nEse número no está entre el 1 y el 100")
print(
f"Desperdiciaste un turno, te quedan {intentos_restantes} intentos")
# Si el número es menor
elif n_posible > n_secreto:
print(
f"\nLo siento, has fallado.Te quedan {intentos_restantes} intentos.")
print("\n\tPista --> El número es menor.\n")
# Si el número es mayor
elif n_posible < n_secreto:
print(
f"\nLo siento, has fallado.Te quedan {intentos_restantes} intentos.")
print("\n\tPista --> El número es mayor.\n")
# Si se acierta el número
elif n_posible == n_secreto:
print("\n¡Ole! ¡¡¡¡HAS ACERTADO!!!!")
intentos += 1
print(f"¡Felicidades {nombre}!\nLo conseguiste en {intentos} intentos")
break
# Si se agotan los intentos
if intentos == 7:
print(
f"\n¡Vaya! Has gastado los 8 intentos.\nEl número pensado era el {n_secreto}.\n Otra vez será...\nCiao!")
print("\n¡Espero que te hayas divertido!")

View File

@@ -0,0 +1,326 @@
# Día 4 - Programa el juego "adivina el número"
## Índice
- [Día 4 - Programa el juego "adivina el número"](dia_04/README.md)
- [4.1. - Operadores de comparación](dia_04/01_operadores_de_comparacion.md)
- [4.2. - Operadores lógicos](dia_04/02_operadores_logicos.md)
- [4.3. - Control de flujo](dia_04/03_control_de_flujo.md)
- [4.4. - loops while](dia_04/04_loops_while.md)
- [4.5. - range( )](dia_04/05_range.md)
- [4.6. - enumerate( )](dia_04/06_enumerate.md)
- [4.7. - zip( )](dia_04/07_zip.md)
- [4.8. - min( ) & max( )](dia_04/08_min_max.md)
- [4.9. - random](dia_04/09_random.md)
- [4.10. - Comprensión de listas](dia_04/10_comprension_de_listas.md)
- [4.11. - match](dia_04/11_match.md)
- [4.12. - Proyecto del Día 4](dia_04/12_proyecto.md)
## 4.1. - Operadores de comparación
Como su nombre lo indica, sirven para comparar dos o más valores. El resultado de esta comparación es un booleano (True/False)
| Operador | Descripción |
| :------: | :---------------- |
| == | Igual a |
| != | Diferente a |
| > | Mayor que |
| < | Menor que |
| >= | mayor o igual que |
| <= | menor o igual que |
Si la comparación resulta verdadera, devuelve el resultado *True*
Si dicha comparación es falsa, el resultado es *False*
```python
mi_bool = 5 >= 6
print(mi_bool)
```
False
```python
mi_bool = 5 != 6
print(mi_bool)
```
True
```python
mi_bool = 10 == 2*5
print(mi_bool)
```
True
```python
mi_bool = 5 < 6
print(mi_bool)
```
True
## 4.2. - Operadores lógicos
Estos operadores permiten tomar decisiones basadas en múltiples condiciones.
```python
a = 6 > 5
b = 30 == 15*3
```
**and** devuelve True si todas las condiciones son verdaderas
```python
mi_bool = a and b
print(mi_bool)
```
False
**or** devuelve True si al menos una condición es verdadera
```python
mi_bool = a or b
print(mi_bool)
```
True
**not** devuelve True si el valor del booleano es False, y False si es True
```python
mi_bool = not a
print(mi_bool)
```
False
## 4.3. - Control de flujo
El control de flujo determina el orden en que el código de un programa se va ejecutando. En Python, el flujo está controlado por estructuras condicionales, loops y funciones.
### 4.3.1. - Estructuras condicionales (if)
- Expresión de resultado booleano (True/False)
- La indentación es obligatoria en Python
- Los dos puntos (:) dan paso al código que se ejecuta si expresión = True
```python
if expresión:
código a ejecutarse
elif expresión:
código a ejecutarse
elif expresión:
código a ejecutarse
...
else:
código a ejecutarse
```
- *else & elif* son opcionales y pueden incluirse varias cláusulas elif
## 4.4. - loops while
Si bien los loops while son otro tipo de bucles, resultan más parecidos a los condicionales if que a los loops for. Podemos pensar a los loops while como una estructura condicional que se ejecuta en repetición, hasta que se convierte en falsa.
```python
while condición:
expresión
else:
expresión
```
- Se compone de la Estructura condicional seguida de dos puntos (:)
- La indentación es obligatoria en Python.
- Este código se ejecutará cuando la condición se convierta en False
### 4.4.1. - instrucciones especiales
- Si el código llega a una instrucción break, se produce la salida del bucle.
- La instrucción continue interrumpe la iteración actual dentro del bucle, llevando al programa a la parte superior del bucle.
- La instrucción pass no altera el programa: ocupa un lugar donde se espera una declaración, pero no se desea realizar una acción.
## 4.5. - range( )
La función range( ) devuelve una secuencia de números dados 3 parámetros. Se utiliza fundamentalmente para controlar el número de ejecuciones de un loop o para crear rápidamente una serie de valores.
- *valor_inicio* - número a partir del cual inicia el rango (incluido)
- *valor_final* - número antes del cual el rango finaliza (no incluido)
- *paso* - diferencia entre cada valor consecutivo de la secuencia
Sintaxis:
```python
range(valor_inicio, valor_final, paso)
print(list(range(1,13,3)))
```
[1,4,7,10]
El único parámetro obligatorio es *valor_final*. Los valores predeterminados para *valor_inicio* y *paso* son 0 y 1 respectivamente.
## 4.6. - enumerate( )
La función enumerate( ) nos facilita llevar la cuenta de las iteraciones, a través de un contador de índices de un iterable, que se puede utilizar de manera directa en un loop, o convertirse en una lista de tuplas con el método list( ).
- *iterable* - Cualquier objeto que pueda ser iterado
- *inicio* - Valor [int] de inicio del índice (por defecto iniciado en 0)
Sintaixs:
```python
enumerate(iterable, inicio)
print(list(enumerate("Hola")))
```
[(0, 'H'), (1, 'o'), (2, 'l'), (3, 'a')]
```python
for indice, numero in enumerate([5.55, 6, 7.50]):
print(indice, numero)
```
0 5.55
1 6
2 7.5
## 4.7. - zip( )
La función zip( ) crea un iterador formado por los elementos agrupados del mismo índice provenientes de dos o más iterables. Zip deriva de zipper (cremallera o cierre), de modo que es una analogía muy útil para recordar.
La función se detiene al cuando se agota el iterable con menor cantidad de elementos.
```python
letras = ['w', 'x', 'c']
numeros = [50, 65, 90, 110, 135]
for letra, num in zip(letras, numeros):
print(f'Letra: {letra}, y Número: {num}')
```
Letra: w, y Número: 50
Letra: x, y Número: 65
Letra: c, y Número: 90
## 4.8. - min( ) & max( )
La función min( ) retorna el item con el valor más bajo dentro de un iterable. La función max( ) funciona del mismo modo, devolviendo el valor más alto del iterable. Si el iterable contiene strings, la comparación se realiza alfabéticamente.
```python
ciudades_habitantes = {"Tijuana":1810645, "León":1579803}
lista_valores = [5**5, 12**2, 3050, 475*2]
print(min(ciudades_habitantes.keys()))
```
León
```python
print(max(ciudades_habitantes.values()))
```
1810645
```python
print(max(lista_valores))
```
3125
## 4.9. - random
Python nos facilita un módulo (un conjunto de funciones disponibles para su uso) que nos permite generar selecciones pseudo-aleatorias* entre valores o secuencias.
Nombre del módulo:
```python
from random import *
```
* = Todos los métodos
También pueden importarse de manera independiente aquellos a utilizar.
**randint(min, max)**: devuelve un integer entre dos valores dados (ambos límites incluidos)
**uniform(min, max)**: devuelve un float entre un valor mínimo y uno máximo
**random(sin parámetros)**: devuelve un float entre 0 y 1
**choice(secuencia)**: devuelve un elemento al azar de una secuencia de valores (listas, tuples, rangos, etc.)
**shuffle(secuencia)**: toma una secuencia de valores mutable (como una lista), y la retorna cambiando el orden de sus elementos aleatoriamente.
* La mecánica en cómo se generan dichos valores aletorios viene en realidad predefinida en "semillas". Si bien sirve para todos los usos habituales, no debe emplearse con fines de seguridad o criptográficos, ya que son vulnerables.
## 4.10. - Comprensión de listas
La comprensión de listas es una manera dinámica de construir una lista. Ofrece una sintaxis más breve en la creación de una nueva lista basada en valores disponibles en otra secuencia. Vale la pena mencionar que la brevedad se logra a costo de una menor interpretabilidad. Sintaxis:
```python
nueva_lista= [expresion for item in iterable if condicion == True]
```
*expresión* - fórmula matemática
*Item* - cada elemento del iterable
*iterable* - tuplas, sets, otras listas...
*condicion == True * - operación lógica
Caso especial con else:
```python
nueva_lista= [expresion if condicion == True else otra_expresion for item in iterable]
```
Ejemplo:
```python
nueva_lista = [num**2 for num in range(10) if num < 5]
print(nueva_lista)
```
[0, 1, 4, 9, 16]
## 4.11. - match
En Python 3.10, se incorpora la coincidencia de patrones estructurales mediante las declaraciones match y case. Esto permite asociar acciones específicas basadas en las formas o patrones de tipos de datos complejos.
```python
match objeto:
case <patron_1>:
<accion_1>
case <patron_2>:
<accion_2>
case <patron_3>:
<accion_3>
case _:
<accion_comodin>
```
El caracter _ es un comodín que actúa como coincidencia si la misma no se produce en los casos anteriores.
Es posible detectar y deconstruir diferentes estructuras de datos: esto quiere decir que los patrones no son únicamente valores literales (strings o números), sino también estructuras de datos, sobre los cuales se buscan coindicencias de construcción.
## 4.12. - Proyecto del Día 4
La consigna es esta: el programa le va a preguntar al usuario su nombre, y luego le va a decir algo así como “Bueno, Juan, he pensado un número entre 1 y 100, y tienes solo ocho intentos para adivinar cuál crees que es el número”. Entonces, en cada intento el jugador dirá un número y el programa puede responder cuatro cosas distintas:
- Si el número que dijo el usuario es menor a 1 o superior a 100, le va a decir que ha elegido un número que no está permitido.
- Si el número que ha elegido el usuario es menor al que ha pensado el programa, le va a decir que su respuesta es incorrecta y que ha elegido un número menor al número secreto.
- Si el usuario eligió un número mayor al número secreto, también se lo hará saber de la misma manera.
- Y si el usuario acertó el número secreto, se le va a informar que ha ganado y cuántos intentos le ha tomado.
Si el usuario no ha acertado en este primer intento, se le va a volver a pedir que elija otro número. Y así hasta que gane o hasta que se agoten los ocho intentos.
## Ficheros y documentación del día 4
- [01_operadores_comparacion.py](01_operadores_comparacion.py)
- [02_operadores_logicos.py](02_operadores_logicos.py)
- [03_control_de_frujo.py](03_control_de_frujo.py)
- [04_for.py](04_for.py)
- [05_while.py](05_while.py)
- [06_rango.py](06_rango.py)
- [07_enumerador.py](07_enumerador.py)
- [08_zip.py](08_zip.py)
- [09_min_max.py](09_min_max.py)
- [10_random.py](10_random.py)
- [11_comprension_listas.py](11_comprension_listas.py)
- [12_match.py](12_match.py)
- [13_programa04.py](13_programa04.py)
[Documentación del día](../doc_curso/04_adivinar_numero/)
---
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)