Velocity Reviews > Boolean confusion

# Boolean confusion

Guest
Posts: n/a

 05-09-2007

Hello all,
I'm having trouble understanding why the following code evaluates as it
does:

>>> string.find('0200000914A','.') and len('0200000914A') > 10

True
>>> len('0200000914A') > 10 and string.find('0200000914A','.')

-1

In the 2.4 Python Reference Manual, I get the following explanation for the
'and' operator in 5.10 Boolean operations:
" The expression x and y first evaluates x; if x is false, its value is
returned; otherwise, y is evaluated and the resulting value is returned."

Based on what is said above, shouldn't my first expression (
string.find('0200000914A','.') and len('0200000914A') > 10) evaluate to
false b/c my 'x' is false? And shouldn't the second expression evaluate to
True?

Greg

--
View this message in context: http://www.nabble.com/Boolean-confus...html#a10393362
Sent from the Python - python-list mailing list archive at Nabble.com.

Diez B. Roggisch
Guest
Posts: n/a

 05-09-2007

>
> Hello all,
> I'm having trouble understanding why the following code evaluates as it
> does:
>
>>>> string.find('0200000914A','.') and len('0200000914A') > 10

> True
>>>> len('0200000914A') > 10 and string.find('0200000914A','.')

> -1
>
> In the 2.4 Python Reference Manual, I get the following explanation for
> the 'and' operator in 5.10 Boolean operations:
> " The expression x and y first evaluates x; if x is false, its value is
> returned; otherwise, y is evaluated and the resulting value is returned."
>
> Based on what is said above, shouldn't my first expression (
> string.find('0200000914A','.') and len('0200000914A') > 10) evaluate to
> false b/c my 'x' is false? And shouldn't the second expression evaluate to
> True?

The first evaluates to True because len(...) > 10 will return a boolean -
which is True, and the semantics of the "and"-operator will return that
value.

And that precisely is the reason for the -1 in the second expression.

y=-1

and it's just returned by the and.

in python, and is implemented like this (strict evaluation nonwithstanding):

def and(x, y):
if bool(x) == True:
return y
return x

Diez

Antoon Pardon
Guest
Posts: n/a

 05-09-2007
On 2007-05-09, Greg Corradini <(E-Mail Removed)> wrote:
>
> Hello all,
> I'm having trouble understanding why the following code evaluates as it
> does:
>
>>>> string.find('0200000914A','.') and len('0200000914A') > 10

> True
>>>> len('0200000914A') > 10 and string.find('0200000914A','.')

> -1
>
> In the 2.4 Python Reference Manual, I get the following explanation for the
> 'and' operator in 5.10 Boolean operations:
> " The expression x and y first evaluates x; if x is false, its value is
> returned; otherwise, y is evaluated and the resulting value is returned."
>
> Based on what is said above, shouldn't my first expression (
> string.find('0200000914A','.') and len('0200000914A') > 10) evaluate to
> false b/c my 'x' is false? And shouldn't the second expression evaluate to
> True?

The find method doesn't return a boolean, but returns the index where
the substring was found with -1 indicating it wasn't found. If you just
want to check wether one string is a substring of an other, use the in
operator.

>>> '.' in '0200000914A' and len('0200000914A') > 10

False
>>> len('0200000914A') > 10 and '.' in '0200000914A'

False

--
Antoon Pardon

Guest
Posts: n/a

 05-09-2007

Thank you Diez and Antoon for demystifing this problem. I see where I've been
going wrong.

Diez B. Roggisch-2 wrote:
>
>
>>
>> Hello all,
>> I'm having trouble understanding why the following code evaluates as it
>> does:
>>
>>>>> string.find('0200000914A','.') and len('0200000914A') > 10

>> True
>>>>> len('0200000914A') > 10 and string.find('0200000914A','.')

>> -1
>>
>> In the 2.4 Python Reference Manual, I get the following explanation for
>> the 'and' operator in 5.10 Boolean operations:
>> " The expression x and y first evaluates x; if x is false, its value is
>> returned; otherwise, y is evaluated and the resulting value is returned."
>>
>> Based on what is said above, shouldn't my first expression (
>> string.find('0200000914A','.') and len('0200000914A') > 10) evaluate to
>> false b/c my 'x' is false? And shouldn't the second expression evaluate
>> to
>> True?

>
> The first evaluates to True because len(...) > 10 will return a boolean -
> which is True, and the semantics of the "and"-operator will return that
> value.
>
> And that precisely is the reason for the -1 in the second expression.
>
> y=-1
>
> and it's just returned by the and.
>
> in python, and is implemented like this (strict evaluation
> nonwithstanding):
>
> def and(x, y):
> if bool(x) == True:
> return y
> return x
>
> Diez
> --
> http://mail.python.org/mailman/listinfo/python-list
>
>

--
View this message in context: http://www.nabble.com/Boolean-confus...html#a10393705
Sent from the Python - python-list mailing list archive at Nabble.com.

Guest
Posts: n/a

 05-09-2007

On 2007-05-09, Greg Corradini <(E-Mail Removed)> wrote:
>
> Hello all,
> I'm having trouble understanding why the following code evaluates as it
> does:
>
>>>> string.find('0200000914A','.') and len('0200000914A') > 10

> True
>>>> len('0200000914A') > 10 and string.find('0200000914A','.')

> -1
>
> In the 2.4 Python Reference Manual, I get the following explanation for
> the
> 'and' operator in 5.10 Boolean operations:
> " The expression x and y first evaluates x; if x is false, its value is
> returned; otherwise, y is evaluated and the resulting value is returned."
>
> Based on what is said above, shouldn't my first expression (
> string.find('0200000914A','.') and len('0200000914A') > 10) evaluate to
> false b/c my 'x' is false? And shouldn't the second expression evaluate to
> True?

>The find method doesn't return a boolean, but returns the index where
>the substring was found with -1 indicating it wasn't found. If you just
>want to check wether one string is a substring of an other, use the in
>operator.

>>> '.' in '0200000914A' and len('0200000914A') > 10

False
>>> len('0200000914A') > 10 and '.' in '0200000914A'

False

Thank you Diez and Antoon for demystifing this problem. I see where I've
been going wrong.
--
View this message in context: http://www.nabble.com/Boolean-confus...html#a10393765
Sent from the Python - python-list mailing list archive at Nabble.com.