En Sun, 11 Oct 2009 19:46:06 -0300, Philip Semanchuk <phi...@semanchuk.com> escribió:
On Oct 11, 2009, at 5:51 PM, bartc wrote:
Mensanator wrote:
On Oct 10, 3:15�pm, kj <no.em...@please.post> wrote:

I'm coaching a group of biologists on basic Python scripting. �One
of my charges mentioned that he had come across the advice never
to use loops beginning with "while True".[...]

If you know this "exit that is always reached",
why do you pretend not to know it by writing
"while True"?

When I'm starting to code something I haven't yet fully worked out, it often starts with an infinite loop like this, until the body is coded and I've figured out how to escape from it.

At the end if may or may not be tidied up, depending on how much work it is to reconcile several possible break points into a single terminating condition to be place at one end, and whether that is likely to break or obfuscate a currently working program.

I think you bring up a good point. I think "while True" has some legitimate uses (like event loops), and I don't mind seeing it there. What I don't like is goto, and to a lesser extent break, exit, and multiple returns. I don't find too many cases where they're the clearest way to express things. And where one sees a "while True", one can almost always find a "break" or two lurking in the loop.

IMHO, break, goto, etc. have their place, but they're ripe for abuse which leads to spaghetti code. Since the OP is teaching non-programmers to write code, I think the potential for abuse is especially important to keep in mind. I'd think that teaching them a tool like "while True" would encourage the "code now, design later" trap that even experienced programmers -- including myself -- sometimes fall into. Writing "while <condition>" instead forces one to stop at the beginning of the loop and think at least a little about exactly what it's meant to accomplish.

I don't think so; forcing ALL loops to have the condition at the start is unnatural in some cases. Some loops are best written with the condition at the end (do/while or repeat/until in Pascal) and some loops require a test in the middle (in Python, while True: + break, because we don't have an unconditional loop).

In addition, isn't it easier to figure out how this loop ends --

    while (condition1) and (condition2) and (condition3):
        ...lots of code here...

than this one?

    while True:
        ...lots of code here...
        if not condition1:
           break
        ...lots of code here...
        if not condition2:
           break
        ...lots of code here...
        if not condition3:
           break

For a loop that can be written as the first one above, sure, that's pretty explicit. For a loop as the second one, try to rewrite it with the condition at the start: you'll end with duplicated tests and/or duplicated code and/or artificial boolean variables added.

Some algorithms are *naturally* expressed as a loop with the condition in the middle. Forcing the condition to always happen at the start requires artificial steps that complicate unnecesarily the code.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to