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.
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 pararank
como parasuit
, 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ónyield
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:
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 reiniciarnum
a cero en esta versión.