itertools cycle() docs question
Tim Chase
python.list at tim.thechases.com
Wed Aug 21 15:10:06 EDT 2019
On 2019-08-21 11:27, Tobiah wrote:
> In the docs for itertools.cycle() there is
> a bit of equivalent code given:
>
> 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
>
>
> Is that really how it works? Why make
> the copy of the elements? This seems
> to be equivalent:
>
>
> def cycle(iterable):
> while iterable:
> for thing in iterable:
> yield thing
Compare the results of
>>> import itertools as i
>>> def tobiahcycle(iterable):
... while iterable:
... for thing in iterable:
... yield thing
...
>>> def testiter():
... yield input()
... yield input()
...
Now, see how many times input() gets called for itertools.islice()
>>> for v in i.islice(i.cycle(testiter()), 6): print(v)
Note that you only provide input twice, once for each yield statement.
Compare that to your tobiahcycle() method:
>>> for v in i.islice(tobiahcycle(testiter()), 6): print(v)
The yield gets called every time through the interator and it
doesn't produce the same results.
-tkc
More information about the Python-list
mailing list