[Edu-sig] a short essay about programming

kirby urner kirby.urner at gmail.com
Sun Apr 22 03:51:18 CEST 2012

On Sat, Apr 21, 2012 at 6:11 AM, John Zelle <john.zelle at wartburg.edu> wrote:
> Kirby,
> There are some nice thoughts here that I don't really disagree with, but your code examples don't use the while conditions well. If you put a condition on the loop, there should be no reason to retest the same condition inside the loop. Think of the loop condition as a guard, inside the loop it is true, outside the loop it has become false.

Ah now there's a good rule of thumb maybe.

Whatever sentinel condition let you into the loop should not be
retested inside the loop.

That sounds cogent.

A related but somewhat contrary mental picture is:  only let live fish
into the fish tank, but some die once already inside the tank.

Are there cases where you need a preview, aren't ready to exit yet, so
need to re-test inside?

> That suggests the more elegant (in my eyes) way to write your first example as a sort of sentinel loop:
> guess = int(input("Guess? "))
> while(guess != secret):  // as long as the user didn't get it, get another guess

Pausing here:  I see this style quite often, of parens crammed right
up against the while keyword.  I

'm always worried when I see that in beginner Python that they're
imagining while is a callable, and their feeding it some kind of

Same with if:  I'll get if(x>5):

You're an experienced Pythonista though...

>    print("Nope, try again")
>    guess = int(input("Guess? "))
> // Here we know the condition is false
> print("You guessed it")
> There's no reason for the re-test of the loop condition to either break or continue.

Or is there sometimes?  I'm thinking this is an excellent rule of
thumb of the kind that needs to be broken.

Python in particular is interesting because it tries to stay simple -
economical in providing control over flow.

Other languages gorge themselves on all imaginable kinds of loop
syntax, bulking up their keyword vocabulary in the process sometimes
(e.g. 'until').

I agree your examples look more elegant and economical than mine
featuring a re-test.

> This applies to the second example as well, but a post-loop conditional will still be required to figure out why the loop quit:
> allowed = 5
> guess = int(input("Guess? "))
> tries = 1
> while guess != secret and tries < allowed:   //user gets to try again
>     print("Nope, try again")
>     guess = int(input("Guess? "))
>     tries += 1
> if tries <= allowed:
>    print("You guessed it")
> else:
>    print("You've maxed out.")

This is where the while statement's option else suite proves useful,
if you want to execute a block precisely because the while condition
has flipped.

I tend to find this useful in conjunction with 'break' though,
exploding my earlier hypothesis that while loops should have only one
entrance and one exit.

while guess != secret:  # front door
    if tries > allowed:
        break  # back door
    tries += 1
    guess = input ("Guess? ")

Most public spaces have multiple exits, including a fire escape for
emergencies.  We haven't even touched on try: / except: as a way to
escape a while loop.

Mostly I just want these considerations to rise to the surface and
ruffle the surface awareness of the beginner mind programmer.

This is being a good thread for that.


More information about the Edu-sig mailing list