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 :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 :)

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. :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