def escape_html(s):
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
s = s.replace(i , o)
return s
我以前没见过这样的东西。
for循环的第一行是什么意思?
一般来说,循环是做什么的,它是如何做的?
注意:s是一个字符串
请尝试解释完整的迭代过程。
答案 0 :(得分:4)
英文:
对于以下值对列表中的每对值,请执行循环中的内容。在这种情况下,(i,o)只是意味着“将对中的值分配给名为i&amp; o的变量。”
在第一次迭代中,i
是“&amp;”而o
是“&amp; amp;”
每次循环时,它都会替换i
中o
的替换,因此任何“&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('&', '&')
>>> s
'foo & bar'
此功能等效地执行:
def escape_html(s):
s = s.replace("&","&")
s = s.replace(">", ">")
s = s.replace("<", "<")
s = s.replace('"', """)
return s
代替使用正确的调试器,尝试添加一些print语句以查看发生了什么:
def escape_html(s):
print "ORIGINAL STRING: %s" % (s)
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
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) = ('&', '&')
s = <h3>This is a test</h3><script>alert("I hacked you!");</script>
(i, o) = ('>', '>')
s = <h3>This is a test</h3><script>alert("I hacked you!");</script>
(i, o) = ('<', '<')
s = <h3>This is a test</h3><script>alert("I hacked you!");</script>
(i, o) = ('"', '"')
s = <h3>This is a test</h3><script>alert("I hacked you!");</script>
<h3>This is a test</h3><script>alert("I hacked you!");</script>
答案 2 :(得分:2)
for
每对项i
和o
in
对(("&","&"),(">", ">"),("<", "<"),('"', """))
的序列,replace
每个i
的实例1}} o
中包含s
。
答案 3 :(得分:1)
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
我和o是你的循环变量。 & > < "
是要替换的字符,& > < "
是要替换它们的字符。
在循环的第一次迭代中i = &
和o = &
在第二次迭代中i = >
和o = >
等等。
答案 4 :(得分:1)
你要迭代的东西是一个元组元组(在这种情况下是一对)。
因此,对于循环的每次迭代,我得到第一个东西,而o得到第二个。 EG,在第一次迭代中,我得到&amp;和o得到&amp;。
然后它只是继续创建新的字符串,用i代替。
答案 5 :(得分:1)
将元组视为tupl =(("&","&"),(">", ">"),("<", "<"),('"', """))
以使其更简单。
因此tupl
的项目为("&","&")
,(">", ">")
等
所以for循环变为:
for (i,o) in tupl:
它的作用是从tupl逐个获取项目尝试做类似的事情:
(i,o)=("&","&")
,或简称i,o=("&","&")
,它在第一次迭代中将'&'
分配给i
和&
到o
>
i
在第二次迭代中1}}到>
和o
到{{1}},依此类推。
答案 6 :(得分:1)
(("&","&"),(">", ">"),("<", "<"),('"', """))
是元组中的元组。
让我们把它简化为更简单的术语。
for (x, y) in ( ('a', 'b'), ('c', 'd') ):
print x, y
这会打印每个元组的内容......
a, b
c, d
也许这可以解决问题。
答案 7 :(得分:1)
(("&","&"),(">", ">"),("<", "<"),('"', """))
是一个包含4个元素的元组。
索引0处的元素是元组("&","&")
当你说a, b = 0, 1
时,python会像(a, b) = (0, 1)
一样评估它,其中变量被赋予相应的值。也就是说,a
获取值0
,b
获取值1
。
你的for循环有效地循环遍历大元组,其中包含4个元素。由于每个元素都是2元组,因此您可以将它们各自的值分配给两个变量i
和o
答案 8 :(得分:1)
(("&","&"),(">", ">"),("<", "<"),('"', """))
是一个4元组,每个元素都是2元组(例如,("&","&")
)。元组是固定长度的序列。您可以在此处阅读更多相关信息:http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/loopsandtuples.html
第一行只是序列上的for循环。左侧(在'in'之前)利用python解包。它采用元组的两个值并将它们分配,一个放入i
,另一个放入o
。
通常,对于每个元组,for循环用第二个元素替换元组的第一个元素。