2014-01-17 3 views
1

Мне сложно понять это для цикла. Я новичок в python, поэтому я не понимаю, что именно происходит здесь. Код предназначен для html-экранирования.Python для цикла с кортежем в нем

Мой вопрос: как выполняется цикл for? почему для (i, o) в (.........) как это всегда так? как он знает, есть символ & в строке s?

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



print escape_html("hello&> this is do\"ge") 

ответ

2

Прежде всего, вам нужно разобраться в распаковке кортежа.

(a, b) = ("foo", 1) 

Это выражение присваивает "foo" к a и 1b. Тот же синтаксис может использоваться внутри циклов для распаковки элементов итератора, которые вы зацикливаете.

Итак, для каждого элемента вашего цикла вы распаковываете элемент вложенного кортежа (который итерируется).

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

Развернув цикл дает вам что-то вроде этого:

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

Помогло ли это?

>>> for(i,o) in (("&", "&amp;"),(">","&gt;"),('<','&lt;'),('"',"&quot;")): 
...  print "i: {}, o: {}".format(i,o) 
... 
i: &, o: &amp; 
i: >, o: &gt; 
i: <, o: &lt; 
i: ", o: &quot; 

Во время каждой итерации цикла выбирается один элемент итератора; поэтому для первой итерации этот элемент является кортежем ("&", "&amp;"). Затем этот кортеж распаковывается в переменные i и o.

1

Синтаксис

for x, y in z: 

означает "распаковать 2-кортежей в Iterable z в двух переменных x и y для каждой итерации цикла for".

Это не должно быть True; вы думаете о while цикла:

while True: 

, который предназначен для не итерацию до некоторого условия выполняется, в то время как for петля для работы через пункты в итератор.

И это не знать, что любой из первых символов в парах будет в аргументе s, но replace не выдаст ошибку, если это не так.

Смежные вопросы