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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Generadores y yield en Python…
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Generadores y yield en Python…  (Leído 6,712 veces)
El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Generadores y yield en Python…
« en: 13 Diciembre 2022, 19:43 pm »

Hola gente linda, ¿cómo están?
La consulta es ¿le encontraron en la vida real alguna utilidad a los generadores?
Los consulto porque me pase 3 días enteros leyendo sobre el tema y en realidad
todos los ejemplos son con números primos, impares, pares y no pasa de eso.
Bueno es todo lo que necesito saber, ya que me falta aprender sobre yield from
y otras cositas, pero si no tiene una utilidad significativa continuo con el siguiente
tema.-

Código
  1. def principal():    
  2.    def tabla_del_cinco(oper):
  3.        num = 1
  4.        while True:
  5.            yield num , num * oper
  6.            num += 1
  7.  
  8.    try:
  9.        operando = int(input("\n Ingrese la tabla que desea consultar...: "))
  10.    except:
  11.        print("\n Debe ingresar un entero...")
  12.    else:
  13.        tabla = tabla_del_cinco(operando)
  14.  
  15.        print('\n===== "uno" para mostrar - "otro" para finalizar =====\n')
  16.  
  17.        while True:
  18.            salir = input('"Ingrese...: ')
  19.            if salir == '1':
  20.                tupla = tuple(next(tabla))
  21.                final = f"{operando} x {tupla[0]} = {tupla[1]}"
  22.                print(final)
  23.            else:
  24.                break
  25.  
  26.  
  27. if __name__ == "__main__":
  28.    principal()

Slds. Daniel ☕☕☕


En línea

Danielㅤ


Desconectado Desconectado

Mensajes: 1.578


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #1 en: 14 Diciembre 2022, 00:18 am »

Hola compañero, aquí explican muy bien y detallado cual es la función que cumple yield y como se debe usar:

https://medium.com/flux-it-thoughts/python-generadores-y-yield-c7ef66d44a94


Saludos


« Última modificación: 14 Diciembre 2022, 00:26 am por Danielㅤ » En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #2 en: 14 Diciembre 2022, 20:01 pm »

Hola tocayo, gracias por ocuparte, para serte franco es la página que más
había leído, por eso sigo con ta intriga de como aplicar en la práctica los
generadores y yield, seguiremos investigando, gracias, abrazo…

Slds. Daniel ☕☕☕
En línea

Danielㅤ


Desconectado Desconectado

Mensajes: 1.578


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #3 en: 14 Diciembre 2022, 20:18 pm »

Bien, desde mi punto de vista personal y como programador yo te recomiendo que no te ocupes mucho de eso ahora, los generadores son poco utilizados y los programadores avanzados los suelen usar en casos muy específicos.
Yo he creado muchos códigos y programas en los años activos como programador y nunca le he dado importancia a yield además que no le necesitado, de hecho de los muchos códigos que he visto solo apenas unos cuantos utilizaban yield.

Es mejor que sigas adelante y aprendas otras cosas, que te enfoques en cosas más importantes y necesarias.


Un abrazo
En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #4 en: 15 Diciembre 2022, 21:07 pm »

Como verán continuo con lo mismo, en este caso el generador tiene una ventaja de tiempo con respecto a una manera «tradicional» de contar la cantidad de registros de un archivo .txt.-
Alguien me podría decir, ¿ cómo puedo saber en memoria cuanto ocupa una y otra?, gracias

Código
  1. import codecs
  2. import time
  3.  
  4. inicio = time.time()
  5. filas = (row for row in open('Movimientos.txt'))
  6.  
  7. row = 0
  8. for fil in filas:
  9.    row += 1
  10.  
  11. print(row)
  12. fin = time.time()
  13. print(fin-inicio)
  14. print("====================================")
  15. inicio = time.time()
  16. fila = 0
  17. with codecs.open('Movimientos.txt', 'r', encoding='utf-8') as archivo:
  18.    for row in archivo:
  19.        fila += 1
  20.  
  21. print(fila)
  22. fin = time.time()
  23. print(fin-inicio)

Citar
51800
0.015956401824951172
========================================================
51800
0.11170220375061035

gracias Dani por los consejos...

Slds. Daniel ☕☕☕
En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #5 en: 17 Diciembre 2022, 19:20 pm »

Hola gente, ¿cómo están?, bueno, conseguí lo deseado, solo que los resultados
me resultan todavía un tanto confusos, seguiré estudiando el tema.-

Código
  1. import codecs
  2. import time
  3. import sys
  4.  
  5. inicio = time.time()
  6. filas = (rows for rows in open('Movimientos.txt'))
  7.  
  8. row = 0
  9. for fil in filas:
  10.    row += 1
  11.  
  12. print(f"Con comprensión de generadores...: {row} registros")
  13. fin = time.time()
  14. tiempoUno=fin-inicio
  15. print(f"Tiempo consumido con comprensión de generadores...:{tiempoUno:.10f}")
  16.  
  17. print(f"Peso en memoria...; {sys.getsizeof(filas)} bytes")
  18. print("==============================================================")
  19. inicio = time.time()
  20. fila = 0
  21. with codecs.open('Movimientos.txt', 'r', encoding='utf-8') as archivo:
  22.    for row in archivo:
  23.        fila += 1
  24.  
  25. print(f"De manera tradicional...: {fila} registros")
  26. fin = time.time()
  27. tiempoDos=fin-inicio
  28. print(f"Tiempo consumido de manera tradicional...:{tiempoDos:.10f}")
  29. print(f"Peso en memoria...; {sys.getsizeof(archivo)} bytes")
  30. print("==============================================================")
  31. print(f" Diferencia...: {tiempoUno-tiempoDos:.10f}")
  32.  

Slds. Daniel ☕☕☕
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.314


Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #6 en: 17 Diciembre 2022, 23:58 pm »

No procede realizar comparativa de tiempos...

Los generadores vienen en ayuda del programador para simplificar tanto la cantidad de código a escribir, como en establecer el flujo adecuadamente sin complicarse las barbas.

Si no logras entender eso, entonces no serás capaz de sacarle provecho.
En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #7 en: 18 Diciembre 2022, 14:59 pm »

Hola, gracias por el consejo.
Te comento que me llevo a esto, el blog donde encontré una explicación interesante sobre
generadores, decía tener un archivo .txt con más de 64.000.000 de registros, con la
manera "tradicional", por momentos la memoria colapsaba, en cambio, construyendo
un generador no ocurría lo mismo.-
Ya que estamos, en el segundo caso, ¿debo cerrar el archivo?
 
Código
  1. import codecs
  2.  
  3. with codecs.open('Movimientos.txt', 'r', encoding='utf-8') as archivo:
  4.    print(type(archivo))
  5.  
  6. filas = (rows for rows in open('Movimientos.txt'))
  7. print(type(filas))

Slds. Daniel ☕☕☕
En línea

reymosquito

Desconectado Desconectado

Mensajes: 81


Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #8 en: 18 Diciembre 2022, 20:26 pm »

Bueno, se ve que  hay muchos "programadores" que dan su opinión, así que no lo haré, pero te comento algo que ya vas descubriendo:
los generadores no son para ahorrar "tiempo", al contrario son más lerdos que la compresión de listas
por ejemplo, sirven para ahorrar memoria, en grandes cantidades dependiendo de la dsiponibilidad de ella sin el uso de generadores la memoria colapsa.
hay varias formas de crear generadores.
para medir el uso de memoria se usa uno de los métodos  que trae el módulo sys
además hay otras formas de medir el "tiempo" la que estás usando es la más básica que abunda en la red.
 
Código
  1. import sys
  2. dobles_lc   = [num **2 for num in range(1,5000)]
  3. dobles_ge = (num **2 for num in range(1,5000))
  4.  
  5. print(sys.getsizeof(dobles_lc))
  6. print(sys.getsizeof(dobles_ge))
  7.  

En ese ejemplo creo dos "listas" una con por compresión la primera y la segunda con generadores después imprimo la memoria que ocupa cada una y ahí verás la diferencia que ocupan.  Aumenta el tamaño y seguí comparando. Espero que te oriente al uso real de los generadores
En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Generadores y yield en Python…
« Respuesta #9 en: 18 Diciembre 2022, 21:20 pm »

Hola, rey, muchas gracias por ocuparte.
En primer lugar, no me hagas esos chistes, 6 días esperando que aparecieras, no te olvides
que tengo 70, si te vas de vacaciones avisa, jajajajaja...
Como siempre digo unas pocas líneas tuyas me enseñan más que 10 páginas del libro.-
Seguramente me quedan un puñadito de preguntas, pero por el momento es suficiente.-
Al resto que participo nuevamente muchas gracias.-

Slds. Daniel ☕☕☕
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Generadores electricos
Electrónica
s3tH 1 6,496 Último mensaje 16 Noviembre 2009, 00:18 am
por skapunky
Generadores de contraseñas
Seguridad
juthemist 1 1,568 Último mensaje 23 Septiembre 2014, 04:21 am
por engel lex
generadores de claves
Dudas Generales
ionurion 1 1,472 Último mensaje 19 Enero 2015, 16:54 pm
por engel lex
[Resuelto] [DUDA] Yield en php
PHP
DarK_FirefoX 2 1,551 Último mensaje 30 Marzo 2015, 22:47 pm
por DarK_FirefoX
Generadores en javascript
Desarrollo Web
Ali Baba 2 1,849 Último mensaje 28 Mayo 2017, 02:12 am
por Ali Baba
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines