Foros del Web » Programando para Internet » Python »

Dudilla en generadores

Estas en el tema de Dudilla en generadores en el foro de Python en Foros del Web. Buenas, Bueno, soy novato en Python y exactamente tengo una duda que me acaba de surgir ahora y no comprendo. Estoy metido con la comprensión ...
  #1 (permalink)  
Antiguo 28/02/2012, 12:28
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 17 años, 6 meses
Puntos: 74
Dudilla en generadores

Buenas,

Bueno, soy novato en Python y exactamente tengo una duda que me acaba de surgir ahora y no comprendo.

Estoy metido con la comprensión de diccionarios, listas... y generadores. Es en éste es último dónde me he atascado un poco

Veamos, si tengo esto:
Código Python:
Ver original
  1. lista = [1,2,3,4,5];
  2. generador = (n*2 for n in lista);
  3. print(generador);
El resultado es un generador así?
<generator object <genexpr> at 0x024AB120>
Ahora, si hago así:
Código Python:
Ver original
  1. for n in generador:
  2.     print(n);
El resultado es el esperado:
2
4
6
8
10

Mi pregunta, ¿por qué el primer resultado es distinto al segundo?
Según he leído, ¿es porque los generadores se usan en cualquier lugar que se necesite un objeto iterable, cómo por ejemplo un for?
¿y el resultado primero que viene a decir?

Saludos y gracias,
  #2 (permalink)  
Antiguo 28/02/2012, 13:06
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Dudilla en generadores

Los iterables se pueden dividir en 2 partes:
- Gerenadores
- No generadores

Los generadores van generando una serie de objetos al vuelo. Mientras que cualquier otro iterable los almacena.

Esto tiene ventajas y desventajas:
Los generadores ocupan menos memoria y son mas eficientes en cuanto al uso del CPU. Los generadores pueden ser infinitos y por lo tanto no puedes saber su longitud ademas no puedes acceder a ellos por medio de indices. Una vez usado un generador no puedes volver a usarlo. Tienes que instanciar uno nuevo.

¿En que casos es conveniente usar un generador?
En la mayoría de los casos, excepto en los casos donde necesites guardar en memoria una serie de objetos o necesites acceder a valores previamente calculados.

Si tu imprimes una lista, python te imprime su representación por que es un objeto de tamaño finito y ademas puedes iterarlo cuantas veces quieras. En cambio como un generador puede o no ser finito y ademas como solo puede ser una vez, así que no va a iterar sobre el generador y después que quede inservible.

Así que cuando imprimes un generador lo único que hace es decirte de que clase es y la localidad de memoria donde se encuentra.
  #3 (permalink)  
Antiguo 29/02/2012, 07:28
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Dudilla en generadores

Vale agregar qué sucede cuando FOR toma un generador. Para entenderlo, intentemos simularlo con un while:
Código Python:
Ver original
  1. while(true):
  2.     try:
  3.         n = generador.next()
  4.     except StopIteration:
  5.         break
Es decir, el for llama al método next() que obtiene el siguiente elemento del generador, hasta que éste indica su finalización lanzando un StopIteration
  #4 (permalink)  
Antiguo 29/02/2012, 13:07
Avatar de OsSk4R  
Fecha de Ingreso: octubre-2006
Ubicación: $this->home
Mensajes: 824
Antigüedad: 17 años, 6 meses
Puntos: 74
Respuesta: Dudilla en generadores

¡Buah! Buenísimas y ricas respuestas. ¡Excelente! Con unos "profes" así da gusto aprender
La verdad es que me habéis aclarado bastante la cosa jeje.

Muchas gracias,

PD: Cada día me gusta más Python
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:30.