본문으로 이동

일반인을 위한 파이썬 지침서/부울 표현식

위키책, 위키책

여기에 부울 표현식의 약간의 예가 있다.(여러분은 타이프해 넣지 마세요.)

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의 두번째 부분이 에러를 야기할 때 유용하게 쓰인다. countcopy에 대하여 유효한 지표였는지를 점검하기 위하여 나는 첫 번째 표현식 (count < len(copy))을 사용하였다.(믿지 못하겠다면 `Jill' 과 `Life' 의 일치를 제거하고, 그것이 여전히 잘 작동하는가를 점검하라 그리고 count < len(copy) and copy[count] != prev의 순서를 copy[count] != prev and count < len(copy)로 뒤집어보라.)

부울 표현식은 여러분이 두 개 이상의 다른 값을 한 번에 점검하고자 할 때 사용될 수 있다.