您正在遍历字符列表,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())
如果我们然后从函数中请求输入以使其专注于做好一项工作,则变为:
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!