Sinnlose Liste in Beispiel zu einer Funktion in itertools ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
NiklasRosenstein
User
Beiträge: 17
Registriert: Donnerstag 16. Juni 2011, 21:38

Hallo,

ich habe vor kurzem die cycle-Funktion des itertools-Moduls kennengelernt. ;)
Bei der Funktion steht ein Beispiel zum Nachbauen der Funktion dabei:

Code: Alles auswählen

def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    saved = []
    for element in iterable:
        yield element
        saved.append(element)
    while saved:
        for element in saved:
              yield element
Nun meine Frage, warum wird hier quasi eine kopie von 'iterable' erstellt ?
Das müsste doch so genauso **und** performanter funktionieren, oder etwa nicht ?

Code: Alles auswählen

def cycle(iterable):
    for element in iterable:
          yield element

Vielen Dank schoneinmal,

Niklas
deets

Noe. Deine Funktion cycelt doch ueberhaupt nicht.

Code: Alles auswählen


from itertools import islice

def falsches_cycle(iterable):
    #while True:
        for item in iterable:
            yield item


def g():
    yield 1
    yield 2
    yield 3

print list(islice(falsches_cycle([1, 2, 3]), 0, 20))
print list(islice(falsches_cycle(g()), 0, 20))
Und dann kommentier mal das "while True" aus, und guck, was der zweite Fall macht -> kleiner Hinweis: nicht jedes iterable kann re-iteriert werden...
NiklasRosenstein
User
Beiträge: 17
Registriert: Donnerstag 16. Juni 2011, 21:38

Uups hab irgendwie was beim posten verhaun :D
Ich meinte diese Funktion. ^^

Code: Alles auswählen

Code:
def cycle(iterable):
    while True:
        for element in iterable:
              yield element
So, jetzt cyclets ^^

-> kleiner Hinweis: nicht jedes iterable kann re-iteriert werden...
Ahhh, klar. Daran hatte ich nicht gedacht. Danke :)
Zuletzt geändert von NiklasRosenstein am Freitag 17. Juni 2011, 22:14, insgesamt 1-mal geändert.
deets

Nein, tut's nicht. Lies bitte nochmal meinen post.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Hier ein Beispiel, wo es nicht tut (ich habe am Ende ^C gedrückt, um aus der Endlosschleife rauszukommen):

Code: Alles auswählen

>>> class Foo(object):
...     def __init__(self, l):
...         self.l = l
...     def __iter__(self):
...         return self
...     def next(self):
...         if self.l:
...             return self.l.pop()
...         else:
...             raise StopIteration()
... 
>>> iterable = Foo(range(10))
>>> for element in iterable:
...     print element,
... 
9 8 7 6 5 4 3 2 1 0
>>> def cycle(iterable):
...     while True:
...         for element in iterable:
...             yield element
... 
>>> iterable = Foo(range(10))
>>> it = cycle(iterable)
>>> it.next()
KeyboardInterrupt
NiklasRosenstein
User
Beiträge: 17
Registriert: Donnerstag 16. Juni 2011, 21:38

Hmm, ok ihr habt mich überzeugt. :mrgreen:
Das macht tatsächlich Sinn wenn man zB einen Generator übergibt.

Das Beispiel von derdon verstehe ich nicht ganz. :?
(was für eine Schande eine variable 'l' zu nennen, das sieht aus wie ne 1 :twisted: )

Das ist mir irgendwie gerade zu komplex. :K

Danke,
Niklas
Antworten