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