1

所以我正在尝试创建一个函数,它以与 s.upper 相同的方式将字符串的所有字母大写,但采用函数的格式。我想尝试使用 ord() 和 chr() 但说明如果字符串的字符> 90,则将其替换为比原始矿石少 32 的字符。我觉得我有一些碎片,但我不知道如何真正将它们组合在一起。我知道我需要一个字符串累加器,但我不知道如何将它们组合在一起。到目前为止,我有这个:

 def Uppercase(s):
     x = ''
     for ch in s:
     x = -----> confused about what the accumulation would be
     if ch ord() > 91:
         s.replace(ch, chr(ord())-----> not sure that this is possible to implement
4

2 回答 2

4

如果一个字符的ord()值介于 97 和 122 之间(包括两者),那么您可以从中减少 32 以获得相应的大写字母。

str.join使用and的单线list comprehension

>>> def upper_case(s):
    return "".join([ chr(ord(x)-32) if 97<=ord(x)<=122 else x for x in s ])

>>> upper_case("foo bar")
'FOO BAR'

更易读的版本:

>>> def upper_case(s):
    new_strs = []
    for char in s:
        ordi = ord(char)
        if 97 <= ordi <= 122:
            new_strs .append( chr(ordi-32) )
        else:    
            new_strs.append(char)
    return "".join(new_strs)     #join the list using str.join and return
... 
>>> upper_case("foo bar")
'FOO BAR'

>>> from string import ascii_lowercase
>>> upper_case(ascii_lowercase)
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
于 2013-05-06T21:32:50.037 回答
3

使用列表,然后再次将各个字符连接在一起:

def Uppercase(s):
    result = []
    for ch in s:
        value = ord(ch)
        if 97 <= value <= 122:
            value -= 32
        result.append(chr(value))

    return ''.join(result)

我的版本只更改字节值在 97 ( a) 和 122 ( z) 之间的字符。str.join()将字符串列表转换回一个字符串,并带有可选的分隔符文本(此处留空)。

您可以将其折叠为执行相同操作的列表理解:

def Uppercase(s):
    return ''.join([chr(ord(ch) - 32) if 'a' <= ch <= 'z' else ch for ch in s])

但如果您刚开始使用 Python,这可能不太容易理解。

第一个版本的if语句已被条件表达式替换;表单true_expression if some_test else false_expression首先计算some_test,然后根据结果返回true_expressionor false_expression

任一版本都会导致:

>>> Uppercase('Hello world!')
'HELLO WORLD!'
于 2013-05-06T21:33:28.670 回答