#python3.8 #왈러스
왈러스 연산자
https://docs.python.org/3/whatsnew/3.8.html
간단한 예제로 기억하기!
Walrus 연산자의 필요성을 느끼게 될 때가 있는데
리스트 컴프리헨션 기능에서 똑같은 구문을 두번 세번 반복해야 할 경우가 있다.
근데,
이럴때 꼭 복사 붙여넣기를 완벽하게 했음에도 숫자 하나가 달라져서 골치가 아플 수 있다.
stock = {
'삼성전자': 90_000,
'SK하이닉스': 200_000,
'에코프로': 1_000_000,
'두산로보틱스': 160_000,
}
order = ['삼성전자', '두산로보틱스', '에코프로']
def get_batches(price, pos):
return pos // price
일단, 위와 같이 간단한 예시로 확인을 해보면,
내가 가진 돈으로 주문하려는 주식을 몇 주 살 수 있는지를 반환한다.
result = {
name: get_batches(stock.get(name, 'SK하이닉스'), 800_000)
for name in order
if get_batches(stock.get(name, 'SK하이닉스'), 800_000)
}
>> {'삼성전자': 8, '두산로보틱스': 5}
여기서 주목할 부분은 물론 삼성전자를 8주 살 수 있다는 것도 중요하지만,
800_000이 있다는 사실도 중요하지만,
get_batches(stock.get(name, 'SK하이닉스'), 800_000)
해당 구문이 두번이나 반복되었다는 사실이 여기서는(!) 중요하다.
이게 왜 문제가 될까?
가끔 저런 코드에서 숫자가 달라질 수 있고 오타가 발생할 수 있는 가능성(!)이 있다.
물론 코드를 읽는 리뷰어 관점에서도 뭔가... 좀... 간지가... 떨어진다고 느낄 수 있다.
Python 3.8 Docs 에서 Walrus 연산자를 새로운 피쳐로 소개했었다.
이걸 사용하면 반복되는 구문을 삭제시키고 좀 더 깔끔하고 관리하기 쉬운 형태로
발전시킬 수 있다.
another_result = {
name: batches
for name in order
if (batches := get_batches(stock.get(name, 'SK하이닉스'), 800_000))
}
>> {'삼성전자': 8, '두산로보틱스': 5}
물론 여기서도
두산로보틱스를 5주 살 수 있다는 사실도 중요하지만,
" := " 연산자에 주목하는 것이 더 중요하다.
for 구문 아래로 모두 같은 scope 에 해당하므로 batches 변수를 사용 할 수 있게끔 만들어 준다.
이때 ( ) 괄호 안으로 if 문 내용이 들어와야 한다.
Python 에서는 이런 케이스가 매우 자주 빈번히 발생한다.
이후에 또 공유해 볼 수 있겠지만 Generator 를 사용하면서 더욱더 자주 활발하게 해당 케이스를 마주한다.
그래서 익숙해질 정도로 연습을 해보면서
실무에 사용하면 도움이 될 수 있을 것 같다.