elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  lista a traves de generador
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: lista a traves de generador  (Leído 4,730 veces)
PUAROT

Desconectado Desconectado

Mensajes: 86



Ver Perfil WWW
lista a traves de generador
« en: 29 Diciembre 2016, 23:47 pm »

Muy buenas, me estoy enterando de como funcionan los generadores y me surge una duda

si creo un generador :
Código
  1. def generador():
  2. a,b = 0 , 1
  3. while a < 2500:
  4. yield a
  5. a,b = b,a+b

este lo almaceno en una variable:
Código:
variable = generador()
y luego almaceno en una lista:
Código:
lista = list(variable) 

Estarán todos los valores que genere en la lista ocupando memoria o solo se crearan a demanda por ser un generador  ?

No se si la ventaja del generador con respecto al uso de memoria sigue siendo tal al pasarlo a lista.



« Última modificación: 19 Febrero 2017, 17:09 pm por PUAROT » En línea

Once

Desconectado Desconectado

Mensajes: 120


Ver Perfil WWW
Re: lista a traves de generador
« Respuesta #1 en: 30 Diciembre 2016, 01:09 am »

Hola, cuando haces un list(variable) estás creando un nuevo objeto lista, en este caso a partir de los elementos de un generador.

Por lo que pierdes todas las ventajas que te brinda el generador.

Saludos!


En línea

PUAROT

Desconectado Desconectado

Mensajes: 86



Ver Perfil WWW
Re: lista a traves de generador
« Respuesta #2 en: 30 Diciembre 2016, 14:05 pm »

Ok gracias por contestar, es lo que me imaginaba

Existe alguna forma de usar y acceder a los elementos creados con un generador como si de una lista se tratase ?

No tengo en mente ahora mismo ningún caso practico en mente, simplemente es por aprender el funcionamiento de los generadores.

Gracias otra vez !
En línea

hsk75rv

Desconectado Desconectado

Mensajes: 36



Ver Perfil
Re: lista a traves de generador
« Respuesta #3 en: 30 Diciembre 2016, 20:40 pm »


Un generador es un objeto iterable, por lo tanto, acceder a los elementos creados por el mismo
se puede con un for

Así pues:
Código
  1. def generador():
  2. a,b = 0 , 1
  3. while a < 2500:
  4.  yield a
  5.  a,b = b,a+b
  6.  
  7. variable = list(generador())
  8. for i in variable:
  9.    print i
  10.  
En línea

Once

Desconectado Desconectado

Mensajes: 120


Ver Perfil WWW
Re: lista a traves de generador
« Respuesta #4 en: 31 Diciembre 2016, 06:16 am »

Ok gracias por contestar, es lo que me imaginaba

Existe alguna forma de usar y acceder a los elementos creados con un generador como si de una lista se tratase ?

No tengo en mente ahora mismo ningún caso practico en mente, simplemente es por aprender el funcionamiento de los generadores.

Gracias otra vez !

La verdad lo dudo, es más, analiza un poco la estructura del generador que colocas como ejemplo en el primer comentario. Si quisieras acceder como si fuera una lista al décimo elemento, tendrías que generar TODOS los diez elemtos para poder mostrar el décimo. ahora, siquisieras mostrar el elemento 20, tendrías, que, de nuevo generar TODOS los 20 primeros elementos. Así que no tendría mucho sentido.

Creo que te estás confundiendo un poco, así que recuerda que los generadores fueron pensados para obtener una especie de lista de elementos ordenados, pero que se crean cuando se necesitan para ahorrar memoria. Son muy eficientes cuando los usas en un for porque recuerda que el for en Python no es un contador sino que recorre cualquier elemento iterable. por lo que si necesitas recorrer los primeros 2000 números en Python, necesitas iterar una lista con los 2000 números, lo que en memoria sería muy ineficiente y los generadores solucionan este problema.


Saludos!
En línea

PUAROT

Desconectado Desconectado

Mensajes: 86



Ver Perfil WWW
Re: lista a traves de generador
« Respuesta #5 en: 31 Diciembre 2016, 17:51 pm »

Gracias por las respuestas. Estas dudas que me van surgiendo, la mayoría de las veces al leer código o al intentar escribirlo, me ayudan a entender mejor como funciona esto :-P .
La lista tiene su uso y el generador otro, si por lo que sea necesitamos acceder a los valores como una lista, tendremos que convertir el resultado del generador a lista con el consecuente uso de memoria.
En línea

Yidu

Desconectado Desconectado

Mensajes: 133


Ver Perfil
Re: lista a traves de generador
« Respuesta #6 en: 31 Diciembre 2016, 19:55 pm »

Tambien puedes utilizar el generador como se utilizan las listas por comprension (En el caso de generadores se usan parantesis).

Código
  1. generador = (elem for elem in range(1, 11))

Puedes accedar a sus elementos con la funcion integrada en Python next().

Código
  1. next(generador)
  2. next(generador)
  3. next(generador)

SALIDA:

1
2
3


O recorrerlo integramente mediante un ciclo for:

Código
  1. for i in generador:
  2.    print(i)

SALIDA:

1
2
3
4
5
6
7
8
9
10

Tambien se pueden hacer filtros con los datos que se van generando. Por ejemplo, solo numeros pares:

Código
  1. generador = (elem for elem in range(1, 11) if elem % 2 is 0)

SALIDA:

Código
  1. next(generador)
  2. 2
  3. next(generador)
  4. 4
  5. next(generador)
  6. 6
  7. next(generador)
  8. 8
  9. next(generador)
  10. 10
  11. next(generador)
  12.  
Traceback (most recent call last):
  Python Shell, prompt 7, line 1
builtins.StopIteration:

Si, al final te saldra la advertencia de StopIteracion. Ya que el generador se ha vaciado. Aunque esto tambien se puede hacer con un range e indicando su paso a la salida de cada elemento.

Tambien tienes la opcion con la funcion iter()

Código
  1. a = (range(1, 101))
  2. b = iter(a)

SALIDAS:

Código
  1. next(b)
  2. 1
  3. next(b)
  4. 2
  5. next(b)
  6. 3
  7.  

(Si no usas la el IDE interactivo deberas aplicar la funcion print() para mostrar los resultados con next().

Espero que te haya ayudado. Saludos!  :rolleyes:



« Última modificación: 31 Diciembre 2016, 19:59 pm por Yidu » En línea

PUAROT

Desconectado Desconectado

Mensajes: 86



Ver Perfil WWW
Re: lista a traves de generador
« Respuesta #7 en: 1 Enero 2017, 21:09 pm »

Gracias !!!

El uso de los generadores me va quedando claro, las listas por compresion todavia no tengo claro como se crean.
Se hacer las cosa linea a linea, con su indentación,he leído algo, pero no me queda totalmente claro como se crean
En línea

hsk75rv

Desconectado Desconectado

Mensajes: 36



Ver Perfil
Re: lista a traves de generador
« Respuesta #8 en: 2 Enero 2017, 04:13 am »

Gracias !!!

El uso de los generadores me va quedando claro, las listas por compresion todavia no tengo claro como se crean.
Se hacer las cosa linea a linea, con su indentación,he leído algo, pero no me queda totalmente claro como se crean


Código
  1. lista_normal = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  2. # Lista que creamos indicando uno a uno los elementos
  3.  
  4. lista_comprension = [numeros for numeros in xrange(11)]
  5. """Esta lista tiene los mismos elementos que la anterior
  6. solo que para generarla hemos hecho uso de una expresion.
  7. Para crear listas de comprension debemos seguir la siguiente estructura:
  8.  elemento_a_extraer iterador condicion1 condicion2 condicion3
  9.  
  10. Entonces en el ejemplo anterior de lista_comprension, el elemento
  11. a extraer es numeros, variable que se genera cuando iteramos con el for,
  12. y en este caso, no hemos puesto ninguna condicion.
  13. El orden de ejecucion sera primero el iterador, luego las condiciones
  14. y por ultimo la asignacion a la variable."""
  15.  
  16. lista_comprension_2 = [numeros for numeros in xrange(11) if numeros%2==0 if numeros<=4]
  17. print lista_normal,lista_comprension,lista_comprension_2
  18.  
  19. """La lista_comprension_2 como ves ya tiene mas condicionales, los cuales
  20. se ejecutan de izquierda a derecha.
  21. En este caso los elementos de la lista2 serian todos los numeros(hasta el 10)
  22. cuyo modulo sea 0 y a la vez, menores o iguales que 4"""
  23.  

Además,  ;D http://elclubdelautodidacta.es/wp/2013/04/python-listas-por-comprension-2/
En línea

PUAROT

Desconectado Desconectado

Mensajes: 86



Ver Perfil WWW
Re: lista a traves de generador
« Respuesta #9 en: 2 Enero 2017, 15:10 pm »

Muy buena explicación !!    ;-) ;-) ;-)

 Muchas gracias !!   
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines