[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
argument.
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:
print("Bummer")
break # back door
tries += 1
guess = input ("Guess? ")
else:
print("Congratulations!")
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.
Kirby
More information about the Edu-sig
mailing list