[英]How does the following for loop work?
def escape_html(s):
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
s = s.replace(i , o)
return s
我以前没见过这样的东西。
for循环的第一行是什么意思?
一般来说,循环是做什么的,它是如何做到的?
注意:s是一个字符串
请尝试解释完整的迭代过程。
用英语:
对于以下值对列表中的每对值,请在循环中执行这些操作。 在这种情况下,(i,o)只是意味着“将对中的值分配给名为i&o的变量”。
在第一次迭代期间, i
是“&”而o
是“&amp;”
每次循环时,它用o
的替换替换i
出现,因此源文本中的任何“&”变为“&amp;”,“>”变为“&gt”等。
这是非常直接的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)
OUTPUT
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
S的每个实例i
与o
在串s
。
for (i, o) in (("&","&"),(">", ">"),("<", "<"),('"', """)):
我和o是你的循环变量。 & > < "
是要替换的字符, & > < "
是要替换它们的字符。
在循环的第一次迭代中, i = &
和o = &
在第二次迭代中, i = >
和o = >
等等。
你迭代的东西是一个元组元组(在这种情况下是对)。
所以对于循环的每次迭代,我得到第一个东西,而o得到第二个。 EG,在第一次迭代中,我得到&和o得到&。
所以它只是继续创建新的字符串,用i代替。
将元组视为tupl =(("&","&"),(">", ">"),("<", "<"),('"', """))
使它更简单。
所以tupl
的项目是("&","&")
, (">", ">")
等等
所以for循环变成:
for (i,o) in tupl:
它的作用是从tupl逐个获取项目尝试做类似的事情:
(i,o)=("&","&")
,或简单地说i,o=("&","&")
,它将'&'
分配给i
和&
到第一次迭代中的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
(("&","&"),(">", ">"),("<", "<"),('"', """))
是一个4元组每个元素都是一个2元组(例如, ("&","&")
)。元组是一个固定长度的序列。你可以在这里阅读更多信息: http://anh.cs。 luc.edu/python/hands-on/3.1/handsonHtml/loopsandtuples.html
第一行只是序列上的for循环。 左侧(在'in'之前)利用python解包。 它采用元组的两个值并将它们分配,一个进入i
,另一个进入o
。
通常,对于每个元组,for循环用第二个元素替换元组的第一个元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.