You've already forked Curso-lenguaje-python
Restructure content and add notes from HolaMundo
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
This commit is contained in:
23
python-total/dia_04/01_operadores_comparacion.py
Normal file
23
python-total/dia_04/01_operadores_comparacion.py
Normal 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)
|
||||
22
python-total/dia_04/02_operadores_logicos.py
Normal file
22
python-total/dia_04/02_operadores_logicos.py
Normal 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()
|
||||
31
python-total/dia_04/03_control_de_frujo.py
Normal file
31
python-total/dia_04/03_control_de_frujo.py
Normal 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")
|
||||
80
python-total/dia_04/04_for.py
Normal file
80
python-total/dia_04/04_for.py
Normal 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)
|
||||
|
||||
|
||||
56
python-total/dia_04/05_while.py
Normal file
56
python-total/dia_04/05_while.py
Normal 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)
|
||||
17
python-total/dia_04/06_rango.py
Normal file
17
python-total/dia_04/06_rango.py
Normal 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)
|
||||
30
python-total/dia_04/07_enumerador.py
Normal file
30
python-total/dia_04/07_enumerador.py
Normal 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])
|
||||
14
python-total/dia_04/08_zip.py
Normal file
14
python-total/dia_04/08_zip.py
Normal 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}')
|
||||
29
python-total/dia_04/09_min_max.py
Normal file
29
python-total/dia_04/09_min_max.py
Normal 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()))
|
||||
|
||||
31
python-total/dia_04/10_random.py
Normal file
31
python-total/dia_04/10_random.py
Normal 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)
|
||||
70
python-total/dia_04/11_comprension_listas.py
Normal file
70
python-total/dia_04/11_comprension_listas.py
Normal 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)
|
||||
57
python-total/dia_04/12_match.py
Normal file
57
python-total/dia_04/12_match.py
Normal 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")
|
||||
123
python-total/dia_04/13_programa04.py
Normal file
123
python-total/dia_04/13_programa04.py
Normal 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!")
|
||||
326
python-total/dia_04/README.md
Normal file
326
python-total/dia_04/README.md
Normal 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)
|
||||
Reference in New Issue
Block a user