2017-11-30 7 views
3

나는 Norvig's BASIC interpreter implemented in Python을 통해 작업하고 있습니다.목록 작성 내에서 'if'사용

내게는 외모가있는 코드가 있지만이 사람은 저쪽에 100 레벨이 넘기 때문에 뭔가 불필요한 것을 쓴 것보다 이해하지 못할 가능성이 큽니다.

def lines(text): 
    "A list of the non-empty lines in a text." 
    return [line for line in text.splitlines() if line] 
    #return [zaa for zaa in text.splitlines()] 

목록 이해 - if line으로 끝나는 이유는 무엇입니까?

[zaa for zaa in text.splitlines()] 대신이 절을 제거하면 텍스트 나 공백 행을 전달해도 함수가 작동한다고 생각합니다.

foo ="""mike\nnew\nbar""" 
bar ="\n\n" 
print lines(foo) 
print lines(bar) 
what = lines(bar) 
print(type(what)) 

['mike', 'new', 'bar'] 
[] 
<type 'list'> 

내가 뭔가를 misundersatnding해야 - 내가 그 if line가도 평가 될 때, 입력을 적절히 처리에 혼자의 필요성을하게 이해할 수 없습니다.

편집 :

bar ="""one 
two 
three 

five 

seven""" 
#bar = "" 
print lines(bar) 

['one', 'two', 'three', '', 'five', '', 'seven'] 

그것은 목록의 구성원으로서 그 두 개의 빈 문자열을 포함하십시오 if line의 부족은 나쁜 결과를 얻을 수의 예를 발견했다.

+1

비어 있지 않은 요소를 필터링합니다. –

+1

if를 만족하는 요소 만 목록에 추가됩니다. 이것은 모든 이해법 튜토리얼에서 다뤄져야합니다. – Carcigenicate

+0

@Carcigenicate 'if line'이 실제 조건을 갖고 있지 않기 때문에 혼란 스럽다고 생각합니다. 이 혼란의 원인은'진실 '가치이다. OP : https://docs.python.org/2.4/lib/truth.html 이해하기 쉽고 'truthy' 값은 매우 편리 할 수 ​​있습니다. –

답변

8

if line 체크시 False 또는 True 결정되어있는 문자 "truthy"값을 확인한다. 예를 들어 빈 문자열 ''은 빈 목록 ([]), 사전 ({}), 튜플 (()), 0None과 함께 False으로 간주됩니다.

return [line for line in text.splitlines() if line != ''] 
2

짧은 답변 : 기본적으로 if line은 짧은 버전입니다 그것은 은 결과에서을 빈 문자열을 필터링합니다.

[<expr> for <vars> in <iterable> <filters-and-iterators>] 

<filters-and-iterators>가이 시퀀스이다 : 파이썬 지능형리스트에서

폼 갖는 형태의 for <vars> in <iterable>

  1. 반복기; 및
  2. if <expr>의 형태의 필터.

파이썬은 truthiness에게의을 평가합니다. 표현식이 진실성이True 인 경우에만 해당 요소를 전달합니다. 필터가 마지막 단계 인 경우 이는 목록에 추가하는 것을 의미합니다. 필터가 마지막 단계가 아닌 경우 (예 : 다음 반복자 또는 필터 처리) 추가 처리. 그렇지 않으면 해당 항목을 무시합니다.보내고

strtruthiness 문자열이 적어도 하나의 문자 포함 된 경우에만 경우True 있습니다. 그래서 여기서 비어 있지 않은 문자열을 필터링합니다.

__bool__ 마법 함수를 재정의하여 구현할 수 있습니다. 사용자 정의 클래스의 진실성은 이 0이 아닌 값을 반환하는지 파이썬이 찾습니다.

NoneFalse 항상 truthiness False을 가지고 True이 truthiness True을 가지고,리스트, 세트, ​​사전, 튜플 문자열과 같은 컬렉션 truthiness True이있는 경우 이들은 적어도 하나 개의 원소를 포함하는 경우에만 가능합니다. 숫자 값이 0이 아니면 보통 진리 값이 True입니다. 따라서 음수 값은 진리 값이 True입니다.

프로그래머는 위의 설명과 같이 사용자 지정 클래스 자체에 대한 진실성을 자유롭게 구현할 수 있습니다 (위에서 설명한 것처럼). 예를 들어 여기에서 예제를 고려하여 비공개를 컬렉션의 진리로 생각하는 것이 좋습니다.