StatCounter - Free Web Tracker and Counter

Effective Python Item 10. 왈러스 연산자를 이용해 반복을 피하라

반응형

들어가기 전

 


요약

  • 왈러스 연산자를 사용해서 대입식 중복을 줄일 수 있음.
  • 왈러스 연산자는 값을 대입 → 식평가 순서로 처리됨.
  • 왈러스 연산자를 이용해 중복 제거, 무한 루프(While문) 등을 가독성 있게 처리할 수 있음. 

 


Item10. 왈러스 연산자를 사용해 반복을 피하라. 

왈러스 연산자는 '대입식'이라고도 불린다. 

if (a:=1) > 1:
	pass

왈러스 연산자는 위처럼 사용하고, 다음 순서로 처리된다.

  1. 변수에 값을 대입
  2. 대입된 값을 이용해 식을 평가 

 


코드1. 대입식으로 코드 개선

fresh_fruits = {
    '사과': 10,
    '바나나': 8,
    '레몬': 5
}

# count가 If 절에서만 사용되는데, 굳이 밖에 선언될 필요는 없음.
count = fresh_fruits.get('레몬', 0)
if count:
    make_lemonade(count)
else:
    out_of_stock()

위 코드의 문제점은 다음과 같다. 

  1. if 절에서만 사용되는 count가 넓은 범위에 선언됨. 
  2. count를 두 번 사용함. 

이런 이유 때문에 코드의 가독성이 상대적으로 떨어지고, 중요하지 않은 변수 count가 중요한 것처럼 보인다는 문제가 있다. 왈러스 연산자를 이용해 이 코드를 개선해 볼 수 있다.

fresh_fruits = {
    '사과': 10,
    '바나나': 8,
    '레몬': 5
}

# count가 If 절에서만 사용되는데, 굳이 밖에 선언될 필요는 없음.
# 왈러스 연산자를 이용해 개선할 수 있음.
if count := fresh_fruits.get('레몬', 0):
    make_lemonade(count)
else:
    out_of_stock()

왈러스 연산자를 이용해 count 변수를 if 절에서 선언하고 사용하도록 한다. 왈러스 연산자를 이용해 앞에서 언급했던 두 가지 문제 모두 개선했다. 

 


코드2. 무한루프 → 왈러스 연산자로 개선

# 무한 루프를 돌게 하고, 무한 루프를 끝내는 방법이 Break 밖에 없음.
# 잡음이 발생할 수 있는데, 이것을 왈러스 연산자로 개선할 수 있음.
bottles1 = []
while True:
    fresh_fruit = pick_fruit()
    if not fresh_fruit:
        break

    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles1.extend(batch)

다음 코드는 한 가지 문제점이 있다.

  1. While True를 이용해 무한 루프를 돌고 있다. 무한 루프는 자칫잘못하면 프로그램이 죽게 하는 문제가 될 수 있다.

pick_fruit()의 반환 결과에 따라 루프가 종료되는데, 왈러스 연산자를 이용해 이 코드의 가독성을 더 확보해 볼 수 있다.

# 무한 루프를 돌게 하고, 무한 루프를 끝내는 방법이 Break 밖에 없음.
# 잡음이 발생할 수 있는데, 이것을 왈러스 연산자로 개선할 수 있음.
# -> 왈러스 연산자를 이용하면 이 부분을 더 읽기 쉬워진다.
bottles = []
while fresh_fruit := pick_fruit():
    for fruit, count in fresh_fruit.items():
        batch = make_juice(fruit, count)
        bottles.extend(batch)

이제 이 코드는 더 이상 무한루프를 돌지도 않고, 코드의 길이도 짧아졌다. 게다가 왈러스 연산자를 사용해서 While문의 종료조건 또한 더 명확하게 바뀌었다. (fresh_fruit가 있을 때만 처리). 무한 루프를 어쩔 수 없이 사용해야하는 경우라면, 왈러스 연산자를 이용할 수 있는지 검토해보는 것도 좋은 방안이 될 것이다.

댓글

Designed by JB FACTORY