es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Objeto generador de Python para el repartidor de cartas.

Mi pregunta es crear una función que genere un tipo de carta a la vez. Por ejemplo, card_dealer() que solo muestra una combinación específica, por ejemplo, 10S.

Mi intento es el siguiente:

def card_dealer():
    rank = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
    suit = ['S','C','H','D']
    list3=[]
    num=0
    for i in rank[num]:
        for j in suit[num]:
            list3.append(f'{i}{j}')
            num+=1
            yield list3

next(card_dealer())

Sin embargo, esto solo muestra la misma combinación una y otra vez cuando la ejecuto:

['2S']

¿Cómo puedo hacer para obtener la próxima combinación cuando ejecuto next(card_dealer()), como por ejemplo 2C? He pensado en utilizar import random para hacerlo de manera aleatoria en lugar de mostrar una combinación específica, pero eso es algo para otro día. He probado diferentes combinaciones de este código, moviendo el yield en diferentes indentaciones, pero no me da el resultado específico que deseo.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código proporcionado que hacen que solo se genere la misma combinación en cada ejecución.

    En primer lugar, la variable num no se reinicia a cero después de que se haya iterado a través de cada palo. Esto significa que después de la primera iteración a través de las cartas con el palo ‘S’, el bucle continúa con un índice de 4 (la longitud de la lista de cartas) tanto para rank como para suit, lo cual no es lo que se desea.

    En segundo lugar, la instrucción yield se llama dentro del bucle externo, lo que significa que se ejecutará varias veces antes de que el generador pase a la siguiente combinación. Para solucionar esto, podemos mover la instrucción yield al final del bucle externo para que se ejecute solo una vez por combinación.

    Aquí tienes una versión modificada del código que aborda estos problemas:

    def repartidor_de_cartas():
        rank = ['2','3','4','5','6','7','8','9','10','J','Q','K','A']
        suit = ['S','C','H','D']
        for r in rank:
            for s in suit:
                yield f'{r}{s}'
    
    # Ejemplo de uso:
    g = repartidor_de_cartas()
    print(next(g))  # '2S'
    print(next(g))  # '2C'
    print(next(g))  # '2H'
    

    Aquí, cada llamada a next(g) generará la siguiente combinación de rango y palo. Ten en cuenta que, dado que el generador se crea desde cero cada vez que se llama a la función, no es necesario reiniciar num a cero en esta versión.

Comments are closed.