⛵ [프로그래머스] 옷가게 할인 받기 에서 연계된 포스트입니다.
프로그래머스를 풀다가 파이썬에 switch
문이 없다는 것을 새삼 깨닫고 그럼 대안이 뭐가 있지? 싶어서 작성하는 글이다.
그렇지 않다. 파이썬을 개발한 귀도 반 로섬 역시 파이썬에 switch-case
문이 없다는 사실을 인지하고 있었으며, 이에 관해 논의를 한 역사가 있다 (2006, PEP 3103).
2007년에는 파이콘(PyCon)에서 switch
문에 관한 설문을 진행했으나 사람들은 해당 기능에 큰 관심을 보이지 않았다. 결국 파이썬 내의 switch-case에 대한 논의는 종료되었다.
파이썬 공식 문서에서도 해당 내용을 찾아볼 수 있다.
파이썬 공식 문서인 Design and History FAQ에서는 다음의 두 가지 방법을 제안한다.
자바에 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
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
를 권장하고 있다.
그렇다면 내가 풀이했던 코드가 정석이라는 의미 같아 살짝의 뿌듯함을 안고 간다.
히히
참고