2012-09-04 3 views
-1

Question 1comment faire un objet itérable comme ça?

comment faire un objet itérable comme ceci:

0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 .... 

Question 2

si la liste d'utilisation (obj) sur l'objet serait au-dessus de ce manger de la mémoire de la machine? comment l'éviter?

S'il vous plaît ne pas utiliser python2

+0

merci rendre malade deux questions – Max

+2

En outre, si c'est des devoirs, nous apprécierions si vous utilisez le 'devoirs 'tag afin que nous puissions vous aider à apprendre au lieu de simplement transmettre les réponses. –

+0

non, pas un devoir – Max

Répondre

3

Vous pouvez faire un générateur infini qui compte et vers le bas:

def updown(n): 
    while True: 
     for i in range(n): 
      yield i 
     for i in range(n - 2, 0, -1): 
      yield i 

uptofive = updown(6) 
for i in range(20): 
    print uptofive.next(), 

serait sortie:

0 1 2 3 4 5 4 3 2 1 0 1 2 3 4 5 4 3 2 1 

Vous ne pouvez pas empêcher list(updown(6)) d'essayer de consommer toute la mémoire, non. Comme le dirait le docteur: "Alors ne fais pas ça!".

Utilisez plutôt les appels .next(), ou utilisez votre générateur avec une autre instruction qui limite le nombre de fois que vous faites une itération sur le générateur. Le itertools.islice() function ferait juste que:

import itertools 
list(itertools.islice(updown(6), 20)) 
+0

Vous avez un doublon "5" là-dedans. – mhawke

+0

En Python 2, 'xrange' pourrait être un peu mieux dans ce contexte. – cdarke

+0

@cdarke: pour les petites séries, ne vous embêtez pas, et il restera portable avec un minimum d'agitation. –

1

Une alternative est d'utiliser itertools.cycle():

from itertools import cycle 

def oscillator(start, stop): 
    # assumes stop >= start 
    return cycle(range(start, stop+1) + range(stop-1, start, -1)) 

o = oscillator(0, 5) 
for i in range(30): 
    print o.next(), 
+1

ne fonctionne pas dans python3 – Max

Questions connexes