我在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会给出正确的结果。
答案 0 :(得分:3)
问题出在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()
。