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.joinandを使用したワンライナー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()オプションの区切り文字テキスト (ここでは空のまま) を使用して、文字列のリストを 1 つの文字列に戻します。

これを、同じことを行うリスト内包表記に折りたたむことができます。

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_expressionsome_testtrue_expressionfalse_expression

どちらのバージョンでも次のようになります。

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