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

用英语讲:

对于以下值对列表中的每一对值,执行循环中的内容。在这种情况下,(i, o) 仅表示“将值从对中分配给名为 i & o 的变量”。

在第一次迭代中,i是 "&" 并且o是 "&"

每次通过循环时,它都会将出现的 of 替换i为替换,o因此源文本中的任何“&”都变为“&”,“>”变为“>”,等等。

于 2012-10-30T23:45:22.867 回答
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

代替使用适当的调试器,尝试添加一些打印语句以查看发生了什么:

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 回答
2

for每对项目io in对的序列(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")),它是字符串中的replace每个实例。ios

于 2012-10-30T23:45:39.620 回答
1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))是一个 4 元组,每个元素都是一个 2 元组(例如,("&","&amp;"))。元组是一个固定长度的序列。你可以在这里阅读更多关于它们的信息:http: //anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/loopsandtuples.html

第一行只是对序列的 for 循环。左侧(在'in'之前)利用了python解包。它采用元组的两个值并将它们分配,一个分配到 ,另一个分配io

通常,对于每个元组,for 循环将元组的第一个元素替换为第二个元素。

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

i 和 o 是您的循环变量。& > < "是要替换的字符,并且&amp; &gt; &lt; &quot;是要替换它们的字符。

在循环的第一次迭代中i = &o = &amp;在第二次迭代中i = >o = &gt;依此类推。

于 2012-10-30T23:45:15.083 回答
1

您正在迭代的东西是一个元组的元组(在这种情况下是对)。

所以对于循环的每次迭代,i 得到第一件事,o 得到第二件事。例如,在第一次迭代中,i 得到 & 并且 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 中逐一获取项目,并尝试执行以下操作:

(i,o)=("&","&amp;"),或者简单地说,它在第一次迭代i,o=("&","&amp;")中分配'&'toi&amp;to ,在第二次迭代中分配to和to ,依此类推。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 元组,因此您可以将它们各自的值分配给两个变量i,并且o

于 2012-10-30T23:48:01.013 回答