Thilo は問題を正確に説明します。それを見てみましょう:
''' Cesar Cipher '''
def encrypt(word, shift):
word = word.lower()
for i in word:
r = chr(ord(i)+shift)
if r > "z":
r = chr(ord(i) - 26 + shift)
word = word.replace(i, r)
return word
encrypt('abc', 1)
何が起こるか試してみてください:
First loop:
i = 'a'
r = chr(ord('a')+1) = 'b'
word = 'abc'.replace('a', 'b') = 'bbc'
Second loop:
i = 'b'
r = chr(ord('b')+1) = 'c'
word = 'bbc'.replace('b', 'c') = 'ccc'
Third loop:
i = 'c'
r = chr(ord('c')+1) = 'd'
word = 'ccc'.replace('c', 'd') = 'ddd'
のすべてのインスタンスをi
に置き換えるのではなくr
、これだけを置き換えます。これをどのように行いますか?インデックスを追跡している場合は、そのインデックスで置き換えることができます。組み込みenumerate
関数を使用すると、各インデックスと対応する各値を同時に取得できます。
for index, ch in enumerate(word):
r = chr(ord(ch)+shift)
if r > "z":
r = chr(ord(ch) - 26 + shift)
word = new_word_replacing_one_char(index, r)
あとはその関数を書くだけnew_word_replacing_one_char
です。スライシングを知っていれば、これは非常に簡単です。(スライスをまだ学習していない場合は、文字列を文字列に変換したい場合があるlist
ので、単に と言っword[index] = r
て、最後に文字列に戻すことができます。)