대입식: 왈러스 연산자
코드 중복 문제를 해결
파이썬 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) ```