일반인을 위한 파이썬 지침서/부울 표현식
여기에 부울 표현식의 약간의 예가 있다.(여러분은 타이프해 넣지 마세요.)
a = 6 b = 7 c = 42 print 1, a == 6 print 2, a == 7 print 3,a == 6 and b == 7 print 4,a == 7 and b == 7 print 5,not a == 7 and b == 7 print 6,a == 7 or b == 7 print 7,a == 7 or b == 6 print 8,not (a == 7 and b == 6) print 9,not a == 7 and b == 6
출력이 여기에 있다.
1 1 2 0 3 1 4 0 5 1 6 1 7 0 8 1 9 0
무슨일이 진행되는가? 프로그램은 일단의 우스꽝스러워 보이는 print서술문으로 구성되어 있다. 각각의print 서술문은 한개의 숫자와 하나의 표현식을 출력한다. 숫자는 내가 다루고 있는 서술문의 추적을 도와 주기 위한 것이다. 각 표현식들이 0 혹은 1로 끝나고 있음을 주목하라. 파이썬에서 거짓은 0 으로 씌여지고 참은 1로 씌여진다.
print 1, a == 6 print 2, a == 7
첫번째가 참이고 두 번째가 거짓이므로, 예상한 바와 같이 한개의 1과 한개의 0을 각각 출력한다. 세 번째의 출력, 'print 3,a == 6 and b == 7' 은 약간 다르다 연산자and의 의미는 만약 앞과 뒤의 서술문이 모두 참이라면 전체 표현식은 참이고 그렇지 않으면 전체 표현식이 거짓이라는 뜻이다. 다음의 라인, 'print 4,a == 7 and b == 7' 를 보면 만약 and 표현식이 일부가 거짓이라면, 전체는 거짓이라는 것을 알수 있다. and의 행위는 다음과 같이 요약된다.
표현식 | 결과 |
---|---|
true and true | true |
true and false | false |
false and won't check | false |
첫번째 표현식이 거짓이라면 전체 표현식이 거짓이라는 것을 알고 있으므로 파이썬은 바로 다음의 표현식을 점검하지 않는다는 것을 주목하라.
다음 라인, 'print 5,not a == 7 and b == 7' 은 not 연산자를 사용한다. not 은 단지 그 표현식의 반대값을 준다. (그 표현식은 'print 5,a != 7 and b == 7' 와 같이 다시 씌여질 수 있다.) 여기에 그 표를 보인다.
표현식 | 결과 |
---|---|
not true | false |
not false | true |
다음의 두 라인, 'print 6,a == 7 or b == 7' 그리고 'print 7,a == 7 or b == 6' 는 or 연산자를 사용한다. or 연산자는 첫 번째 표현식이 참이거나, 혹은 두 번째 표현식이 참이거나 아니면 둘 다 참이라면 참을 반환한다. 양자의 표현식 모두가 참이 아니라면 거짓을 반환한다. 여기에 그 표가 있다.
표현식 | 결 과 |
---|---|
true or won't check | true |
false or true | true |
false or false | false |
첫 번째 표현식이 참이라면 파이썬은 전체 표현식이 참이라는 것을 알고 있으므로 그 다음 두 번째의 표현식을 점검하지 않는다. 적어도 표현식의 절반이 참이라면 or문은 참이므로 이것은 작동한다. 첫번째 부분은 참이고 그리고 두 번째 부분은 참이거나 거짓일 수 있지만, 그러나 전체 표현식은 여전히 참이다.
다음의 두 라인, 'print 8,not (a == 7 and b == 6)' 그리고 'print 9,not a == 7 and b == 6'을 보면 괄호가 사용되어 표현식을 무리를 지을수 있으며 한 부분을 먼저 평가하도록 강제할 수 있다. 괄호가 표현식을 거짓에서 참으로 변경하였음을 주목하라. 이러한 일이 일어난 것은 괄호때문에 not 연산자가 'a == 7'라는 부분대신에 전체 표현식에 적용되었기 때문이다.
여기에 부울 표현식을 사용한 예제가 하나 있다.
list = ["Life","The Universe","Everything","Jack","Jill","Life","Jill"] #make a copy of the list copy = list[:] #sort the copy copy.sort() prev = copy[0] del copy[0] count = 0 #go through the list searching for a match while count < len(copy) and copy[count] != prev: prev = copy[count] count = count + 1 #If a match was not found then count can't be < len #since the while loop continues while count is < len #and no match is found if count < len(copy): print "First Match: ",prev
그리고 여기에 출력이 있다.
First Match: Jill
이 프로그램은 while count < len(copy and copy[count] 인 동안 계속하여 일치 여부를 점검한다. count가 copy의 마지막 지표보다 크거나 일치가 발견되면 and 는 더 이상 참이 아니므로 루프를 빠져나온다. if 문은 while문이 일치가 발견되었기 때문에 빠져 나간것이 확실한지를 단순히 점검한다.
and의 또 다른 트릭이 이 예제에서 사용된다. 여러분은 and 테이블을 볼 때 세번째 항목이 false and won't check
임을 주목하라. 만약 count >= len(copy)
(다른 말로 count < len(copy)
이 거짓이)라면 그러면 copy[count]
전혀 참조되지 않는다. 이것은 첫번째가 거짓이면 그러면 그들 둘은 참일수가 없다는 것을 파이썬이 알기 때문이다. 이것은 '짧은 회로'의 하나로 알려져 있는데 무엇인가 잘못되어서 and
의 두번째 부분이 에러를 야기할 때 유용하게 쓰인다. count
가 copy
에 대하여 유효한 지표였는지를 점검하기 위하여 나는 첫 번째 표현식 (count < len(copy))
을 사용하였다.(믿지 못하겠다면 `Jill' 과 `Life' 의 일치를 제거하고, 그것이 여전히 잘 작동하는가를 점검하라 그리고 count < len(copy) and copy[count] != prev
의 순서를 copy[count] != prev and count < len(copy)
로 뒤집어보라.)
부울 표현식은 여러분이 두 개 이상의 다른 값을 한 번에 점검하고자 할 때 사용될 수 있다.