1

我正在尝试执行以下操作:

在 HTML TextArea 中,将 ASCII 表中输入文本的每个字符的位置更改 13 个位置(在我的代码中是 rot13 函数)。

这是Rot13函数:

def rot13(s):
    for a in s:
       print chr(ord(a)+13)

它确实以这种方式工作,但它也会打印标题信息并省略最后一个字符。因此,当我在框中输入单词“Hello”时,结果是:

U r y y | Status: 200 Content-Type: text/html; charset=utf-8 Cache-Control: no-cache Content-Length: 4 None

那么该怎么做呢?

另外,当我尝试这样做时:

def rot13(s):
    for a in s:
       chr(ord(a)+13)
    return s

它返回了我在文本中输入的相同文本,没有我认为会有的变化。所以据我了解,它不会直接修改's'吗?那么该怎么做呢?

整个代码如下:

import webapp2
import cgi
def escape_html(s):
    return cgi.escape(s, quote = True)

form = """<html>
<head><title>Rot13</title></head>
<body>
<form method="post">
Please enter your text here:<br>
<textarea name="text"></textarea>
<input type="submit">
</form>
</body>
</html>
"""

def rot13(s):
    for a in s:
       print chr(ord(a)+13)

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write(form)

    def post(self):
        entered_text = self.request.get('text')
        self.response.out.write(rot13(entered_text))

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

2 回答 2

2

首先,永远不要print在 WSGI 应用程序中使用。

然而,就 rot13 而言,Python 已经支持这一点:

out = in.encode('rot13')
于 2012-12-11T13:30:15.720 回答
1

编辑:这是一个在字符串上执行实际 ROT13 的函数(我很抱歉 - 我不知道这是一个实际的算法 - 我在上一个答案中提供的方法不会执行真正的 ROT13)。但是,如果您正在寻找一种有效的方法来实现它,那么您将很难击败@NickJohnson 的回答 :) 这根据此处的表进行转换,大写映射到大写,小写映射到小写。这将创建大写和小写字母的映射,通过将组件分成两半并翻转它们来映射到它们的 ROT13 等效项。然后,您将 'normal' 和 'reversed' 列表压缩在一起,并根据生成的键/值对创建一个字典:

In [1]: import string

In [2]: w = 'SecretWord'

In [3]: uc, lc = string.uppercase, string.lowercase

In [4]: c_keys = uc + lc

In [5]: c_val = uc[13:] + uc[:13] + lc[13:] + lc[:13]

In [6]: d = dict((k, v) for k, v in zip(c_keys, c_val))

In [7]: ''.join(d[i] for i in w)
Out[7]: 'FrpergJbeq'

为了更容易可视化,下面是键/值字符串的样子:

In [8]: c_keys
Out[8]: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

In [9]: c_val
Out[9]: 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm'

而不是 using print,你会想要使用self.response.out.write(就像你在其他地方一样)。这会将结果写入发送给请求者的 HTTP 响应(请注意,标头也是 的一部分response,但除非在使用时指定,否则不会打印到屏幕上self.response.out.write)。在您的情况下,简化版本可能如下所示:

def rot13(s):
    return ''.join(chr(ord(a)+13) for a in s)

它不是打印每个字符,而是使用您定义的函数构造一个字符串。这将返回该字符串,结果将被写为response. 您还可以添加额外的 HTML 格式等,但这应该有望让您走上正轨。

另外,关于为什么您的第二个功能不起作用:

def rot13(s):
    for a in s:
       chr(ord(a)+13)
    return s

它返回s不变的原因是因为尽管您正在执行该chr(ord(a)+13)步骤,但您并没有对它做任何事情。您的函数绝对是在正确的轨道上,因此使其返回与上面示例中的输出相同的一种方法是创建一个空列表,该列表将存储每个修改后的字符,然后join是最后的列表:

def rot13(s):
    # This is your container
    l = []
    for a in s:
       # Now, instead of just running the function, we add the result to the list
       l.append(chr(ord(a)+13))
    # And finally, we use join to join all the list elements together and return
    # E.g. If your list is ['a', 'b', 'c'], this returns the string 'abc'
    return ''.join(l)
于 2012-12-10T22:37:02.403 回答