总结: islower() 和 isupper() 仅对字符串中字母的大小写进行判断, 并不会判断所有字符是否都为英文字母
问题来源
今天碰到一个需求, 简化了就是验证一个字符串:
不能全是数字
不能全是小写字母
不能全是大写字母
我的解决方案
时间比较紧, 没有考虑用正则表达式的方法, 于是写了个判断:
- if s.isdigit() or s.islower() or s.isupper():
- return False
- else:
- return True
因为 isdigit 会对字符串中所有的字符进行测试, 当所有的字符都为数字字符时, 返回真, 否则返回假;
于是我想当然的认为 islower 和 isupper 也会对所有的字符进行测试, 仅当全为小写字母或全为大写字母是为真, 期望的是:
1234
, asdf, ASDF 这类是通过测试, 整段函数返回 False
1234asdf, 1234ASDF, asdfASDF 这类是可以不能通过测试的, 整段函数返回 True
测试时发现的问题
写完代码后, 我写了个单元测试之后, 发现字符串 1234yarving 也会通过测试, 整段函数返回 True, 这和我的初衷不同了, 于是 help(s.islower) 和 help(s.isupper) 查看了下:
寻根问题
- help(s.islower):
- Return True if all cased characters in S are lowercase and there is at least one cased character in S, False otherwise.
, 如果所有的字母全是小写并且至少有一个字母, 返回真, 否则返回假
- help(s.isupper):
- Return True if all cased characters in S are uppercase and there is at least one cased character in S, False otherwise.
, 如果所有的字母全是小写并且至少有大个字母, 返回真, 否则返回假
isupper 和 islower 这两个方法仅会判断字符串里的字母是否大小写, 而不会对其他的字符进行判断, 所以 1234yarving 中包含的字母全为小写, 会通过 islower() 测试, 整段函数返回 False
来源: http://www.jianshu.com/p/59443e263f4a