대입식: 왈러스 연산자
코드 중복 문제를 해결
파이썬 3.8에서 새롭게 도입된 구문
a :=b
대입문이 쓰일 수 없는 위치에서 변수에 값을 대입할 수 있기에 유용하다
왈러스 사용 전
필요 이상으로 시각적 잡음이 많다
else 구문이나 그 이후 블록에게 count변수에 접근을 해야할 것 같다는 느낌을 주어서 실제 보아야할 코드보다 변수를 중요하게 본다.
fresh_fruit = {
    '사과':10,
    '바나나':8,
    '레몬':5,
}
def make_lemonade(count):
    ...
def out of_stock():
    ...
count = fresh_fruit.get('레몬',0)
if count:
    make_lemonade(count)
else:
    out_of_stock()
왈러스 사용 후
코드의 간결화
if에서만 count가 의미있어 보이게 하기에 코드의 명확성이 보인다.
즉 대입 후 평가라는 개념이 잘 잡히게 되이서 프로그램 흐름을 어떻게 제어할지 판단이 가능케 한다.
if count:=fresh_fruit.get('레몬',0):
    make_lemonade(count)
else:
    out_of_stock()
왈러스의 Power 알아보기
def slice_bananas(count):
    ...
class OutOfBananas(Exception):
    pass
def make_smoothies(count):
    ...
pieces = 0
count = fresh_fruit.get('바나나',0)
if count >=2:
    pieces = slice_bananas(count)
try:
    smoothies = make_smoothies(pieces)
except OutOfBananas:
    out_of_stock()
두번째 방식: pieces = 0 대입문을 else블록에 넣기
변수 영역과 클로저의 상호작용 방식에 위배되지 않아서 기술적 작동이 좋다
그러나, 코드를 읽거나 변수 정의를 찾아내기 쉽지 않다.
count = fresh_fruit.get('바나나',0)
if count >=2:
    pieces = slice_bananas(count)
else:
    pieces = 0
try:
    smoothies = make_smoothies(pieces)
except OutOfBananas:
    out_of_stock()
세번째 방식: 왈러스 연산자
#첫번째 방식
pieces = 0
if (count :=fresh_fruit.get('바나나',0)) >=2:
    pieces = slice_bananas(count)
try:
    smoothies = make_smoothies(pieces)
except OutOfBananas:
    out_of_stock()
#두번째 방식
pieces = 0
if (count :=fresh_fruit.get('바나나',0)) >=2:
    pieces = slice_bananas(count)
else:
    pieces = 0
try:
    smoothies = make_smoothies(pieces)
except OutOfBananas:
    out_of_stock()
while루프에서의 왈러스 파워
def pick_fruit():
    ...
def make_juice(fruit,count):
    ...
bottles = []
fresh_fruit = pick_fruit()
while fresh_fruit:
    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles.extend(batch)
    fresh_fruit = pick_fruit()
해결책1: 무한 루프-중간에서 끝내기
bottles = []
while True: #무한ㄴ 루프
    fresh_fruit = pick_fruit()
    if not fresh_fruit: #중간에서 끝내기
        break 
    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles.extend(batch)
해결책 2 : 왈러스 연산자 이용하기
while fresh_fruit := pick_fruit(): for fruit, count in fresh_fruit.items(): batch = make_juice(fruit, count) bottles.extend(batch) ```