티스토리 뷰

openbookproject.net의 "Beginning Python Programming for Aspiring Web Developers"에서 일부 발췌 번역

진위값과 진위형

이번 글에서는 참이나 거짓을 나타내는 타입인 진위형(boolean type)을 살펴본다. 참 거짓을 이용하여 식을 표현하고 계산하는 수학 분야를 Boolean algebra라고 한다. 이것은 오늘날 컴퓨터 수학의 기본이다. 

더보기

[주] 컴퓨터는 진위값이 참이냐 거짓이냐에 따라 실행 흐름을 다르게 할 수 있다. 이것 덕분에 컴퓨터는 단순한 계산기가 아니라 범용적인 즉 무슨 일이든 할 수 있는 기계가 된다.

진위값(boolean values)은 두 가지가 있다. True와 False다.

>>> type(True)  
<class 'bool'>  
>>> type(False)  
<class 'bool'> 

참 거짓을 나타낼 때 True와 False의 첫 글자를 대문자로 써야 한다. 파이썬에서 true와 false는 불리언 값이 아니다. 즉 이름으로 취급된다.

>>> type(true)  
Traceback (most recent call last): File "", line 1, in  NameError: name 'true' is not defined 

진위 수식 (Boolean expressions)

진위 수식은 결과가 진위값으로 계산되는 수식이다.  대표적인 진위 수식은 두 값을 비교하는 수식이다. == 연산은 두 값을 비교하여 진위값을 돌려준다.

>>> 5 == 5  
True  
>>> 5 == 6  
False 

위의 첫 문장은 ==로 비교하는 두 값이 같으므로 그 비교식은 참(True)을 돌려준다. 두번째 수식에서 5와 6은 다르므로 결과는 거짓(False)이 된다. == 연산은 6개의 비교 연산 중 하나다. 나머지 다섯개는 다음과 같다.

  • x != y # x is not equal to y 
  • x > y # x is greater than y 
  • x < y # x is less than y 
  • x >= y # x is greater than or equal to y
  • x <= y # x is less than or equal to y

이런 연산들은 수학에서 쓰던 익숙한 것들이지만 주의해야 되는 점은 파이썬에서는 =는 지정 연산이고, 비교 연산의 같다를 표현하려면 ==를 써야 한다는 점이다. 또한 =<나 =>는 없다는 점도 기억하자.

논리 연산자 

진위 수식에서 쓰이는 세 개의 논리 연산자가 있다. and, or, not이다. 이들 연산의 의미는 영어의 의미와 같다. 예를 들어

x > 0 and x < 10

는 x가 0보다 크고 동시에 10보다 작다가 둘다 만족될 때에만 참이 된다.

n % 2 == 0 or n % 3 == 0 

위 식은 둘중의 하나만 참이면 되는데 숫자 n이 2로 나누어지거나 또는 3으로 나누어지면 참이 된다.

마지막으로 not 연산은 진위 수식을 참거짓을 바꿉니다.(negate) 예를 들어 만약 (x > y)가 거짓이면 not (x > y)는 참이다. 즉 x는 y보다 작거나 같다가 만족됩니다. 다음은 몇가지 진위수식의 결과를 보여준다.

>>> 5 > 4 and 8 == 2 * 4  
True  
>>> True and False  
False  
>>> False or True  
True 

단축 계산 (Short-circuit evaluation)

파이썬의 진위 수식은 단축계산을 적용한다. 단축 계산이란 and나 or 식에서 전체식의 결과값 계산이 앞 부분만으로 가능하다면 앞의 것만 계산하고 뒤부분은 계산하지 않는다는 것이다. 

이것은 런타입 오류를 막는데 상당히 유용하게 쓰일 수 있다. 예를 들어 어떤 튜플의 다섯 번째 값이 짝수인지 검사하고 싶다고 하자. 다음과 같이 썼을 때 어떤 결과가 나올 것인가?

>>> numbers = (5, 11, 13, 24)  
>>> numbers[4] % 2 == 0 

numbers 튜플에 [4]번째 원소가 없으므로 결과는 다음과 같은 오류가 될 것이다.

Traceback (most recent call last): File "", line 1, in  IndexError: tuple index out of range
>>>

단축 계산은 이런 문제를 피할 수 있게 해 준다.

>>> len(numbers) >= 5 and numbers[4] % 2 == 0  
False 

이 수식의 왼쪽이 거짓이므로 파이썬은 그것만으로 전체 and의 결과가 거짓임을 알 수 있다. 그러므로 오른쪽 부분은 계산할 필요가 없다. 단축 계산을 사용하므로 이 조건식을 계산할 때 런타입 오류가 발생하지 않는다. 즉 길이가 5보다 작으면 뒤부분은 아예 실행되지 않으므로 오류가 발생하지 않게 된다.

비슷하게 다음과 같은 진위식은 단축계산을 이용해 오류의 발생을 막는 경우라고 할 수 있다.

 if x != 0 and a/x > 1:

이 수식은 x가 0이면 뒤부분을 실행하지 않을 것이므로 만약 x가 0일 때 발생할 수 있는 "divide by zero" 오류를 막을 수 있다.

참 거짓으로 해석되는 값들

모든 파이썬 값들은 참으로 또는 거짓으로 해석될 수 있다. 즉 그 값들이 진위값을 필요로 하는 곳이 쓰일 수 있다는 것이다. (이것은 파이썬이 가지고 있는 강한 타입 검사 규칙에서 예외적인 경우이다. 아래의 성질을 이용해서 프로그래밍하다 보면 진위식과 조건식을 편리하게 작성할 수 있는 좋은 기능임을 알 수 있다. )

수치형이나 시퀀스 타입들은 다음과 같이 진위값이 해석된다.

  • 수치 타입에서 0은 거짓으로 다른 모든 값은 참이 된다.
  • 시퀀스 타입에서 빈 시퀀스는 거짓이고 요소를 하나라도 가지고 있는 시퀀스는 참이 된다.

즉 리스트에서 []는 거짓으로 해석되고 요소를 하나라도 가진 리스트는 참으로 해석된다. 또한 스트링에서는 빈 스트링인 ''는 거짓으로 해석되고 다른 모든 스트링은 참으로 해석된다. 튜플도 리스트와 같다.

이러한 진위값 해석을 단축 계산의 개념과 결합하면 파이썬에서 다음과 같은 수식의 결과가 나오는 것을 이해할 수 있게 된다.

>>> 'A' and 'apples'  
'apples'  
>>> '' and 'apples'  
''  
>>> '' or [5, 6] [5, 6]  
>>> ('a', 'b', 'c') or [5, 6]  
('a', 'b', 'c')
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함