Seite 1 von 1
Sinnlose Liste in Beispiel zu einer Funktion in itertools ?
Verfasst: Freitag 17. Juni 2011, 20:07
von NiklasRosenstein
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
Re: Sinnlose Liste in Beispiel zu einer Funktion in itertool
Verfasst: Freitag 17. Juni 2011, 20:18
von 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...
Re: Sinnlose Liste in Beispiel zu einer Funktion in itertool
Verfasst: Freitag 17. Juni 2011, 21:53
von NiklasRosenstein
Uups hab irgendwie was beim posten verhaun

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

Re: Sinnlose Liste in Beispiel zu einer Funktion in itertool
Verfasst: Freitag 17. Juni 2011, 21:59
von deets
Nein, tut's nicht. Lies bitte nochmal meinen post.
Re: Sinnlose Liste in Beispiel zu einer Funktion in itertool
Verfasst: Freitag 17. Juni 2011, 22:07
von derdon
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
Re: Sinnlose Liste in Beispiel zu einer Funktion in itertool
Verfasst: Freitag 17. Juni 2011, 22:18
von NiklasRosenstein
Hmm, ok ihr habt mich überzeugt.
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

)
Das ist mir irgendwie gerade zu komplex. :K
Danke,
Niklas