들어가기 전
- 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다.
- 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item10
요약
- 왈러스 연산자를 사용해서 대입식 중복을 줄일 수 있음.
- 왈러스 연산자는 값을 대입 → 식평가 순서로 처리됨.
- 왈러스 연산자를 이용해 중복 제거, 무한 루프(While문) 등을 가독성 있게 처리할 수 있음.
Item10. 왈러스 연산자를 사용해 반복을 피하라.
왈러스 연산자는 '대입식'이라고도 불린다.
if (a:=1) > 1:
pass
왈러스 연산자는 위처럼 사용하고, 다음 순서로 처리된다.
- 변수에 값을 대입
- 대입된 값을 이용해 식을 평가
코드1. 대입식으로 코드 개선
fresh_fruits = {
'사과': 10,
'바나나': 8,
'레몬': 5
}
# count가 If 절에서만 사용되는데, 굳이 밖에 선언될 필요는 없음.
count = fresh_fruits.get('레몬', 0)
if count:
make_lemonade(count)
else:
out_of_stock()
위 코드의 문제점은 다음과 같다.
- if 절에서만 사용되는 count가 넓은 범위에 선언됨.
- 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)
다음 코드는 한 가지 문제점이 있다.
- 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가 있을 때만 처리). 무한 루프를 어쩔 수 없이 사용해야하는 경우라면, 왈러스 연산자를 이용할 수 있는지 검토해보는 것도 좋은 방안이 될 것이다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
Effective Python Item 29. 대입식을 사용해 컴프리헨션 안에서 반복작업을 피해라. (0) | 2024.01.14 |
---|---|
Effective Python Item 16. 딕셔너리 Key에 대한 접근은 get을 사용하라. (0) | 2024.01.14 |
Effective Python Item 28. 컴프리헨션 내부에는 수식을 2개까지만 써라 (0) | 2024.01.13 |
Effective Python Item 45. 어트리뷰트를 리팩토링하는 대신 @property를 사용하라 (0) | 2024.01.13 |
Effective Python Item 44. Setter, Getter 대신 Attribute를 사용하라. (0) | 2024.01.13 |