160 votes

une expression pour un générateur infini?

Est-il un simple générateur d'expression de ce que peuvent produire infini éléments?

C'est une question purement théorique. Pas besoin d'une pratique de "" réponse ici :)


Par exemple, il est facile de faire un fini générateur:

my_gen = (0 for i in xrange(42))

Cependant, pour faire un infini j'ai besoin de "polluer" mon espace de noms avec un bidon de fonction:

def _my_gen():
    while True:
        yield 0
my_gen = _my_gen()

Faire les choses dans un fichier séparé et d' import-ing-ci ne compte pas.


Je sais aussi qu' itertools.repeat fait exactement cela. Im curieux de savoir si il y a une doublure solution sans que.

292voto

katrielalex Points 40655

itertools offre trois infini générateurs:

Je ne sais pas du tout les autres dans la bibliothèque standard.


Depuis que vous avez demandé pour un one-liner:

__import__("itertools").count()

175voto

ncoghlan Points 10779
for x in iter(int, 1): pass
  • Deux arguments iter = zéro argument appelable + sentinelle de la valeur
  • int() retourne toujours 0

Par conséquent, iter(int, 1) est infini et l'itérateur. Il y a évidemment un grand nombre de variations sur ce thème (en particulier une fois que vous ajoutez lambda dans le mélange). Une variante de noter en particulier iter(f, object()), comme à l'aide d'un fraîchement créé objet en tant que sentinelle de la valeur garantit presque à l'infini itérateur quel que soit le callable utilisé comme premier argument.

27voto

sysfault Points 2761

vous pouvez parcourir un appelable en renvoyant une constante toujours différente de la sentinelle de iter ()

 g1=iter(lambda:0,1)
 

10voto

gnibbler Points 103484

Votre système d'exploitation peut fournir quelque chose qui peut être utilisé comme générateur infini. Par exemple sur linux

 for i in (0 for x in open('/dev/urandom')):
    print i
 

évidemment, ce n'est pas aussi efficace que

 for i in __import__('itertools').repeat(0)
    print i
 

9voto

delnan Points 52260

Aucun qui ne veut pas utiliser à l'interne un autre infini itérateur défini comme une classe/fonction/générateur (non -expression, d'une fonction avec des yield). Un générateur d'expression tire toujours anoter itérable et ne fait rien, mais le filtrage et la cartographie de ses éléments. Vous ne pouvez pas aller à partir d'éléments finis à l'infini avec seulement map et filter, vous avez besoin d' while (ou for qui n'est pas arrêter, qui est exactement ce que nous ne pouvons pas avoir l'aide de seulement for et finis les itérateurs).

Trivia: PEP 3142 est superficiellement similaire, mais sur une inspection plus minutieuse, il semble qu'il nécessite toujours l' for de l'alinéa (donc pas de (0 while True) pour vous), c'est à dire seulement fournit un raccourci pour itertools.takewhile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X