Librerías incluida: random

Asi como hay funciones incluidas (built-ins) que se pueden usar sin estar declaradas tambien hay más herramientas de Python disponibles pero que requieren ser importadas.

Importar (con el comando import o de la forma from X import Y) en Python es disponibilizar nueva herramientas (fuenciones y otras) en nuestro código.

Python al azar: random

El módulo random incluye una serie de funciones que permiten darle aleatoriedad a nuestro código.

Veamos un ejemplo. La función randint genera numeros al alzar entre dos valores pasados como parámetros.

from random import randint

al_azar = randint(1, 100)
print(al_azar)

# otra forma de usarlo podría ser
import random
al_azar = random.randint(1, 100)
print(al_azar)

Asi como el . se usa en objeto.propiedad tambien se usa en modulo.objeto_en_modulo.

choice: Elegir un opción al azar de una lista.

La función choice recibe como parámetro una lista de la cual devolverá un elemento al azar.

from random import choice

opciones = ["piedra", "papel", "tijeras"]
opcion_elegida = choice(opciones)
print(opcion_elegida)
# tijeras

shuffle: Mezclar una lista

Otra función del módulo random es shuffle que recibe una lista como parámetro y la desordena aleatoriamente.

Ejemplo:

from random import shuffle

mazo = [
    {"numero": 1, "palo": "espada"},
    {"numero": 2, "palo": "espada"},
    # ...
    {"numero": 11, "palo": "oro"},
    {"numero": 12, "palo": "oro"},
]
suffle(mazo)
print(mazo[0])
# {"numero": 11, "palo": "oro"}

Tareas

  • Escribir un programa que elija un numero al azar entre 1 y 100 y le pida al usuario que lo adivine. El programa debe decirle al usuario si el numero que ingresó es mayor o menor al numero que se eligió al azar. El programa debe terminar cuando el usuario adivine el numero elegido al azar.

  • Hacer un PR con una propuesta de solución para el ejercicio 045 (contenido en este repositorio)

"""
La funcion "carta_poker_al_azar" ya funciona como es esperado
La tarea aquí es completar la funcion "carta_espaniola_al_azar"
para que devuleva resultados válidos.
Nota: se debe importar y usar la funcion "randint" de "random"
"""

from random import choice

def carta_poker_al_azar():
    palos = ['pica', 'trebol', 'corazon', 'diamante']
    numeros = list(range(1, 11)) + ['J', 'Q', 'K']
    nro = choice(numeros)
    palo = choice(palos)

    carta = {"numero": nro, "palo": palo}
    return carta

def carta_espaniola_al_azar():
    palos = ['oro', 'basto', 'espada', 'copa']
    
    # corregir estas dos lineas para devolver valores válidos
    nro = 0
    palo = ""

    carta = {"numero": nro, "palo": palo}
    return carta

# mirar ejemplos de ambas funciones
for n in range(20):
    carta1 = carta_poker_al_azar()
    carta2 = carta_espaniola_al_azar()
    print(carta1, carta2)


# ------------------------------------------------------------------------
# NO BORRAR O MODIFICAR LAS LINEAS QUE SIGUEN
# ------------------------------------------------------------------------
# Una vez terminada la tarea ejecutar este archivo.
# Si se ve la leyenda 'Ejercicio terminado OK' el ejercicio se considera completado.
# La instruccion "assert" de Python lanzará un error si lo que se indica a
#   continuacion es falso.
# Si usas GitHub (o similares) podes hacer una nueva rama con esta solución,
#   crear un "pull request" y solicitar revision de un tercero.

carta = carta_espaniola_al_azar()
assert type(carta['numero']) == int
assert carta['numero'] > 0
assert carta['numero'] <= 12
assert carta['palo'] in ['oro', 'basto', 'espada', 'copa']

print('Ejercicio terminado OK')
  • Hacer un PR con una propuesta de solución para el ejercicio 046

"""
La siguiente funcion pretende ser usada para generar
10 numeros como resultados del sorteo de quiniela.
Como podrán notar es bastante mala.
Tarea:
 - Asegurarse que los resultados sean aleatorios
 - Asegurarse que la función respete los tres parametros

"""


def generar_quiniela(minimo=0, maximo=9999, total_numeros=10):
    """ Generar varios numeros al azar definidos
        entre máximo y minimo (sin numeros duplicados) """
    return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

numeros_quiniela = generar_quiniela()
print(f'Numeros resultantes {numeros_quiniela}')

# ------------------------------------------------------------------------
# NO BORRAR O MODIFICAR LAS LINEAS QUE SIGUEN
# ------------------------------------------------------------------------
# Una vez terminada la tarea ejecutar este archivo.
# Si se ve la leyenda 'Ejercicio terminado OK' el ejercicio se considera completado.
# La instruccion "assert" de Python lanzará un error si lo que se indica a
#   continuacion es falso.
# Si usas GitHub (o similares) podes hacer una nueva rama con esta solución,
#   crear un "pull request" y solicitar revision de un tercero.

# Prueba de resultados basicos
assert type(numeros_quiniela) == list
assert len(numeros_quiniela) == 10
for n in numeros_quiniela:
    assert type(n) == int
    assert n >= 0
    assert n <= 9999

# Pruebas con otros parametros
minimo = 90
maximo = 200
total_numeros = 7
numeros_quiniela = generar_quiniela(minimo=minimo, maximo=maximo, total_numeros=total_numeros)
assert type(numeros_quiniela) == list
assert len(numeros_quiniela) == total_numeros
for n in numeros_quiniela:
    assert type(n) == int
    assert n >= minimo
    assert n <= maximo

minimo = 0
maximo = 100
total_numeros = 3
numeros_quiniela = generar_quiniela(minimo=minimo, maximo=maximo, total_numeros=total_numeros)
assert type(numeros_quiniela) == list
assert len(numeros_quiniela) == total_numeros
for n in numeros_quiniela:
    assert type(n) == int
    assert n >= minimo
    assert n <= maximo

print('Ejercicio terminado OK')
  • Hacer un PR con una propuesta de solución para el ejercicio 047

"""
La funcion "detectar_escaleras" funciona bastante bien.
Toma una lista de numeros y busca escaleras ascendentes
dentro de la secuencia de numeros.
Esta funcion detecta casi todas las secuencias pero no todas
Tarea:
 - Arreglar la funcion para que pase los tests y encuentre
   todas las escaleras existentes
Nota: probablemente vas a necesitar depurar el código para
entender como funciona y por que falla.
"""

from random import randint

def tirar_dados(lados=6, veces=100):
    """ Generar aleatoriamente los tiros de un lado de cantidad
        de lados variable.
    """
    
    tiros = []
    for _ in range(veces):
        numero = randint(1, lados)
        tiros.append(numero)
    
    return tiros

def detectar_escaleras(lista_tiros):
    """ Detectar las escaleras ascendentes encontradas
        en los tiros de al menos 3 elementos """
    
    # aqui guardamos las escaleras que se consiguieron con 3 o más elementos
    escaleras_buenas = []
    # lista temporal para ir testeando todos los tiros
    escalera = []
    for tiro in lista_tiros:
        if len(escalera) == 0:
            # recien empiezo a buscar
            escalera.append(tiro)
        elif escalera[-1] == tiro - 1:
            # La escalera de prueba ya empezo y el numero actual
            # esta en escalera con el ultimo encontrado
            escalera.append(tiro)
        else:
            # este tiro no esta en escalera con el anterior
            # ver si la escalera conseguida tiene 3 o mas elementos
            # para guardarle
            if len(escalera) >= 3:
                escaleras_buenas.append(escalera)
            # como este número no sirve para la escalera anterior
            # es el que inicializa la deteccion de la nueva
            escalera = [tiro]

    return escaleras_buenas


tiros = tirar_dados(veces=10000)
escaleras = detectar_escaleras(tiros)
print(f'Escaleras encontradas {len(escaleras)}')


# ------------------------------------------------------------------------
# NO BORRAR O MODIFICAR LAS LINEAS QUE SIGUEN
# ------------------------------------------------------------------------
# Una vez terminada la tarea ejecutar este archivo.
# Si se ve la leyenda 'Ejercicio terminado OK' el ejercicio se considera completado.
# La instruccion "assert" de Python lanzará un error si lo que se indica a
#   continuacion es falso.
# Si usas GitHub (o similares) podes hacer una nueva rama con esta solución,
#   crear un "pull request" y solicitar revision de un tercero.

# Probar tiros donde yo ya conozco los resultados
tiros_test = [1, 5, 6,
              3, 4, 5,
              1, 5, 6,
              1, 2, 3,
              2, 2, 2]

escaleras = detectar_escaleras(tiros_test)
assert escaleras == [
    [3, 4, 5],
    [1, 2, 3],
]

tiros_test = [1, 5, 2, 3, 2, 1, 4, 5, 5, 1, 2, 6, 3, 3, 3, 1, 2, 5, 5, 2, 4,
              3, 4, 5,
              2, 3, 4, 5,
              1, 5, 2, 4, 2, 5, 6, 6, 5, 5, 4, 2, 6, 1, 4, 5, 3, 1, 6, 2, 2,
              1, 2, 3, 4, 5,
              3, 1, 2, 6, 5, 6, 2, 5, 1, 4, 4, 5, 4, 3, 2, 1, 1, 3, 5, 6, 1,
              1, 2, 3]

escaleras = detectar_escaleras(tiros_test)
assert escaleras == [
    [3, 4, 5],
    [2, 3, 4, 5],
    [1, 2, 3, 4, 5],
    [1, 2, 3]
]

tiros_test = [1, 2, 3]
escaleras = detectar_escaleras(tiros_test)
assert escaleras == [[1, 2, 3]]

print('Ejercicio terminado OK')