總結(jié):
islower()和isupper()僅對字符串中字母的大小寫進(jìn)行判斷,并不會判斷所有字符是否都為英文字母
問題來源
今天碰到一個(gè)需求,簡化了就是驗(yàn)證一個(gè)字符串:
- 不能全是數(shù)字
- 不能全是小寫字母
- 不能全是大寫字母
我的解決方案
時(shí)間比較緊,沒有考慮用正則表達(dá)式的方法,于是寫了個(gè)判斷:
if s.isdigit() or s.islower() or s.isupper():
return False
else:
return True
因?yàn)?code>isdigit會對字符串中所有的字符進(jìn)行測試,當(dāng)所有的字符都為數(shù)字字符時(shí),返回真,否則返回假;
于是我想當(dāng)然的認(rèn)為islower和isupper也會對所有的字符進(jìn)行測試,僅當(dāng)全為小寫字母或全為大寫字母是為真,期望的是:
-
1234,asdf,ASDF這類是通過測試,整段函數(shù)返回False -
1234asdf,1234ASDF,asdfASDF這類是可以不能通過測試的,整段函數(shù)返回True
測試時(shí)發(fā)現(xiàn)的問題
寫完代碼后,我寫了個(gè)單元測試之后,發(fā)現(xiàn)字符串1234yarving也會通過測試,整段函數(shù)返回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.,如果所有的字母全是小寫并且至少有一個(gè)字母,返回真,否則返回假 -
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.,如果所有的字母全是小寫并且至少有大個(gè)字母,返回真,否則返回假
isupper和islower這兩個(gè)方法僅會判斷字符串里的字母是否大小寫,而不會對其他的字符進(jìn)行判斷,所以1234yarving中包含的字母全為小寫,會通過islower()測試,整段函數(shù)返回False