文字のリストをループしてi
いるため、文字です。次に、文字をインデックスとしてdata
使用して、それを格納しようとします。i
それはうまくいきません。
enumerate()
インデックスと値を取得するために使用します。
def shifttext(shift):
input=raw_input('Input text here: ')
data = list(input)
for i, char in enumerate(data):
data[i] = chr((ord(char) + shift) % 26)
output = ''.join(data)
return output
ジェネレーター式を使用してこれを単純化できます。
def shifttext(shift):
input=raw_input('Input text here: ')
return ''.join(chr((ord(char) + shift) % 26) for char in input)
しかし、今ではうまくいかないことに気付くでしょう% 26
。ASCII コードポイントは 26 の後に始まります。
>>> ord('a')
97
ord('a')
代わりにモジュラスを使用できるようにするには、値を使用する必要があります。減算すると、値が 0 ~ 25 の範囲になり、後で再度加算します。
a = ord('a')
return ''.join(chr((ord(char) - a + shift) % 26) + a) for char in input)
ただし、それは小文字に対してのみ機能します。これで問題ないかもしれませんが、入力を小文字にすることで強制できます。
a = ord('a')
return ''.join(chr((ord(char) - a + shift) % 26 + a) for char in input.lower())
次に、関数からの入力を要求して、1 つの仕事をうまく行うことに集中させると、次のようになります。
def shifttext(text, shift):
a = ord('a')
return ''.join(chr((ord(char) - a + shift) % 26 + a) for char in text.lower())
print shifttext(raw_input('Input text here: '), 3)
これをインタラクティブプロンプトで使用すると、次のようになります。
>>> print shifttext(raw_input('Input text here: '), 3)
Input text here: Cesarsalad!
fhvduvdodgr
もちろん、今では句読点も一緒に使われています。最後の改訂、現在は文字をシフトするだけです:
def shifttext(text, shift):
a = ord('a')
return ''.join(
chr((ord(char) - a + shift) % 26 + a) if 'a' <= char <= 'z' else char
for char in text.lower())
そして、次のようになります。
>>> print shifttext(raw_input('Input text here: '), 3)
Input text here: Ceasarsalad!
fhdvduvdodg!