<div dir="ltr"><div class="gmail_default" style=""><div class="gmail_default" style="font-family:monospace,monospace"><span style="font-family:arial,sans-serif">On Mon, Nov 27, 2017 at 3:55 PM, Steven D'Aprano </span><span dir="ltr" style="font-family:arial,sans-serif"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span><span style="font-family:arial,sans-serif"> wrote:</span><br></div><div class="gmail_extra" style=""><div class="gmail_quote" style=""><blockquote class="gmail_quote" style="font-family:arial,sans-serif;margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">On Mon, Nov 27, 2017 at 12:17:31PM +0300, Kirill Balunov wrote:<br></span><span class="gmail-"><div class="gmail_default" style="font-family:monospace,monospace;display:inline">​​</div><br>> 2. Should this work only for generators or for any iterators?<br><br></span>I don't understand why you are even considering singling out *only*<br>generators. A generator is a particular implementation of an iterator. I<br>can write:<br><br>def gen():<br><span class="gmail-">   yield 1; yield 2; yield 3<br><br></span>it = gen()<br><br>or I can write:<br><br>it = iter([1, 2, 3])<br><br>and the behaviour of `it` should be identical.<br><span class="gmail-"><br></span><br></blockquote><div style="font-family:arial,sans-serif"><br></div><div style=""><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">​I can see where this is coming from. The thing is that "iterator" and "generator" are mostly synonymous, except two things:</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">(1) Generators are iterators that are produced by a generator function</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">(2) Generator functions are sometimes referred to as just "generators"</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">The concept of "generator" thus overlaps with both "iterator" and "generator function".</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">Then there's also "iterator" and "iterable", which are two different things:</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">(3) If `</font><font face="monospace, monospace">obj</font><font face="arial, helvetica, sans-serif">` is an *iterable*, then `</font><font face="monospace, monospace">it = iter(obj)</font><font face="arial, helvetica, sans-serif">` is an *iterator* (over the contents of `</font><font face="monospace, monospace">obj</font><font face="arial, helvetica, sans-serif">`)</font></div><font face="arial, helvetica, sans-serif"><br></font></div><div style=""><font face="arial, helvetica, sans-serif">(</font><div class="gmail_default" style="display:inline"><font face="arial, helvetica, sans-serif">​4) ​Iterators yield values, for example on explicit calls to </font><font face="monospace, monospace">next(it)</font><font face="arial, helvetica, sans-serif">.</font></div></div><div style=""><font face="arial, helvetica, sans-serif"><div class="gmail_default" style="display:inline"><br></div></font></div><div style=""><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">Personally I have leaned towards keeping a clear distinction between "generator function" and "generator"​, which leads to the situation that "generator" and "iterator" are mostly synonymous for me. Sometimes, for convenience, I use the term "generator" to refer to "iterators" more generally. This further seems to have a minor benefit that "generators" and "iterables" are less easily confused with each other than "iterators" and "iterables".</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">I thought about this issue some time ago for the `</font><font face="monospace, monospace">views</font><font face="arial, helvetica, sans-serif">` package, which has a separation between sequences (</font><font face="monospace, monospace">seq</font><font face="arial, helvetica, sans-serif">) and other iterables (</font><font face="monospace, monospace">gen</font><font face="arial, helvetica, sans-serif">):</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="monospace, monospace"><a href="https://github.com/k7hoven/views">https://github.com/k7hoven/views</a></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">The functionality provided by `</font><font face="monospace, monospace">views.gen</font><font face="arial, helvetica, sans-serif">` is not that interesting—it's essentially a subset of </font><font face="monospace, monospace">itertools</font><font face="arial, helvetica, sans-serif"> functionality, but with an API that parallels `</font><font face="monospace, monospace">views.seq</font><font face="arial, helvetica, sans-serif">` which works with sequences (iterable, sliceable, chainable, etc.). I used the name `</font><font face="monospace, monospace">gen</font><font face="arial, helvetica, sans-serif">`, because iterator/iterable variants of the functionality can be implemented with generator functions (although also with other kinds of iterators/iterables). Calling the thing `</font><font face="monospace, monospace">iter</font><font face="arial, helvetica, sans-serif">` would have conflicted with the builtin `</font><font face="monospace, monospace">iter</font><font face="arial, helvetica, sans-serif">`.</font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">HOWEVER, this naming can be confusing for those that lean more towards using "generator" to also mean "generator function", and for those that are comfortable with the term "iterator" despite its resemblance to "iterable".</font></div><font face="arial, helvetica, sans-serif"><br></font></div><div style=""><div class="gmail_default" style="display:inline"><font face="arial, helvetica, sans-serif">Now I'm actually seriously considering to consider renaming `</font><font face="monospace, monospace">views.gen</font><font face="arial, helvetica, sans-serif">` to `</font><font face="monospace, monospace">views.iter</font><font face="arial, helvetica, sans-serif">` when I have time. After all, there's already `</font><font face="monospace, monospace">views.range</font><font face="arial, helvetica, sans-serif">` which "conflicts" with the builtin </font><font face="monospace, monospace">range</font><font face="arial, helvetica, sans-serif">.</font></div></div><div style=""><div class="gmail_default" style="display:inline"><font face="arial, helvetica, sans-serif"><br></font></div></div><div style=""><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">​Anyway, the point is that the naming is suboptimal.​</font></div></div><div style=""><font face="arial, helvetica, sans-serif"><div class="gmail_default" style="display:inline"><br></div></font></div><div style=""><font face="arial, helvetica, sans-serif"><div class="gmail_default" style="display:inline">SOLUTION: Maybe (a) all iterators should be called iterators or (b) all iterators should be called generators, regardless of whether they are somehow a result of a generator function having been called in the past. </div></font></div><div style=""><font face="arial, helvetica, sans-serif"><div class="gmail_default" style="display:inline"><br></div></font></div><div style=""><div class="gmail_default" style="display:inline"><font face="arial, helvetica, sans-serif">(I'm not going into the distinction between things that can receive values via `</font><font face="monospace, monospace">send</font><font face="arial, helvetica, sans-serif">` or any other possible distinctions between different types of iterators and iterables.)</font></div></div><div style=""><font face="arial, helvetica, sans-serif"><div class="gmail_default" style="display:inline"><br></div></font></div><div style=""><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">​—Koos​</font></div><font face="arial, helvetica, sans-serif"><br></font></div><div style=""><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">​(discussion originated from python-ideas, but cross-posted to python-dev in case there's more interest there)​</font></div><br></div><div style=""><font face="arial, helvetica, sans-serif"><br></font></div></div></div></div><font face="arial, helvetica, sans-serif">-- <br></font><div class="gmail_signature"><font face="arial, helvetica, sans-serif">+ Koos Zevenhoven + <a href="http://twitter.com/k7hoven" target="_blank">http://twitter.com/k7hoven</a> +</font></div>
</div>