On Tue, Nov 28, 2017 at 03:11:25PM +0900, Stephen J. Turnbull wrote: > Steven D'Aprano writes: > > > The subset of iterators which are created as generators are *also* > > called generators, > > As long as we're being precise, I don't think that is precisely correct: > > >>> (x for x in range(1)) > <generator object <genexpr> at 0x10dee5e08> > >>> iter(range(1)) > <range_iterator object at 0x10dab83f0> > >>> iter((1,)) > <tuple_iterator object at 0x10df109b0> > > The two iterators have the same duck-type, the generator is different.
How is the generator different? It quacks like a range_iterator and tuple_iterator, it swims like them, it flies like them. Is there some iterator method or protocol that generators don't support? > A generator (object) is, of course, an interable. And also an iterator: py> collections.abc py> isinstance((x+1 for x in range(5)), collections.abc.Iterator) True > > Most of the time the distinction doesn't actually matter, since you > > cannot (easily?) create a generator without first creating a > > generator function. > > At least you can create a generator (object) with the generator > function created and called implicitly by using a generator > expression. Ah yes, I forget about generator expressions, thanks. -- Steve _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/