2015-08-10 7 views
2

Я пишу webapp в python для преобразования строки по rot13, такой как rot13 (a) = n, rot13 (b) = o и т. Д. Но код работает только для букв после m. От букв a до m никаких изменений нет. Что я делаю не так, вот мой код:Что не так с этим кодом webapp2?

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) 

Когда я поместить буквы п до г выше а, то т дают правильный результат.

ответ

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().

+0

, который сделал это, но он дал TypeError, поэтому мне пришлось это сделать: return str (t) .translate (tt) – doctorsherlock

 Смежные вопросы

  • Нет связанных вопросов^_^