if then elif

thebjorn BjornSteinarFjeldPettersen at gmail.com
Wed Oct 10 19:24:51 EDT 2007


On Oct 10, 11:03 pm, Larry Bates <larry.ba... at websafe.com> wrote:
[...]
>
> Boolean problem:
>
> if cal or fat <= 0
>
> That may be the way you say it or "think" it but it won't work.
>
> 'cal or fat' is evaluated first.  Since they both have values this ALWAYS
> evaluates to 1 which is NEVER less than or equal to 0.

That's not correct. The comparison operator has higher presedence than
the or operator, so the above is interpreted as:

    if (cal) or (fat <= 0):

This idiom is occasionally useful in a couple of scenarios like e.g.
default and mutable function arguments:

    def foo(n=None):
        n = n or [42]

which is very common in Perl code, but causes problems if you pass it
an empty list. The better way of doing that in Python is probably:

    def foo(n=None):
        n = n is None and [42]

but if you're going to write that much, it's clearer to just go with
the canonical:

    def foo(n=None):
        if n is None:
            n = [42]

but I digress :-)

> You are looking for
>
> if (cal <= 0) or (fat <=0):
>
> (Note: Parenthesis not required, but it may help you understand precedence of
> evaluation.

That is a correct coding of the OP's intentions, although I would
think that the number of fat grams could indeed be zero for some
foods(?) so perhaps it would be more correct to say:

   if cal <= 0 or fat < 0:

>  Also read here:
>
> http://www.ibiblio.org/g2swap/byteofpython/read/operator-precedence.html
>
> -Larry

Good table, except for higher presedence being further down in the
table which might be confusing pedagogically.

-- bjorn




More information about the Python-list mailing list