티스토리 뷰
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')
'파이썬 프로그래밍' 카테고리의 다른 글
스트링, 리스트, 튜플 - part II (0) | 2020.02.06 |
---|---|
스트링, 리스트, 튜플 - part I (0) | 2020.02.06 |
파이썬 연습문제 (3) - 월별 매출기록 (0) | 2020.02.01 |
파이썬 연습문제(2) - 리스트를 다양한 방법으로 정렬하기 (0) | 2020.02.01 |
파이썬 연습문제 - 점수합과 평균을 형식에 맞게 출력 (0) | 2020.02.01 |
- Total
- Today
- Yesterday
- follow
- APPEND
- 스트링 +
- 이터레이터
- contentEquals
- sort key
- max
- 이터러블
- 지연계산
- contains
- Camel Style
- 콜렉션
- C++ 클래스
- 스트링
- rust
- python exercise
- TypeError
- ToString
- python example
- zip
- indexof
- comparable
- Iterator
- 자바regex
- Lazy evaluation
- CompareTo
- typedef
- format
- 동적바인딩
- 패턴
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |