On Sat, Dec 14, 2019 at 9:46 PM Andrew Barnert <abarn...@yahoo.com> wrote:
> > Of the top of my head, I can’t think of a single non-contrived example > of using a bare iterator in case that is not specifically doing something > “special”. > > Calling iter on a container is hardly the only way to get an Iterator. You > also get Iterators from open, map, filter, zip, genexprs, generator > functions, most itertools functions, etc. thanks -- I was being pretty brain dead. But most of those are usually immediately iterated over again.So in common use, I'd say the fileobject from open() is a biggie -- that's one of the few where folks will commonly do something other than simply iterate over the whole thing at once anyway. In fact, I think files are one of the most common ways people learn about > iterators. There are certainly a lot of StackOverflow dups asking why `for > line in file:` gives them no lines when just 10 lines earlier the same file > had 20 lines. > EXACTLY ! here we have it -- the most common case of folks working directly with a iterator, and they are confused with "for". So first() wouldn't add any new source of confusion. Yes, I can see that folks might do somethig like: my_file - open(something) the_header = first(my_file) and then later on be surprised that another call to first() produces a different result. But I think they'd only be surprsed once :-) and file objects are a bit special, because they have a whol other API: my_file.readline() in fact, In my code, and most code I've seen, that's exactly what's used: # get the header header = my_file.readline() # parse the rest for line in my_file(): do_something(line) I could use next() instead of readline() but I never do. Probably because I learned Python long before files were an iterator. But I don't' see newbies doing it, either. (of course, I'm not teaching it that way ;-) ). But I'm not sure it's just that - I think it's because most of us are writing that kind of code to deal with any foile-like object, not any generic iterator. As in: a file object happens to be an iterator (so I can put it in a for loop), rather than a file object is an iterator, that happens to have some other methods for working with it. Now that I think about it, that's also the case with sequences -- we think of the fact that we are working with a list, and it also happens to be an iterable, so we can put it in a for loop. rather than thinking about writing general code for any iterator, that might be a sequence. Which is why I'd use a_list[0], rather than next(iter(a_list)). but I can't use dict.keys()[0], for instance. So it would be nice to have a way to do that that was more obvious than: next(iter(d.keys()) -CHB -- Christopher Barker, PhD Python Language Consulting - Teaching - Scientific Software Development - Desktop GUI and Web Development - wxPython, numpy, scipy, Cython
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/ENUQIHEJ4OF3YFY2CHRZVLT2METJPAQE/ Code of Conduct: http://python.org/psf/codeofconduct/