본문 바로가기

Language/Python

[Python] assignment expression(walrus operator)

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 fruitcount in fresh_fruit.items():

        batch = make_juice(fruitcount)

        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