반복을 피해라

매일 공부(ML)·2022년 6월 2일
0

이어드림

목록 보기
64/146

대입식을 사용하여 반복을 피하라

  • 대입식: 왈러스 연산자

    • 코드 중복 문제를 해결

    • 파이썬 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()
  • 세번째 방식: 왈러스 연산자

    • 한 줄짜리 코드로 줄일 수 있다
    • count변수가 더이상 강조되지 않는다
    • pieces가 if문 다음에도 중요하다는 사실이 명확해진다.
#첫번째 방식

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: 무한 루프-중간에서 끝내기

    • 코드 재사용 향상
    • 코드 반복은 없앨 수 없지만 wile루프의 유용서은 줄어든다
    • braek문을 통해서 루프 흐름 제어
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 : 왈러스 연산자 이용하기

    • fresh_fruit변수 대입으로 관용어의 필요성 감소
    • 코드의 간결성
    • 대입식을 사용하니 중복을 줄일 수 있다
    • 가독성 향상
while fresh_fruit := pick_fruit(): for fruit, count in fresh_fruit.items(): batch = make_juice(fruit, count) bottles.extend(batch) ```
profile
성장을 도울 아카이빙 블로그

0개의 댓글