这个 webapp2 代码有什么问题?

What is wrong with this webapp2 code?

我正在 python 中编写一个 webapp 以通过 rot13 转换字符串,例如 rot13(a)=n 、 rot13(b)=o 等等。但该代码仅适用于 m 之后的字母。从字母 a 到 m 没有变化。我做错了什么,这是我的代码:

import webapp2
import cgi

form = """<form method="post">
    Type a string to convert:
    <br>
    <textarea name="text">%(text)s</textarea>
    <br>
    <input type="submit">
</form> """

class MainHandler(webapp2.RequestHandler):
    def write_form(self, text=""):
        self.response.out.write(form % {"text": cgi.escape(text)})

    def get(self):
        self.write_form()

    def post(self):
        new_text = self.request.get('text')
        text = ""
        for x in range(len(new_text)):
            text += convert(new_text[x])
        self.write_form(text)

def convert(t):
    for (i, o) in (('a', 'n'),
                   ('b', 'o'),
                   ('c', 'p'),
                   ('d', 'q'),
                   ('e', 'r'),
                   ('f', 's'),
                   ('g', 't'),
                   ('h', 'u'),
                   ('i', 'v'),
                   ('j', 'w'),
                   ('k', 'x'),
                   ('l', 'y'),
                   ('m', 'z'),
                   ('n', 'a'),
                   ('o', 'b'),
                   ('p', 'c'),
                   ('q', 'd'),
                   ('r', 'e'),
                   ('s', 'f'),
                   ('t', 'g'),
                   ('u', 'h'),
                   ('v', 'i'),
                   ('w', 'j'),
                   ('x', 'k'),
                   ('y', 'l'),
                   ('z', 'm')):
        t = t.replace(i, o) 
    return t


app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

当我将字母 n 到 z 放在 a 上方时,a 到 m 给出正确的结果。

问题在convert()方法中,让我们举一个简单的例子来理解这个问题。

让我们以字符串 'an' 为例并尝试转换它。

首先我们从元组的元组中得到 a 并在字符串中用 n 替换它,所以它变成 - 'nn' 。现在,在多次未命中之后,我们到达元组的元组中的 n ,我们再次对整个字符串进行替换,这次我们得到 - 'aa' 。如您所见,我们再次替换了完整的字符串,而不仅仅是未转换字符串的剩余部分。这是您代码中的基本问题(至少是您提到的问题)。

为了解决这个问题,Python 已经提供了一个 str.translate()(带有 str.maketrans)功能来完成您想要做的事情,您应该改用它。例子-

Python 2.x -

def convert(t):
    from string import maketrans
    tt = maketrans('abcdefghijklmnopqrstuvwxyz','nopqrstuvwxyzabcdefghijklm')
    t = t.translate(tt)
    return t

对于 Python 3.x ,您应该使用 str.maketrans() 而不是 string.maketrans()