问题描述:
Check if a given string has all symbols in upper case. If the string is empty or doesn't have any letter in it - function should return True.
Input: A string.
Output: a boolean.
def is_all_upper(text: str) -> bool:
# your code here
return False
if __name__ == '__main__':
print("Example:")
print(is_all_upper('ALL UPPER'))
# These "asserts" are used for self-checking and not for an auto-testing
assert is_all_upper('ALL UPPER') == True
assert is_all_upper('all lower') == False
assert is_all_upper('mixed UPPER and lower') == False
assert is_all_upper('') == True
assert is_all_upper(' ') == True
assert is_all_upper('444') == True
assert is_all_upper('55 55 5') == True
print("Coding complete? Click 'Check' to earn cool rewards!")
思考一:
想到的首先是字符串的判断,于是有了如下的一行:
def is_all_upper(text: str) -> bool:
# your code here
while text.isupper() or text=='' or text.isspace() or text.isdigit():
return True
return False
这时候问题来了,我得到的运行结果是AssertionError,是下面这一行出现问题。
str.isalnum() #所有字符都是数字或者字母
str.isalpha() #所有字符都是字母
str.isdigit() #所有字符都是数字
str.islower() #所有字符都是小写
str.isupper() #所有字符都是大写
str.istitle() #所有单词都是首字母大写,像标题
str.isspace() #所有字符都是空白字符、\t、\n
用这几个代码都是判断所有的同一种类的字符,并不能混个判断,就是上面的字符串(‘55 55 5’)中有数字和空字符。于是有了接下来的思考二。
思考二:
怎么才能判断字符串中有没有包含字母。百度搜了一下,发现只有正则表达式才能做到。去了菜鸟教程(https://www.runoob.com/python/python-reg-expressions.html)又复习了下正则表达式。
发现可以用findall和re.compile函数:
re.compile 函数:
compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和search() 这两个函数使用。
语法格式为:re.compile(pattern[, flags])
findall:
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
语法格式为:findall(string[, pos[, endpos]])
因此import re,然后只要让匹配到的正则表达式等于空列表,就表示不包含字母,无论大小写。
首先生成一个正则表达式包含了所有的大小写字母,text_alpha=re.compile('[a-zA-Z]+') 。
然后让字符串去匹配,只有当没有匹配的时候才返回空列表,然后判断text_alpha.findall(text)==[]
于是对自己上面的代码进行修改,最终得到了如下:
def is_all_upper(text: str) -> bool:
# your code here
import re
text_alpha=re.compile('[a-zA-Z]+')
while text.isupper() or text=='' or text.isspace() or text.isdigit() or text_alpha.findall(text)==[]:
return True
return False
至此这个简单的小任务完成。
思考三:
查看其他用户更简单的解决方案进行学习。
方案一:最简单的方法,直接让text ==text.upper()
def is_all_upper(text: str) -> bool:
return text == text.upper()
查看官方文档,str.
upper
() 返回原字符串的副本,其中所有区分大小写的字符均转换为大写。
自己实验一下效果:
>>> text='PYthon'
>>> text.upper()
'PYTHON'
>>> text_1='12345'
>>> text_1.upper()
'12345'
>>> text_2=' '
>>> text_2.upper()
' '
>>> text_3='abc 123 !@# ABC'
>>> text_3.upper()
'ABC 123 !@# ABC'
也就是说str.upper()方法upper()方法会将小写字母转换成大写字母,原本存在的大写字母将保留,并且不会对非字母字符进行更改,也不会报错。这个方法用在这里简直再合适不过了。
方案二:运用for循环
def is_all_upper(text: str) -> bool:
for s in text:
if s.islower():
return False
return True
把text中的每个字符单独拿出来判断,只要是有小写字母的,都返回False。这时,题目就能变化为,只要不出现小写字母,都为True,完全符合题目。这个方法也很妙,自己确实没有想到。
方案三:
def is_all_upper(text: str) -> bool:
return text.isupper() if any(i.isalpha() for i in text) else True
这个暂时没有搞懂,可能因为还没自学到,回头再来看看这个。
题目来源为checkio(https://py.checkio.org/)中的Elementary,非常的初级,目前自己看视频做在自学,仅此作为自己的思考记录,欢迎大佬们指导。