python 3.8부터 도입된 왈러스 연산자(대입연산자)에 대해 알아보자.
왈러스 연산자를 사용하면 하나의 식 안에서 변수 이름에 값을 대입하면서 이 값을 평가할 수 있다.
대입문이 쓰일 수 없는 위치(if, while...) 에서 변수에 값을 대입할 수 있는 유용한 문법이다.
예를 들어 카페에서 사용할 과일 바구니를 관리한다고 하자.
# python3.8
# 과일 바구니의 내용물
fruits = {
'apple': 10,
'banana': 15,
'lemon': 5
}
# 레모네이드 제조
def make_lemonade(count):
pass
# 사과주스 제조
def make_apple_juice(count):
pass
def slice_banana(count):
return pieces
# 스무디 제조
def make_smoothies(pieces):
pass
# 재고 없음
def out_of_stock():
pass
기존에 쉽게 생각할 수 있는 코드
lemon_count = fruits.get('lemon', 0)
if lemon_count:
make_lemonade(lemon_count)
else:
out_of_stock()
이 코드의 문제는 lemon_count 변수는 if문의 첫 번째 블록에서만 쓰이는데 if 앞에서 변수를 정의하면서 필요이상으로 중요해 보인다.
왈러스 연산자를 사용하면 다음과 같이 코드를 작성할 수 있다.
# 왈러스 연산자를 이용한 대입 후 평가
if lemon_count := fruits.get('lemon', 0):
make_lemonade(lemon_count)
else:
out_of_stock()
if 조건문에서 대입 및 비교 수행
if (apple_count := fruits.get('apple', 0)) > 2:
make_apple_juice(apple_count)
else:
out_of_stock()
또 다른 예제 (스무디, 사과주스, 레모네이드 제조)
count = fruits.get('banana', 0)
if count >= 2:
pieces = slice_banana(count)
make_smoothies(pieces)
else:
apple_count = fruits.get('apple', 0)
if apple_count > 2:
make_apple_juice(apple_count)
else:
lemon_count = fruits.get('lemon', 0)
if lemon_count:
make_lemonade(lemon_count)
else:
out_of_stock()
왈러스 연산자를 사용한다면...
if (count := fruits.get('banana', 0)) >= 2:
pieces = slice_banana(count)
make_smoothies(pieces)
elif (apple_count := fruits.get('apple', 0)) > 2:
make_apple_juice(apple_count)
elif lemon_count := fruits.get('lemon', 0):
make_lemonade(lemon_count)
else:
out_of_stock()
참고 : 책 <파이썬 코딩의 기술>