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

まず、printWSGI アプリでは絶対に使用しないでください。

ただし、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'

を使用する代わりに、(他の場所で使用しているように)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 フォーマットなどを追加することもできますが、うまくいけば正しい方向に進むはずです。

また、2番目の機能が機能しなかった理由について:

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

変更されずに返される理由sは、ステップを実行しているにchr(ord(a)+13)もかかわらず、何もしていないためです。あなたの関数は間違いなく正しい軌道に乗っているので、上記の例と同じ出力を返すようにする 1 つの方法は、変更された各文字を格納する空のリストを作成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 に答える