All Upper I

 

问题描述:

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,非常的初级,目前自己看视频做在自学,仅此作为自己的思考记录,欢迎大佬们指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值