def escape_html(s):
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
s = s.replace(i , o)
return s
我以前从未见过这样的事情。
for 循环的第一行是什么意思?
一般来说,循环做什么以及它是如何做到的?
注意:s 是一个字符串
请尝试解释完整的迭代过程。
用英语讲:
对于以下值对列表中的每一对值,执行循环中的内容。在这种情况下,(i, o) 仅表示“将值从对中分配给名为 i & o 的变量”。
在第一次迭代中,i
是 "&" 并且o
是 "&"
每次通过循环时,它都会将出现的 of 替换i
为替换,o
因此源文本中的任何“&”都变为“&”,“>”变为“>”,等等。
这是非常直接的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
代替使用适当的调试器,尝试添加一些打印语句以查看发生了什么:
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>
for
每对项目i
和o
in
对的序列(("&","&"),(">", ">"),("<", "<"),('"', """))
,它是字符串中的replace
每个实例。i
o
s
(("&","&"),(">", ">"),("<", "<"),('"', """))
是一个 4 元组,每个元素都是一个 2 元组(例如,("&","&")
)。元组是一个固定长度的序列。你可以在这里阅读更多关于它们的信息:http: //anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/loopsandtuples.html
第一行只是对序列的 for 循环。左侧(在'in'之前)利用了python解包。它采用元组的两个值并将它们分配,一个分配到 ,另一个分配i
到o
。
通常,对于每个元组,for 循环将元组的第一个元素替换为第二个元素。
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
i 和 o 是您的循环变量。& > < "
是要替换的字符,并且& > < "
是要替换它们的字符。
在循环的第一次迭代中i = &
和o = &
在第二次迭代中i = >
,o = >
依此类推。
您正在迭代的东西是一个元组的元组(在这种情况下是对)。
所以对于循环的每次迭代,i 得到第一件事,o 得到第二件事。例如,在第一次迭代中,i 得到 & 并且 o 得到 &。
所以它只是不断地创建新的字符串,将 i 替换为 o。
考虑该元组tupl =(("&","&"),(">", ">"),("<", "<"),('"', """))
以使其更简单。
所以项目tupl
是("&","&")
, (">", ">")
, 等等
所以 for 循环变成:
for (i,o) in tupl:
它的作用是从 tupl 中逐一获取项目,并尝试执行以下操作:
(i,o)=("&","&")
,或者简单地说,它在第一次迭代i,o=("&","&")
中分配'&'
toi
和&
to ,在第二次迭代中分配to和to ,依此类推。o
>
i
>
o
(("&","&"),(">", ">"),("<", "<"),('"', """))
是元组中的元组。
让我们将其简化为更简单的术语。
for (x, y) in ( ('a', 'b'), ('c', 'd') ):
print x, y
这将打印每个元组的内容...
a, b
c, d
也许这可以解决问题。
(("&","&"),(">", ">"),("<", "<"),('"', """))
是一个包含 4 个元素的元组。
索引 0 处的元素是元组("&","&")
当您说 时a, b = 0, 1
,python 对它的评估与 相同(a, b) = (0, 1)
,其中变量被分配了相应的值。即a
取值0
并b
取值1
。
您的 for 循环有效地循环了包含 4 个元素的大元组。由于每个元素都是一个 2 元组,因此您可以将它们各自的值分配给两个变量i
,并且o