[Python-ideas] More classical for-loop

Nick Timkovich prometheus235 at gmail.com
Fri Feb 17 17:51:39 EST 2017


I think fundamentally by special-casing a for-loop variant, you have a
construct with limited/no generality that's simply an additional burden to
learn. You're kind of doing the opposite of converting print from a
statement into a function. I far prefer the print function because it's a
function like every other and doesn't have it's own curious syntax (if only
assert was also fixed..., assert(cond, reason) has bit me a few times)

It's nice that you can put *anything* that supports the iterator protocol
after "for x in" and Python will "iterate" over it, however that is defined
for the object. The thing might not have a useful integer index at all
(dictionaries, file systems...) and the loop doesn't care. If you *do* want
that index, you can enumerate() or range(len()), which I sometimes do if
modifying a list in-place, but it's kinda icky as David suggests.

Nick

On Fri, Feb 17, 2017 at 4:31 PM, David Mertz <mertz at gnosis.cx> wrote:

> Iterating over range(len(collection)) is one of the worst anti-patterns in
> Python. I take great pains to slap my students who do that.
>
> On Feb 17, 2017 9:32 AM, "Mikhail V" <mikhailwas at gmail.com> wrote:
>
>>
>> On 17 February 2017 at 17:37, Chris Angelico <rosuav at gmail.com> wrote:
>>
>>> On Sat, Feb 18, 2017 at 3:30 AM, Mikhail V <mikhailwas at gmail.com> wrote:
>>> > On 17 February 2017 at 04:59, Chris Angelico <rosuav at gmail.com> wrote:
>>> >>
>>> >> On Fri, Feb 17, 2017 at 2:13 PM, Mikhail V <mikhailwas at gmail.com>
>>> wrote:
>>> >> > Common use case:
>>> >> >
>>> >> > L = [1,3,5,7]
>>> >> >
>>> >> > for i over len(L):
>>> >> >    e = L[i]
>>> >> >
>>> >> > or:
>>> >> >
>>> >> > length = len(L)
>>> >> > for i over length:
>>> >> >    e = L[i]
>>> >>
>>> >> Better use case:
>>> >>
>>> >> for i, e in enumerate(L):
>>> >>
>>> >
>>> > This would be more compact, yet less readable, more error prone
>>> variant.
>>> > I'd avoid it it all costs and even if I don't need the index further
>>> in loop
>>> > body,
>>> > (which happens rarely in my experience) I write e=L[i] in second line
>>> > to make the code more verbose and keep the flow order.
>>> > So your variant (and those proposed in PEP-212) could serve in list
>>> > comprehensions for example, but for common 'expanded' code  I find it
>>> > decline of readability, and creating totally different variants for
>>> same
>>> > iteration idea.
>>> > But partially that could be simply matter of habit and love to
>>> contractions.
>>>
>>> If you don't need the index, why not just iterate over the list directly?
>>>
>>> for e in L:
>>>
>>> That's the single most obvious way to step through a collection in
>>> Python. What do you need to count up to the length for?
>>>
>>>
>> I have said I need the index, probably you've misread my last comment.
>> Further more I explained why I think iteration over index should be the
>> preferred way, it help with readability a lot.
>> All my learning years ended up with rewriting most code to "for i in
>> range()"
>> and I slap myself when I start to write "for e in L".
>> It is exactly where TOOWTDI applies perfectly and it is integer iteration
>> for me.
>>
>> Mikhail
>>
>> _______________________________________________
>> Python-ideas mailing list
>> Python-ideas at python.org
>> https://mail.python.org/mailman/listinfo/python-ideas
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20170217/4c5ec6d8/attachment.html>


More information about the Python-ideas mailing list