[02주차] Boolean

Sung-E-Gkoght·2022년 11월 21일
0

HYAI - Python class

목록 보기
14/17

3-5. Boolean

Boolean이라는 명칭은 영국의 수학자 조지 불(George boole)이 그 유래입니다. 그는 논리학에서 Boolean Algebra(불 대수)를 고안한 것으로 유명합니다. 논리학의 기본 개념인 True와 False, 우리말로 참과 거짓을 가지고 마치 수학처럼 계산할 수 있는 체계를 만든 것입니다. 그래서 프로그래밍 언어에서는 이 두 값의 type으로 boole의 이름을 따서 Boolean이라고 부릅니다.

물론 항상 Boolean으로 부르는 건 아니고, 보편적인 이름이 있습니다. "Logical", 즉 "논리"가 일반적인 표현입니다. 논리식(Logical expression)나 논리 연산자(Logical operator)같이 말이죠.

  • 논리식: Logical expression <=> Boolean expression
  • 논리 연산자: Logical operator <=> Boolean operator

Python에서도 Boolean이 있습니다. 기본적으로 Boolean(s)은 True와 False를 대표합니다. True와 False는 Boolean Values라고 부릅니다. (프로그래밍 언어에서 Boolean Values는 사실 거의 숫자입니다.) 그리고 이와 관련해서 Boolean Values를 연산하는 방법인 "Boolean Operations"와 수를 비교하여 True 또는 False의 결과는 내놓는 "Comparisons"가 있습니다.


이제부터 저희가 알아볼 개념입니다.

  • Boolean Values
  • Boolean Operations
  • Comparisons

(참고로 boolean은 줄여서 bool이라고 적기 때문에 '불'이라고 읽으시면 될 것 같습니다:)


3-5-1. Boolean Values

사실 Boolean은 Integer의 하위 항목입니다. 이게 무슨 뜻이냐면, False는 0이고, True는 0이 아닌 값입니다. Python은 True와 False를 상수(constants)로 지정해두었습니다.

  • True : 1
  • False: 0

실제로 True와 False를 연산할 수 있습니다.

False로 나누었더니 아예 0으로 나누는 에러가 발생했다고 말해줍니다.
보시는 것처럼, True와 False 모두 Boolean type이었는데, 묵시
type 변환때 배웠던 int( ) 함수를 이용해서 각자의 값을 확인할 수 있습니다.

type 변환은 반대로도 가능합니다. Bool( ) 내장함수(built-in function)을 이용합니다.

0이 아닌 값은 True, 0인 값은 False로 바뀌는 걸 볼 수 있습니다.


그런데 사실 저희가 배우는 단계에서 0이냐 1이냐의 문제보단 활용이 더 중요합니다. 지금은 그렇구나 하고 넘기셔도 괜찮을 것 같아요!


3-5-2. Boolean Operations

공식 문서에서는 세 가지 불 연산(Boolean Operations)이 존재합니다.

불 연산(Boolean Operations)은 불 연산자(Boolean Operators)로 표현합니다.

		(precedence는 우선순위입니다. 예시로 not x and y는 (not x) and y와 같습니다.)


  1. x and y

and 연산자의 모든 피연산자가 True일 때, 다음 Operation의 값은 True가 됩니다.

x가 True이고, y가 True라면 x and y는 True이다.

이 경우 x가 True이고 y도 True일 경우 Operation이 True를 내놓습니다.


  1. x or y

or 연산자의 피연산자 중 단 하나라도 True라면, 다음 Operation의 값은 True가 됩니다.

x가 True이거나, y가 True라면 x or y는 True이다.

이 경우 x 또는 y 중 하나라도 True일 경우 Operation이 True를 내놓습니다.

  1. not x

not 연산자의 피연산자가 False일 경우, 다음 Operation의 값은 True가 됩니다.

x를 부정했을 때 True라면 not x는 True이다.

이 경우 x가 False일 경우 Operation이 True를 내놓습니다.

여기서 "부정"이라는 말은 이런 의미입니다.

일상에서 쓰는 "반대"와 다릅니다!


3-5-3. Comparisons

Comparisons은 "비교"입니다. 이미 여러분이 알고 있는 개념입니다.

  • x < y : x보다 y가 크다
  • x <= y: x보다 y가 크거가 같다
  • x > y : x가 y보다 크다
  • x >= y: x가 y보다 크거가 같다
  • x == y: x와 y가 같다
  • x != y: x와 y가 다르다

위의 비교가 맞다면 True, 틀리다면 False를 내줍니다.


+
Boolean Operations가 일반적으로 True와 False를 가지는 x, y 간 연산이었다면,
Comparisons는 True(==1)와 False(==0)를 포함해서 비교 가능한 x, y 간 연산이 가능합니다.

  • Boolean Operations의 x, y : 논리식
  • Comparisions의 x, y         : 식
  • 논리식 ⊂ 식
    • 불 연산 Boolean Operations ⊂ 불 식 Boolean expressions == 논리식 Logical expressions

(나중에 가능하면 expression에 대해서도 자료를 올려보도록 하겠습니다ㅠ)


지금까지의 요약:

in, not in은 아직 배우지 않는 연산자입니다.


3-5-4. 단축계산(short-circuit evaluation)

단축계산은 앞부분을 보고 뒤를 더 고려할 필요 없이 계산하는 것을 말합니다. 이미 앞부분에서 답이 결정되어버리는 계산입니다.

  • Left-to-Right: 왼쪽부터 오른쪽으로 계산
  • Right-to-Left: 오른쪽부터 왼쪽으로 계산

단축계산에서 살펴볼 and, or, 그리고 Comparisons operators는 모두 Left-to-Right입니다. 인간도 그렇고, 컴퓨터도 그렇습니다. 여기서 프로그래밍 언어는 시간을 아끼고 효율적인 검증을 위해 "단축계산"이라는 개념을 택했습니다. (물론 논리학에도 있습니다.)


  1. and의 단축계산

    and 연산자의 모든 피연산자가 True일 때, 다음 Operation의 값은 True가 됩니다.

만약 다음과 같은 식이 있다고 가정해봅시다.

w and x and y and z 

만약 이 경우에 z만 False이고 나머지는 모두 True였다면, 이 논리식의 결과는 False일 것입니다. 왜냐하면 and의 경우 모든 피연산자(w, x, y, z)가 True인 경우에만 연산 결과가 True이기 때문입니다.

그런데 만약 식을 다음과 같이 적으면 어떨까요?

z and w and x and y

왼쪽부터 차례대로 읽는데, 벌써부터 False가 나오게 됩니다. 뒤는 볼 것도 없이 이 식의 값은 False가 되겠죠.

and 단축연산은 다음과 같이 활용합니다.

False가 나올 확률이 높은 논리식(z)을 왼쪽에 둔다

이렇게 하면 불필요한 계산을 줄일 수 있습니다.


  1. or의 단축계산

or 연산자의 피연산자 중 단 하나라도 True라면, 다음 Operation의 값은 True가 됩니다.

이번엔 논리식이 이렇게 있다고 해봅시다.

z or w or x or y

조건은 여전히 같다고 한다면(z만 False), 이 논리식의 값은 True입니다. 왜냐하면 or의 경우 피연산자(w, x, y, z) 중 단 하나라도 True라면 연산결과가 True이기 때문입니다. 여기서는 무려 세 개나 True입니다.

그런데 만약 이렇게 적는다면 어떨까요?

w or x or y or z

왼쪽부터 차례대로 읽는데, 처음부터 True라면 이미 True일 테니 훨씬 효율적입니다.

or 단축연산은 다음과 같이 활용합니다.

True가 나올 확률이 높은 논리식(w, x, y)을 왼쪽에 둔다.


  1. Comparisons의 단축계산

단축계산을 하려면 적어도 연산이 두 개 이상 있어야 가능하겠죠? 단축할 게 있어야 하니까요.

비교 연산자가 두 개 이상인 Comparisons는 사실 and 연산자를 활용하여 표현이 가능합니다.

예를 들어 봅시다.

a < b < c

그대로 읽어보면 "a보다 b가 '크고' b보다 c가 크다"입니다.

a < b and b < c

로 고칠 수 있는 셈이죠. 다른 경우도 마찬가지입니다.

a < b and b == c # a < b == c
a != b and b > c # a != b > c
a >= b and b < c and ... # a >= b and b < c and ...
.
.
.

이렇게 생각한다면 and에서 했던 것처럼 한다면 단축계산을 활용할 수 있습니다.

a < b < c

b < c가 False가 나올 확률이 크다면 다음과 같이 바꾸는 거죠.

c > b > a 

False가 나올 확률이 높은 논리식(b < c)을 왼쪽에 둔다

한 번에 생각하기 어려울 수 있기 때문에 and로 쪼개서 생각한 후 나중에 다시 합치는 방법을 이용해도 나쁘지 않을 것 같습니다.


+ Truth Value Testing

원래는 생각을 안했지만, 조건문과 반복문 전에 미리 알고 가면 도움이 될까 싶어서 넣었습니다. 그런데 다시 생각해보니 지금 보면 오히려 학습 흥미 저해가 생길 것 같아서 나중에 심심하시면 읽어보시라고 링크를 첨부합니다...

https://docs.python.org/3/library/stdtypes.html#truth-value-testing



출처: https://docs.python.org/3/

profile
Sung-E-Gkoght

0개의 댓글