<p>您在字符列表上循环,因此<code>i</code>是一个字符。然后尝试使用<code>i</code>字符作为索引将其存储回<code>data</code>。那不行。</p>
<p>使用<code>enumerate()</code>获取索引<em>和</em>值:</p>
<pre><code>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
</code></pre>
<p>可以使用生成器表达式简化此过程:</p>
<pre><code>def shifttext(shift):
input=raw_input('Input text here: ')
return ''.join(chr((ord(char) + shift) % 26) for char in input)
</code></pre>
<p>但是现在你会注意到你的<code>% 26</code>不起作用;ASCII代码点<em>在26之后开始</em>:</p>
<pre><code>>>> ord('a')
97
</code></pre>
<p>您需要使用<code>ord('a')</code>值来代替使用模数;减法将您的值置于0-25的范围内,然后再添加:</p>
<pre><code> a = ord('a')
return ''.join(chr((ord(char) - a + shift) % 26) + a) for char in input)
</code></pre>
<p>但这只适用于小写字母;这可能很好,但您可以通过将输入小写来强制:</p>
<pre><code> a = ord('a')
return ''.join(chr((ord(char) - a + shift) % 26 + a) for char in input.lower())
</code></pre>
<p>如果我们从函数中请求输入,将其集中在做好一项工作上,这将变成:</p>
<pre><code>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)
</code></pre>
<p>在交互提示下使用这个,我看到:</p>
<pre><code>>>> print shifttext(raw_input('Input text here: '), 3)
Input text here: Cesarsalad!
fhvduvdodgr
</code></pre>
<p>当然,现在标点符号也被采用了。上一次修订,现在只更改字母:</p>
<pre><code>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())
</code></pre>
<p>我们得到:</p>
<pre><code>>>> print shifttext(raw_input('Input text here: '), 3)
Input text here: Ceasarsalad!
fhdvduvdodg!
</code></pre>