[Python] 파이썬에는 switch문이 없다고?

Oayenn·2023년 7월 8일
0

Python

목록 보기
1/2
post-thumbnail
post-custom-banner

[프로그래머스] 옷가게 할인 받기 에서 연계된 포스트입니다.

프로그래머스를 풀다가 파이썬에 switch문이 없다는 것을 새삼 깨닫고 그럼 대안이 뭐가 있지? 싶어서 작성하는 글이다.

🧐혹시.. 개발하는 걸 잊었나?

그렇지 않다. 파이썬을 개발한 귀도 반 로섬 역시 파이썬에 switch-case문이 없다는 사실을 인지하고 있었으며, 이에 관해 논의를 한 역사가 있다 (2006, PEP 3103).
2007년에는 파이콘(PyCon)에서 switch문에 관한 설문을 진행했으나 사람들은 해당 기능에 큰 관심을 보이지 않았다. 결국 파이썬 내의 switch-case에 대한 논의는 종료되었다.

파이썬 공식 문서에서도 해당 내용을 찾아볼 수 있다.


🔥그렇다면 파이썬에서는 뭘 써야 할까

파이썬 공식 문서인 Design and History FAQ에서는 다음의 두 가지 방법을 제안한다.

1. if-elif-else

자바에 else if가 있다면 파이썬에는 elif라는 키워드가 있다. else if를 줄여 보다 짧고 간결하게 만든 듯하다.

def solution(price):
    if price >= 500000: # 50만 원 이상 구매시
        return price * 0.8 # 할인율 20% 적용
    elif price >= 300000: # 30만 원 이상 구매시
        return price * 0.9 # 할인율 10% 적용
    elif price >= 100000: # ...
        return int(price * 0.95)
    else:
        return price

2. dictionary와 함수 매핑

dictionary내에는 key와 value가 한 쌍을 이룬 요소들이 존재한다. dictionary는 순서가 없는 구조이기 때문에, key를 통해서만 dictionary 내의 요소에 접근할 수 있다.
이런 식으로,

functions = {'a': function_1,
             'b': function_2,
             'c': self.method_1}

func = functions[value]
func()

혹은 이런 식으로! (이 코드는 앞서 말한 프로그래머스 글의 solution이기도 하다.)

def solution(price):
    discount_rates = {500000: 0.8, 300000: 0.9, 100000: 0.95, 0: 1}
    for discount_price, discount_rate in discount_rates.items():
        if price >= discount_price: # 원가가 할인 기준가 이상일 때
            return int(price * discount_rate) # 해당 할인율 적용

🔥근데 잠깐, 이건 뭐지?

아까 봤던 파이썬 공식 문서를 재차 읽어보다가, match ... case라는 키워드를 발견했다.

검색해보니 match-case는 파이썬 3.10에서 추가된 구문으로, switch-case와 비슷하지만 추가적인 기능이 있다.

for n in range(1, 101):
    match (n % 3, n % 5): # n%3, n%5 두 개의 식을 case에서 각각 평가함
        case (0, 0):
            print("FizzBuzz")
        case (0, _): # 밑줄(_)은 어떤 값이든 상관 없다는 의미임
            print("Fizz")
        case (_, 0):
            print("Buzz")
        case _:
            print(n)

위 코드와 같이 tuple까지 처리할 수 있다. (처음 보는 구문이라서 그런지 굉장히 신기하다)

🪺정리

사실상 문제 풀이에는 쓸 수도 없었던 switch문을 떠올렸다가 파이썬 내의 switch 논쟁, 이후의 대안, 그리고 완전히 초면인 match-case문까지 알아보았다.

결론적으로 현재 파이썬 공식 문서는 if-elif를 권장하고 있다.
그렇다면 내가 풀이했던 코드가 정석이라는 의미 같아 살짝의 뿌듯함을 안고 간다.

히히


참고

profile
차근차근 쌓아올리기
post-custom-banner

0개의 댓글