4

ROT13 関数を作成していますが、次の関数が機能しない理由がわかりません。

def ROT(string):
    # y = 0
    for char in string:
        x = ord(char)
        if 97 <= x < 110 or 65 <= x < 78:
            # string[y]=char.replace(char, chr(x+13))
            char=char.replace(char, chr(x+13))
            print(char)
            # y+=1
        elif x >= 110 or 78 <= x < 91:
            # string[y]=char.replace(char, chr(x-13))
            char=char.replace(char, chr(x-13))
            print(char)
            # y+=1
    return string

string = ROT('Hello, lorem ipsum dolor sit amet')
print(string)

関数の呼び出しは、元の文字列を出力するだけです。上記のコメント行でわかるように (少し読みにくい場合は申し訳ありません)、変数 y を定義して文字列をインクリメントし、それにアクセスしようとしましたが、実行時エラーが発生しました。私が思いついた解決策は、関数の先頭に空の文字列を作成することでした(そして、ほとんどの人が使用する解決策であると思われるグーグルから)が、その理由を誰も説明していません。すべての文字を置き換えている場合、元の文字列を返すことができないのはなぜですか?

4

4 に答える 4

4

コードの問題は、元の文字列を操作していないことです。元の文字列ではなく、一時変数charを置き換えるだけです。Python では文字列は不変であるため、新しい文字列を使用してみて、元の文字列を置き換える代わりに、新しい文字列に文字を追加するだけでかまいません。お気に入り:

modified_string = ""
for char in string:
     #whatever condition
     modified_string += #value to be added
于 2013-11-22T17:57:24.893 に答える
2

元の文字列を返していました。試してみてください

def ROT(string):
#   y = 0
    result = ""
    for char in string:
        x = ord(char)
        if 97 <= x < 110 or 65 <= x < 78:
#           string[y]=char.replace(char, chr(x+13))
            char=char.replace(char, chr(x+13))
            result = result + char
            print(char)
            continue
#           y+=1
        elif x >= 110 or 78 <= x < 91:
#           string[y]=char.replace(char, chr(x-13))
            char=char.replace(char, chr(x-13))
            print(char)
            result = result + char
            continue
#           y+=1
        result = result + char
    return result

string = ROT('Hello, lorem ipsum dolor sit amet')
print(string)
于 2013-11-22T17:57:56.883 に答える
2

Python の文字列は不変です。

于 2013-11-22T18:00:06.437 に答える