beginner question (True False help)

wxjmfauth at gmail.com wxjmfauth at gmail.com
Fri Aug 9 04:05:33 EDT 2013


Le jeudi 8 août 2013 22:29:00 UTC+2, Terry Reedy a écrit :
> On 8/8/2013 7:41 AM, Chris Angelico wrote:
> 
> > On Thu, Aug 8, 2013 at 7:20 AM,  <wxjmfauth at gmail.com> wrote:
> 
> >>>>> def z2():
> 
> >> ...     letters = 'abc'
> 
> >> ...     while True:
> 
> >> ...         c = input('letter: ')
> 
> >> ...         if c not in letters:
> 
> >> ...             print('end, fin, Schluss')
> 
> >> ...             break
> 
> >> ...         else:
> 
> >> ...             print('do stuff')
> 
> >
> 
> >
> 
> > Minor quibble: I don't like having a hard exit followed by an "else".
> 
> 
> 
> Whereas I tend to prefer to have the two alternatives cleanly marked as 
> 
> alternatives by both being indented the same.
> 
> 
> 
> Many alternatives are not so trivial as the above. I remember reading 
> 
> one snippet in the CPython codebase where the 'else' was omitted and the 
> 
> if clause subdivided into about three paths. It took at least a minute 
> 
> to determine that all paths terminated in such a way that there really 
> 
> was an inplied else. How much easier it would have been to read the code 
> 
> if the author had explicitly types the 'else'.
> 
> 
> 
> > If the "if" branch will unconditionally quit the loop (with a break,
> 
> > here, but could also be a return, a thrown exception, etc etc), I
> 
> > would prefer to see the "else" removed and its code unindented one
> 
> > level. Maybe this is just personal preference, though, learned from
> 
> > assembly language programming where a "block if" looks something like
> 
> > this:
> 
> >
> 
> > ; if x == y:
> 
> > CMP x,y
> 
> > JNZ .else
> 
> > ; Code for "x == y"
> 
> > JMP .endif
> 
> > .else:
> 
> > ; Code for "else"
> 
> > .endif
> 
> >
> 
> > Putting an unconditional departure in the "x == y" branch makes the
> 
> > "JMP .endif" redundant.
> 
> 
> 
> Python is not assembly ;-). 3.3 effectively ignores the extraneous 
> 
> 'else:'. Either way, if the condition is false, control jumps to the 
> 
> second print. For what little it matters, the bytecode is the same length.
> 
> 
> 
> def f():
> 
>    while True:
> 
>      if a:
> 
>        b = 1
> 
>        break
> 
>      else:
> 
>        b = 2
> 
> 
> 
>  >>> dis(f)
> 
>    2           0 SETUP_LOOP              25 (to 28)
> 
> 
> 
>    3     >>    3 LOAD_GLOBAL              0 (a)
> 
>                6 POP_JUMP_IF_FALSE       19
> 
> 
> 
>    4           9 LOAD_CONST               1 (1)
> 
>               12 STORE_FAST               0 (b)
> 
> 
> 
>    5          15 BREAK_LOOP
> 
>               16 JUMP_ABSOLUTE            3
> 
> 
> 
>    7     >>   19 LOAD_CONST               2 (2)
> 
>               22 STORE_FAST               0 (b)
> 
>               25 JUMP_ABSOLUTE            3
> 
>          >>   28 LOAD_CONST               0 (None)
> 
>               31 RETURN_VALUE
> 
> 
> 
> def f():
> 
>    while True:
> 
>      if a:
> 
>        b = 1
> 
>        break
> 
>      b = 2
> 
> 
> 
>  >>> dis(f)
> 
>    2           0 SETUP_LOOP              25 (to 28)
> 
> 
> 
>    3     >>    3 LOAD_GLOBAL              0 (a)
> 
>                6 POP_JUMP_IF_FALSE       19
> 
> 
> 
>    4           9 LOAD_CONST               1 (1)
> 
>               12 STORE_FAST               0 (b)
> 
> 
> 
>    5          15 BREAK_LOOP
> 
>               16 JUMP_FORWARD             0 (to 19)
> 
> 
> 
>    6     >>   19 LOAD_CONST               2 (2)
> 
>               22 STORE_FAST               0 (b)
> 
>               25 JUMP_ABSOLUTE            3
> 
>          >>   28 LOAD_CONST               0 (None)
> 
>               31 RETURN_VALUE
> 
> 
> 
> -- 
> 
> Terry Jan Reedy

-----

The problem of this guy is not at this level.
His problem is more simply, he most probably
does not understand how to build a correct,
proper loop. 

"What I wanted to happen is when the user typed something ...
... would cause the program to stop ... "


jmf



More information about the Python-list mailing list