2012-12-04 2 views
-3

python에서 iterables의 경우 많은 한 행 반복 명령을 구성 할 수 있습니다.if 문을 사용하여 목록 이해 (또는 한 줄짜리 표현)

이러한 반복 중 일부는 if 문이 필요합니다.

때때로 if 문과 for 문이 중요합니다. 나는 0에서 10 사이의 홀수의 합을 검색해야하는 경우를 가정 해 봅시다 :

>>> sum(i if not i%2==0 for i in range(10)) 
SyntaxError: invalid syntax 
>>> sum(i for i in range(10) if not i%2==0) 
25 

그 한 라이너는하지만 난 정말 만약 문이 후 을 제공하는 이유를 이해하지 않는, 본질적으로 매우 이해하기 힘든 것이 for 문. 이전의 i if not i%2==0 for i in range(10)을 사용하는 것이 상식에 더 적합하지 않습니까?

+0

왜 'i % 2! = 0'대신 'not i % 2 == 0'을 쓰고 있습니까? – phihag

+0

"그 하나의 라이너는 본질적으로 이해할 수 없습니다"라는 말은 매우 심각한 담요입니다. 사실, 그들은 꽤 이해할 수 있고 매우 강력합니다. –

+0

"사실, 목록 내장을위한 파이썬 구문은 이해하기 쉽지 않습니다. 다른 방식으로 변경하면 안됩니까?"라고 효과적으로 말하고 있습니다. 음, 파이썬의 기능을 성공적으로 사용하는 사람들이 수없이 많습니다. 그래서/이해할 수있다. 만약 당신이 그것을 좋아하지 않는다면, 당신은 항상 파서를 자신을 위해 수정하고 그것을 PEP로 제안 할 수 있습니다. 물론 목록 작성 방법을 표현할 수있는 언어를 찾고 개발하는 것은 언제나 환영합니다. – inspectorG4dget

답변

5

생성자 표현식 (또는 목록 이해기)에서, 명령문은 사용자가 중첩 한 것처럼 나열되어야합니다.

귀하의 sum() 표현은 다음과 같이 중첩 될 수 있습니다 :

for i in range(10): 
    if not i%2 == 0: 
     # do something with i 

당신은 그 순서를 변경할 수 있으며, i 때문에 이해가되지 것입니다 다음이 정의되지 않은 :

if not i%2 == 0: 
    for i in range(10): 
     # do something with i 
1

를 첫 번째 예에서, 목록 식 이해 값으로 if 표현식을 가진 무조건 부 루프를가집니다. b이 true로 평가되면

(a if b else c for i in iterable) 
\___________/ 
    | 
    actual expression 

a if b else ca에 해당하고, 그렇지 않으면 c : 올바른 구문이 될 것입니다.

두 번째 예에서는 조건부 목록 이해가 있습니다. 기본적으로 iterable에서 값을 건너 뜁니다. 또는 더 정확하게, 당신은 촬영하는 지정됩니다 제로 추가에 대한 (및 합계로 널 요소로

(a for i in iterable if <condition>) 

는 합의 경우에는 첫 번째 구문을 사용하여 지능형리스트를 다시 작성할 수 있습니다) :

sum(i if i % 2 != 0 else 0 for i in range(10)) 
관련 문제