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
--
https://mail.python.org/mailman/listinfo/python-list