47.15 할당 표현식 사용하기
할당 표현식(assignment expression)은 표현식 안에서 변수에 값을 할당하는 방법입니다. :=와 같이 사용하며 바다 코끼리 연산자(walrus operator)라고도 부릅니다. :=에서 :은 눈, =은 엄니를 닮았다고 해서 붙여진 이름입니다.
:=은 파이썬 3.8 이상부터 사용 가능
변수 := 값
다음과 같이 hello의 길이를 구한 뒤 10 이상이면 length의 값과 "10 이상"이라는 문자열을 출력합니다.
hello = 'Hello, world!' length = len(hello) if length >= 10: print(f'length는 {length}, 10 이상')
실행 결과
length는 13, 10 이상
이 코드의 if 조건식 부분을 할당 표현식으로 바꾸면 다음과 같이 작성할 수 있습니다.
if_assignment_expression.py
hello = 'Hello, world!' if (length := len(hello)) >= 10: print(f'length는 {length}, 10 이상')
실행 결과
length는 13, 10 이상
if (length := len(hello)) >= 10:과 같이 if 조건문 안에서 length := len(hello)로 len의 결과 값을 변수 length에 할당하면서 >= 10으로 length의 값이 10 이상인지 판단할 수 있습니다. 이때 if (length := len(hello)) >= 10:과 같이 할당 표현식 부분을 괄호로 묶어주어야 하며 if length := len(hello) >= 10:처럼 괄호를 생략하면 조건식 len(hello) >= 10이 먼저 계산되어 length 에는 조건식의 결과 값인 True가 할당되므로 주의해야 합니다. 이렇게 할당 표현식은 변수 length 할당과 >= 10 조건 판단을 동시에 할 수 있어서 코드를 간결하게 작성할 수 있습니다.
만약 다음과 같이 조건식이 없을 경우에는 괄호를 생략할 수 있습니다.
if_assignment_expression_without_parentheses.py
hello = [] if length := len(hello): print(f'length는 {length}, 리스트에 요소가 있음') else: print(f'length는 {length}, 리스트에 요소가 없음')
실행 결과
length는 0, 리스트에 요소가 없음
이번에는 while 반복문에 할당 표현식을 사용해보겠습니다. 다음은 i = random.randint(1, 6)으로 1과 6 사이의 난수를 생성하면서 i 값이 3이 아닐 때 계속 반복합니다(3이면 반복 중지).
import random i = 0 while i != 3: # 3이 아닐 때 계속 반복 i = random.randint(1, 6) # randint를 사용하여 1과 6 사이의 난수를 생성 print(i)
이 코드의 while 반복문 부분을 할당 표현식으로 바꾸면 다음과 같이 작성할 수 있습니다.
while_assignment_expression.py
import random while (i := random.randint(1, 6)) != 3: # 1과 6 사이의 난수 생성 후 3이 아닐 때 반복 print(i)
while (i := random.randint(1, 6)) != 3:과 같이 while 반복문 안에서 random.randint(1, 6)의 결과 값을 i에 저장하면서 i의 값이 3이 아닐 때 반복하도록 하였습니다(3이면 반복 중지). 마찬가지로 조건문을 사용할 때는 (i := random.randint(1, 6))처럼 할당 표현식 부분을 괄호롤 묶어주어야 합니다.
할당 표현식은 리스트 안에서도 사용할 수 있습니다.
def ten(): return 10 a = ten() b = [a, a + 1, a + 2] print(b)
실행 결과
[10, 11, 12]
함수 ten은 10을 반환하여 변수 a에 할당하고, [a, a + 1, a + 2]와 같이 두 번째 요소부터 숫자를 더해서 리스트를 만들었습니다.
이제 리스트 안에서 할당 표현식을 사용해보겠습니다.
list_assignment_expression.py
def ten(): return 10 b = [a := ten(), a + 1, a + 2] print(b)
실행 결과
[10, 11, 12]
리스트의 첫 번째 요소에서 할당 표현식 a := ten()으로 변수 a를 할당하면 두 번째 요소부터는 a를 그대로 사용하여 리스트를 만들 수 있습니다. 물론 b = (a := ten(), a + 1, a + 2)와 같이 튜플 안에서도 할당 표현식을 사용할 수 있습니다.