總結(jié):
islower()
和isupper()
僅對字符串中字母的大小寫進行判斷向臀,并不會判斷所有字符是否都為英文字母
問題來源
今天碰到一個需求巢墅,簡化了就是驗證一個字符串:
- 不能全是數(shù)字
- 不能全是小寫字母
- 不能全是大寫字母
我的解決方案
時間比較緊,沒有考慮用正則表達式的方法券膀,于是寫了個判斷:
if s.isdigit() or s.islower() or s.isupper():
return False
else:
return True
因為isdigit
會對字符串中所有的字符進行測試君纫,當所有的字符都為數(shù)字字符時,返回真芹彬,否則返回假蓄髓;
于是我想當然的認為islower
和isupper
也會對所有的字符進行測試,僅當全為小寫字母或全為大寫字母是為真舒帮,期望的是:
-
1234
,asdf
,ASDF
這類是通過測試会喝,整段函數(shù)返回False -
1234asdf
,1234ASDF
,asdfASDF
這類是可以不能通過測試的,整段函數(shù)返回True
測試時發(fā)現(xiàn)的問題
寫完代碼后玩郊,我寫了個單元測試之后肢执,發(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.
,如果所有的字母全是小寫并且至少有一個字母侦厚,返回真耻陕,否則返回假 -
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()
測試淳蔼,整段函數(shù)返回False