티스토리 뷰

반응형

thumbnail
and, or에 대하여 알아보자

파이썬만의 독특한 문법으로 파이썬은 함수의 return문에도 and와 or를 사용할 수 있다. 다만, 이 경우 보통우리가 생각하는 and와 or과 같이 동작을 하지 않는다. 이를 이해하려면 and와 or의 정확한 동작원리 및 우선순위에 대한 탐구가 필요하다.

 

이번 포스팅에서 함께 알아보도록 하자.

 

 


1. and와 or의 우선순위 정리

파이썬 공식 문서에 따르면, and와 or, not의 정확한 우선순위는 다음과 같이 쓴다. 위에 있을 수록 더 높은 우선순위를 갖는다.

 

연산자 작동 원리 우선순위
x OR y (또는 연산자) if x is FALSE, then y, else x 1
x AND y (그리고 연산자) if x is FALSE, then x, else y 2
NOT x (부정 연산자) if x if FALSE, then True, else FALSE 3

 

우리가 알고있는 "또는", "그리고"와 일맥상통하지만, 약간의 디테일에 차이가 있다는 것을 확인할 수 있다.

 

각각을 말로 풀어써보자.

 

1) x OR y

x or y의 경우 먼저 x를 따진다. 만약 x가 True인 경우, x가 반환된다. 아닐 경우(x가 False인 경우) y를 반환한다. 이때 y의 True, False의 여부는 중요하지 않다.

 

따라서, 다음과 같이 작성할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
or b
 
if bool(a):
    return a
else:
    return b
# -------------------
# 여러개 존재할 경우 다음과 같은 논리식을 따른다고 할 수 있다.
 
or b or c or d
 
if bool(a):
    return a
elif bool(b):
    return b
elif bool(c):
    return c
else:
    return d
cs

 

2) x AND y

x and y의 경우 먼저 x를 따진다. 만약 x가 False인 경우, x가 반환된다. 아닐 경우(x가 True인 경우) y를 반환한다. 이때 y의 True, False의 여부는 중요하지 않다.

 

따라서 다음과 같이 작성할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
and b
 
if not bool(a):
    return a
else:
    return b
# -------------------
# 여러개 존재할 경우 다음과 같은 논리식을 따른다고 할 수 있다.
 
and b and c and d
 
if not bool(a):
    return a
elif not bool(b):
    return b
elif not bool(c):
    return c
else:
    return d
cs

 

NOT x의 경우 우리가 알고있는 방법으로 따지면 된다.

 

구체적인 예시를 들어보자. 다음과 같이 print문에 and, or를 결합한 경우 각각의 경우에 대한 출력 결과이다.

 

1
2
3
4
5
6
7
8
9
10
11
empty_list = []
print(empty_list or "I am empty!")
# I am empty!
print(empty_list and "I am empty!")
# []
 
not_empty_list = [1]
print(not_empty_list or "not empty?")
# [1]
print(not_empty_list and "not empty?")
# not empty?
cs

2. return문에서의 and / or

파이썬에서는 return문에 and와 or를 결합할 수 있다. 어떤 것을 return할 지는 위의 내용을 바탕으로 예상할 수 있다.

 

다음은 36진법까지의 변환을 할 수 있게 한 함수(base)이다. 이 함수의 논리 구조를 따라가보자.

 

1
2
3
4
5
def base(num,b):
    words ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    return ((num == 0and words[0]) or (base(num // b, b).lstrip('0'+ words[num % b])
 
print(base(102))
cs

 

함수의 인자로 num = 10, b = 2를 넘겨주었으므로, return문 쪽에 이들을 대입하면 다음과 같다.

words ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
((10 == 0) and words[0]) or (base(10 // 2, 2).lstrip('0') + words[10 % 2])

먼저, or 앞 부분부터 판단을 해야한다. 이 경우 (False and "0"(True))이기 때문에 False가 되고, or의 뒷 부분이 return된다. 따라서, 재귀함수 부분이 실행된다.

 

이후에 num = 0, b = 2인 경우를 살펴보자.

words ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
((0 == 0) and words[0]) or (base(0 // 2, 2).lstrip('0') + words[0 % 2])

마찬가지로 or 앞 부분부터 판단을 하여보자. 이 경우 (True and "0"(True))이기 때문에 True가 되고, or의 앞 부분이 return된다.


이번 글은 and와 or를 중심으로 알아보았다. 어렵지 않은 개념이지만, 많은 사람들이 정확히 알지 않는 개념이어서 한 번은 짚고 넘어가야 겠다는 생각이 들어 이 글을 작성하였다. 이제, return에 and, or이 나와도 헷갈리지 않을거라 생각한다.

 

 

반응형
댓글
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
글 보관함