以下for循环如何工作?

时间:2012-10-30 23:40:32

标签: python for-loop iteration

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

我以前没见过这样的东西。

for循环的第一行是什么意思?

一般来说,循环是做什么的,它是如何做的?

注意:s是一个字符串

请尝试解释完整的迭代过程。

9 个答案:

答案 0 :(得分:4)

英文:

对于以下值对列表中的每对值,请执行循环中的内容。在这种情况下,(i,o)只是意味着“将对中的值分配给名为i&amp; o的变量。”

在第一次迭代中,i是“&amp;”而o是“&amp; amp;”

每次循环时,它都会替换io的替换,因此任何“&amp;”在源文本中变为“&amp; amp;”,“&gt;”成为“&amp; gt”等等。

答案 1 :(得分: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;

答案 2 :(得分:2)

for每对项io in(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))的序列,replace每个i的实例1}} o中包含s

答案 3 :(得分:1)

for (i, o) in (("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")):

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

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

答案 4 :(得分:1)

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

因此,对于循环的每次迭代,我得到第一个东西,而o得到第二个。 EG,在第一次迭代中,我得到&amp;和o得到&amp;。

然后它只是继续创建新的字符串,用i代替。

答案 5 :(得分:1)

将元组视为tupl =(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))以使其更简单。

因此tupl的项目为("&","&amp;")(">", "&gt;")

所以for循环变为:

  for (i,o) in tupl:

它的作用是从tupl逐个获取项目尝试做类似的事情:

(i,o)=("&","&amp;"),或简称i,o=("&","&amp;"),它在第一次迭代中将'&'分配给i&amp;o > i在第二次迭代中1}}到&gt;o到{{1}},依此类推。

答案 6 :(得分:1)

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))是元组中的元组。

让我们把它简化为更简单的术语。

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

这会打印每个元组的内容......

a, b
c, d

也许这可以解决问题。

答案 7 :(得分:1)

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))是一个包含4个元素的元组。

索引0处的元素是元组("&","&amp;")

当你说a, b = 0, 1时,python会像(a, b) = (0, 1)一样评估它,其中变量被赋予相应的值。也就是说,a获取值0b获取值1

你的for循环有效地循环遍历大元组,其中包含4个元素。由于每个元素都是2元组,因此您可以将它们各自的值分配给两个变量io

答案 8 :(得分:1)

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

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

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