2
def escape_html(s):
    for (i, o) in (("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")):
        s = s.replace(i , o)
    return s

私はこれまでこのようなものを見たことがありません。

forループの最初の行はどういう意味ですか?

一般的に、ループは何をし、どのようにそれを行いますか?

注:sは文字列です

完全な反復プロセスを説明してみてください。

4

9 に答える 9

4

これは非常に単純なPythonです。

forループは、反復可能オブジェクトから個々のアイテムを解凍します。したがって、たとえば、次のような何かを行うことができます。

>>> c = [('a', 'b', 'c'), ('d', 'e', 'f')]
>>> for i, j, k in c:
...     print i, j, k
... 
a b c
d e f

あなたの場合(i, o)、タプルのタプルからの値が入力されています。次に、のインスタンスはiの値に置き換えられますo。この関数は、html特殊文字をそれぞれを表すエンティティに置き換えています。

>>> s = 'foo & bar'
>>> s = s.replace('&', '&amp;')
>>> s
'foo &amp; bar'

この関数は同等に実行しています:

def escape_html(s):
    s = s.replace("&","&amp;")
    s = s.replace(">", "&gt;")
    s = s.replace("<", "&lt")
    s = s.replace('"', "&quot;")
    return s

適切なデバッガーを使用する代わりに、いくつかのprintステートメントを追加して、何が起こっているかを確認してください。

def escape_html(s):
    print "ORIGINAL STRING: %s" % (s)
    for (i, o) in (("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")):
        print "\t(i, o) = ('%s', '%s')" % (i, o)
        s = s.replace(i , o)
        print "\ts = %s" % (s, )
        print
    return s

mystring = """<h3>This is a test</h3><script>alert("I hacked you!");</script>"""
print escape_html(mystring)

出力

ORIGINAL STRING: <h3>This is a test</h3><script>alert("I hacked you!");</script>
    (i, o) = ('&', '&amp;')
    s = <h3>This is a test</h3><script>alert("I hacked you!");</script>

    (i, o) = ('>', '&gt;')
    s = <h3&gt;This is a test</h3&gt;<script&gt;alert("I hacked you!");</script&gt;

    (i, o) = ('<', '&lt')
    s = &lth3&gt;This is a test&lt/h3&gt;&ltscript&gt;alert("I hacked you!");&lt/script&gt;

    (i, o) = ('"', '&quot;')
    s = &lth3&gt;This is a test&lt/h3&gt;&ltscript&gt;alert(&quot;I hacked you!&quot;);&lt/script&gt;

&lth3&gt;This is a test&lt/h3&gt;&ltscript&gt;alert(&quot;I hacked you!&quot;);&lt/script&gt;
于 2012-10-30T23:47:17.057 に答える
4

英語で:

次の値のペアのリストにある値のペアごとに、ループ内の処理を実行します。この場合、(i、o)は、「ペアの値をi&oという名前の変数に割り当てる」という意味です。

最初の反復では、iは「&」であり、o「&amp;」です。

ループを通過するたびに、の出現箇所がiの置換に置き換えられるoため、ソーステキストの「&」は「&amp;」になり、「>」は「&gt」になります。

于 2012-10-30T23:45:22.867 に答える
2

forアイテムの各ペアとペアio inシーケンス。(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))これは、文字列内のwithreplaceの各インスタンスです。ios

于 2012-10-30T23:45:39.620 に答える
1

繰り返し処理しているのは、タプルのタプル(この場合はペア)です。

したがって、ループの反復ごとに、iが最初のものを取得し、oが2番目のものを取得します。EG、最初の反復で、私は&を取得し、oは&を取得します。

したがって、iをoに置き換えて新しい文字列を作成し続けます。

于 2012-10-30T23:46:06.307 に答える
1

tupl =(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))それをより単純にするためにそのタプルを考慮してください。

つまり、のアイテムはtupl("&","&amp;")など(">", "&gt;")です。

したがって、forループは次のようになります。

  for (i,o) in tupl:

それが行うことは、tuplからアイテムを1つずつフェッチし、次のようなことを試みます。

(i,o)=("&","&amp;")、または単に、最初の反復でtoとtoi,o=("&","&amp;")を割り当て、 2番目の反復でtoとtoを割り当てます。'&'i&amp;o>i&gt;o

于 2012-10-30T23:46:37.610 に答える
1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))タプル内のタプルです。

それをもっと簡単な言葉に減らしましょう。

for (x, y) in ( ('a', 'b'), ('c', 'd') ):
    print x, y   

これにより、各タプルの内容が出力されます...

a, b
c, d

おそらくそれは物事をクリアします。

于 2012-10-30T23:46:57.903 に答える
1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))4つの要素を含むタプルです。

インデックス0の要素はタプルです("&","&amp;")

あなたが言うときa, b = 0, 1、pythonはそれをと同じように評価し(a, b) = (0, 1)ます、そこで変数は対応する値を割り当てられます。つまりa、値0b取り、値を取ります1

forループは、4つの要素を含む大きなタプルを効果的にループします。各要素は2タプルであるため、それぞれの値を2つの変数に割り当てることができますio

于 2012-10-30T23:48:01.013 に答える
1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))は4タプルで、各要素は2タプルです(たとえば、("&","&amp;"))。タプルは固定長のシーケンスです。あなたはここでそれらについてもっと読むことができます:http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/loopsandtuples.html

最初の行は、シーケンスのforループです。左側(「in」の前)は、Pythonの解凍を利用しています。タプルの2つの値を取り、それらをに分配します。一方はに、もう一方はに分配しiますo

一般に、タプルごとに、forループはタプルの最初の要素を2番目の要素に置き換えます。

于 2012-10-30T23:49:26.973 に答える
1
for (i, o) in (("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")):

iとoはループ変数です。& > < "は置換される文字であり、&amp; &gt; &lt; &quot;はそれらを置換する文字です。

ループの最初の反復でi = &o = &amp;2番目の反復i = >でというo = &gt;ように続きます。

于 2012-10-30T23:45:15.083 に答える