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.

¿Por qué varían los resultados de la salida del generador al usar una lista o un ciclo for?

Comportamiento 1

Código con join:

print (' '.join(str(list(random.randrange(100) for j in range(4)))))

salida:

[ 8 2 , 8 3 , 1 2 , 7 1 ]

Lo que esperaba era:

[82,83,12,71]

Observación:

Estoy utilizando la función list() ya que necesito evaluar la expresión del generador. Supongo que aquí es donde me equivoco, ¿no debería usar list() con generadores?

Comportamiento 2:

código: mismo código (sin list()) pero envuelto en otro bucle for:

for _ in range(2**2):
print(' '.join(str(random.randrange(100)) for i in range(4)))

salida:

98 72 56 63
71 12 45 63
83 91 65 89
31 45 65 95

Observación:

Aquí obtengo la salida esperada. Pero no entiendo por qué esto funcionaría en comparación con el Comportamiento 1 con una lista.
Mi entendimiento era que tanto un bucle for como una lista se pueden usar indistintamente para forzar la salida de un generador. ¿Qué me falta para entender la diferencia donde str() toma el número completo en el Comportamiento 2 pero trata la salida como una secuencia de caracteres para el Comportamiento 1?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuesta

    Comportamiento 1

    En el Comportamiento 1, el problema está en el uso de la función str(). Convierte la secuencia de enteros generada por random.randrange() en una cadena de caracteres. Ahora, cuando unimos estas cadenas usando ' '.join(), obtenemos cada carácter unido por un espacio.

    Para evitar esto, necesitamos convertir cada entero en una cadena primero y luego unirlos usando , como delimitador.

    Aquí está el código corregido:

    print(', '.join(str(random.randrange(100)) for j in range(4)))
    

    Comportamiento 2

    En el Comportamiento 2, no estamos usando list() para evaluar la expresión generadora, en su lugar estamos iterando directamente sobre el generador usando un ciclo for. Esto funciona porque un generador produce valores uno por uno y podemos usarlos directamente en el bucle.

    Además, hemos corregido el problema con la función str() en el Comportamiento 2, por lo que estamos obteniendo la salida esperada.

    En resumen, tanto list() como el ciclo for se pueden usar para evaluar una expresión generadora, pero tienen diferentes casos de uso. list() se utiliza cuando necesitamos evaluar toda la secuencia de valores generados por la expresión, mientras que un ciclo for se utiliza cuando necesitamos procesar cada valor por separado. Y, cuando necesitamos convertir enteros en cadenas, debemos hacerlo antes de unirlos usando la función ' '.join().

Comments are closed.