python 3.8 PEP572 내용.
NAME = expr --> (NAME euqal expr)
NAME := expr --> (NAME walrus expr)
저렇게 표현하고 읽는다고 합니다.
case1) repeated a subexpression
Case in point: Guido found several examples where a programmer repeated a subexpression, slowing down the program, in order to save one line of code, e.g. instead of writing:
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()
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()
예를 들어, 위의 코드에서 fresh_fruit = pick_fruit() 코드를 2번 호출해버림 (초기화 코드 + 이후 대입) --> repeated a subexpression
그래서 우리는 일반적으로 이렇게 짠다(뜨끔함).
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)
이렇게 짜면 while 문을 제어할 요소가 조건문의 break 뿐임
bottles = []
while fresh_fruit := pick_fruit():
for fruit, count in fresh_fruit.items():
batch = make_juice(fruit, count)
bottles.extend(batch)
walrus operator를 이용해서 요롷게 짤 수 있다. repeated a subexpression을 피할 수 있고 코드 보기도 깔끔하다.
case2) switch/case?
match1 = pattern1.match(data)
if match1:
result = match1.group(1)
else:
match2 = pattern2.match(data)
if match2:
result = match2.group(2)
else:
result = None
파이썬은 switch/case를 지원해주지 않아서(다중 선택x..) 짜다보면 위와 같이 짜는 경우가 종종 등장함.
if (match := pattern1.match(data)) is not None:
# Do something when it match pattern1
elif (match := pattern2.match(data)) is not None:
# Do something when it match pattern2
else:
result = None
요렇게 switch/case 쓰는것처럼 추가적인 indent 없이 이쁘게 짤 수 있슴
case3) share a subexpression between a comprehension filter clause and its output
원하는 데이터만 추출해서 변환하고 싶을 때,
filtered_data = filter(lambda x: f(x) != None, data)
filtered_data = list(map(lambda x: f(x), filtered_data))
list와 filter를 통해 이렇게 짤 수 있는데,
filtered_data = [y for x in data if (y := f(x)) is not None]
walrus + list comprehension으로 저렇게 짤 수 있다.
'Language > Python' 카테고리의 다른 글
[Python] __mising__ method (default value) (0) | 2021.01.24 |
---|