티스토리 뷰
[Python] return 문에도 and 와 or를 사용할 수 있다고? 파이썬의 and과 or에 대한 모든 것
whatisyourname 2022. 5. 13. 12:24
파이썬만의 독특한 문법으로 파이썬은 함수의 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 | a or b if bool(a): return a else: return b # ------------------- # 여러개 존재할 경우 다음과 같은 논리식을 따른다고 할 수 있다. a 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 | a and b if not bool(a): return a else: return b # ------------------- # 여러개 존재할 경우 다음과 같은 논리식을 따른다고 할 수 있다. a 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 == 0) and words[0]) or (base(num // b, b).lstrip('0') + words[num % b]) print(base(10, 2)) | 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이 나와도 헷갈리지 않을거라 생각한다.
'Python' 카테고리의 다른 글
[Python] 파이썬의 별표(*, asterisk)에 대한 모든 것 (0) | 2022.05.13 |
---|---|
[Python] 리스트 함축(list comprehension)을 시작부터 끝까지 이해하여보자. (0) | 2022.05.12 |
[Python] 가변, 불변(mutable, immutable)에 대한 모든 것 (0) | 2022.05.12 |
[Python] 파이썬은 포인터가 존재하지 않을까? (부제 : id 함수에 관한 모든 것) (0) | 2022.05.12 |
[Python] 파이썬에서 'a == b' 와 'a is b'는 무슨 차이가 있지? (0) | 2022.05.11 |
- Total
- Today
- Yesterday
- 알고리즘
- 사칙연산
- 구현
- bomblab
- 시간복잡도
- docker
- Python
- GDSC
- C
- Network
- equal
- Max
- for
- react
- BOJ
- 헤더
- BRONZE
- 프로그래밍
- CSAPP
- 함수
- 수학
- 백준
- 제어문
- MIN
- 문자열
- C++
- JS
- Proactor
- effective async
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |