loops

wbowers william.bowers at gmail.com
Sat Oct 18 21:47:26 CEST 2008


On Oct 18, 11:31 am, Terry Reedy <tjre... at udel.edu> wrote:
> Gandalf wrote:
> > On Oct 18, 12:39 pm, Duncan Booth <duncan.bo... at invalid.invalid>
> > wrote:
> >> Gandalf <goldn... at gmail.com> wrote:
> >>> how can I do width python a normal for loop width tree conditions like
> >>> for example :
> >>> for x=1;x<=100;x+x:
> >>>     print x
> >> What you wrote would appear to be an infinite loop so I'll assume you meant
> >> to assign something to x each time round the loop as well. The simple
> >> Python translation of what I think you meant would be:
>
> >> x = 1
> >> while x <= 100:
> >>    print x
> >>    x += x
>
> >> If you really insist on doing it with a for loop:
>
> >> def doubling(start, limit):
> >>     x = start
> >>     while x <= limit:
> >>         yield x
> >>         x += x
>
> >> ...
>
> >> for x in doubling(1, 100):
> >>     print x
>
> > I was hopping to describe it with only one command. most of the
> > languages I know use this.
> > It seems weird to me their is no such thing in python. it's not that I
> > can't fined a solution it's all about saving code
>
> Python: 'makes common things easy and uncommon things possible'.
>
> The large majority of use cases for iteration are iterating though
> sequences, actual and virtual, including integers with a constant step
> size.  Python make that trivial to do and clear to read. Your example is
> trivially written as
>
> for i in range(11):
>    print 2**i
>
> Python provide while loops for more fine-grain control, and a protocol
> so *reuseable* iterators can plug into for loops. Duncan showed you
> both.  If you *need* a doubling loop variable once, you probably need
> one more than once, and the cost of the doubling generator is amortized
> over all such uses.  Any Python proprammer should definitely know how to
> write such a thing without hardly thinking.  We can squeeze a line out
> of this particular example:
>
> def doubling(value, limit):
>    while value <= limit:
>      yield value
>      value += value
>
> Terry Jan Reedy

I agree that using range() for simple iterations is the way to go.
Here are some examples of python expressions you'd use in specific
situations:

# instead of for (i = 0; i < 100; i++)
for i in range(100): pass

# instead of for (i = 10; i < 100; i++)
for i in range(10, 100): pass

# instead of for (i = 1; i < 100; i += 2)
for i in range(1, 100, 2): pass

# instead of for (i = 99; i >= 0; i--)
for i in range(100)[::-1]: pass

There's always a way to do it, and it's almost always really simple :-D



More information about the Python-list mailing list