brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Dec 28. 2023

Python: Walrus 연산자

#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 를 사용하면서 더욱더 자주 활발하게 해당 케이스를 마주한다.

그래서 익숙해질 정도로 연습을 해보면서

실무에 사용하면 도움이 될 수 있을 것 같다.

작가의 이전글 Polars #04
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari