On Friday, April 29, 2016 at 6:55:56 PM UTC-7, Christopher Reimer wrote:
> On 4/29/2016 6:29 PM, Stephen Hansen wrote:
> > If isupper/islower were perfect opposites of each-other, there'd be no 
> > need for both. But since characters can be upper, lower, or *neither*, 
> > you run into this situation.
> 
> Based upon the official documentation, I was expecting perfect opposites.
> 
> str.islower(): "Return true if all cased characters [4] in the string 
> are lowercase and there is at least one cased character, false otherwise."
> 
> https://docs.python.org/3/library/stdtypes.html?highlight=islower#str.islower
> 
> str.isupper(): "Return true if all cased characters [4] in the string 
> are uppercase and there is at least one cased character, false otherwise."
> 
> https://docs.python.org/3/library/stdtypes.html?highlight=isupper#str.isupper


Just to take this discussion in a more pure logic direction.  What you call 
perfect opposites (that is, the functions being negations of each other) is not 
what the similar wording in the documentation actually implies: you shouldn't 
have been expecting that.

What you should have been expecting is a symmetry.  Say you have a string G.  
islower(G) will return a certain result.  Now take every letter in G and swap 
the case, and call that string g.  isupper(g) will always return the same 
result is islower(G).

More succinctly, for any string x, the following is always ture:

islower(x) == isupper(swapcase(x))

But that is not the same thing, and does not imply, as the following identity 
(which it turns out is not always true, as we've seen):

islower(x) == not isupper(x)


Another example of functions that behave like this are ispositive and 
isnegative.  The identity "ispositive(x) == isnegative(-x)" is always true.  
However, "ispositive(x) == not isnegative(x)" is false if x == 0.


However, I can understand your confusion, because there are some pairs of 
functions where both identities are true, and if you've seen a few of them it's 
fairly easy for your intuition to overgeneralize a bit.  An example I can think 
of offhand is iseven(x) and isodd(x), for any integer x.  The identities 
"iseven(x) == isodd(x^1)" and "iseven(x) == not isodd(x)" are both always true.


Carl Banks
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to