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

나는 전에 이와 같은 것을 보지 못했습니다.다음과 같은 루프 작업은 어떻게됩니까?

for 루프의 첫 번째 줄은 무엇을 의미합니까?

일반적으로 루프가 수행하는 작업은 무엇이며 어떻게 처리합니까?

참고 :들

전체 반복 과정을 설명 해보세요 문자열을 것입니다.

답변

2
진다

for 항목 ioin(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")) 시퀀스 문자열 soi의 그것 replace의 각 인스턴스의 각 쌍.

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

i와 o는 루프 변수입니다. & > < "은 바꿀 문자이고 &amp; &gt; &lt; &quot;은 바꿀 문자입니다. 그래서 두 번째 반복 i = >o = &gt;하고에서 루프 i = &o = &amp;의 첫번째 반복에서

.

영어
4

: 값 쌍의 다음 목록에있는 값의 각 쌍에 대한

는 루프에서 물건을한다. 이 경우 (i, o)는 "쌍에서 값을 i & o라는 변수에 할당합니다."을 의미합니다.

첫 번째 반복 동안 i은 "&"이고 o은 "& amp"입니다.

루프를 때마다, 텍스트가되는 소스 너무 o의 여분 어떤 "&"로 i의 발생을 대체 "& A;", ">는"등 "&된다"

+0

"루프의 내용"은 문자열의 각 인스턴스를 해당 'o'문자열로 바꾸는 것입니다. – Amit

+0

@AmitMizrahi 감사합니다. for 루프 헤더에 집중했습니다. – Cogwheel

1

반복 할 대상은 튜플 (이 경우 쌍)의 튜플입니다.

루프의 각 반복마다, 나는 첫 번째 것을 얻고, o는 두 번째를 얻습니다. 예를 들어 첫 번째 반복에서 나는 &을 얻고 o는 &이됩니다.

그렇다면 새로운 문자열을 계속 만들어서 o로 대체하십시오.

1

튜플을 tupl =(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))으로 생각하면 더 간단 해집니다.

그래서 tupl의 항목

그렇게 for 루프가된다 등 ("&","&amp;"), (">", "&gt;") 같습니다

for (i,o) in tupl: 

그것이 할 수있는 시도가 하나를 사용하여 tupl 하나에서 항목을 가져 오는 것입니다 무엇을 뭔가 같은 다음 '&'i&amp;톤를 할당

(i,o)=("&","&amp;"), 또는 단순히 i,o=("&","&amp;"), 첫 번째 반복에서는 o이고 두 번째 반복에서는 >에서 i&gt;부터 o까지입니다.

1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))은 튜플의 튜플입니다.

간단한 용어로 줄이자.

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

이 각 튜플의 내용을 인쇄 ...

a, b 
c, d 

아마도 그 물건을 지 웁니다.

4

이것은 매우 직선적 인 python입니다.

for 루프는 반복 가능 항목에서 개별 항목의 압축을 풉니 다. 따라서, 예를 들어, 당신은 다음과 같이가 someting을 할 수있는 : 귀하의 경우 (i, o)

>>> 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의 값으로 대체됩니다. 이 함수는 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 

이 벌어지고

:

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) 

OUTPUT

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; 
1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;"))은 4 개의 요소가 포함 된 튜플입니다. 만약 a, b = 0, 1가 파이썬 그것을 변수는 대응하는 값을 할당 (a, b) = (0, 1), 동일한 평가 말할 때 인덱스 0

요소는 튜플 ("&","&amp;")

이다. 즉, a의 값은 0이고 b의 값은 1입니다.

for 루프는 큰 튜플을 4 개의 요소로 효과적으로 루프합니다.각 요소는 두 튜플 때문에, 당신은 2- 튜플을 요소 4 튜플 두 변수 io

1

(("&","&amp;"),(">", "&gt;"),("<", "&lt"),('"', "&quot;")) 그들의 각각의 값을 할당 할 수있다 (예, 대., ("&","&amp;")). 튜플은 고정 길이 시퀀스입니다. 여기에서 자세한 내용을 볼 수 있습니다. http://anh.cs.luc.edu/python/hands-on/3.1/handsonHtml/loopsandtuples.html

첫 번째 줄은 시퀀스의 for 루프입니다. 왼쪽 부분 ('앞에')은 파이썬 압축 풀기를 이용합니다. 튜플의 두 값을 취하여 하나를 i에, 다른 하나를 o에 분배합니다.

일반적으로 각 튜플에 대해 for 루프는 튜플의 첫 번째 요소를 두 번째 튜플로 바꿉니다.

관련 문제