Walrus 연산자 (:=), 또는 표현식 할당 연산자는 Python 3.8 버전부터 등장했습니다. 이 연산자는 변수에 값을 직접 할당할 수 있도록 하여, 반복문이나 if 문과 같은 표현식 내에서 함수의 결과나 계산 결과를 즉시 얻고 사용할 수 있게 해줍니다. 즉, 같은 호출을 두 번 반복할 필요가 없게 됩니다.
Walrus가 해결하는 문제는 연산을 중복하거나 할당을 위해 불필요한 코드 라인을 작성해야 하는 필요성입니다. 이전에는 별도의 호출을 하고 그 결과를 사용하는 방식이었으므로, 코드가 더 길어질 수밖에 없었습니다.
해결책: 이제 조건문 내에서 직접 변수를 할당할 수 있으므로 코드가 더 간결하고 때로는 더 읽기 쉽게 됩니다. 다만, walrus를 과도하게 사용하면 특히 경험이 적은 동료들에게 코드를 이해하기 어렵게 만들 수 있다는 점을 기억해야 합니다.
코드 예시:
while (line := input('문자열 입력: ')) != 'exit': print(f'입력한 내용: {line}')
주요 특징:
Walrus 연산자를 사용하여 전역 변수에 값을 할당할 수 있나요?
네, 가능합니다. 그러나 walrus는 적용된 범위에서 작동하므로 LEGB 규칙을 기억하고 함수 외부에서 변수를 조심스럽게 사용하는 것이 중요합니다.
x = expr과 (x := expr)의 차이는 무엇인가요?
x = expr은 독립적인 할당 문장이지만, (x := expr)은 다른 표현식 내에서 expr의 결과를 반환하고 x에 할당하는 표현식입니다. 많은 경우 두 번째 형식은 if 조건문, while 반복문 또는 리스트 표현식에서 사용할 수 있습니다.
Walrus는 리스트 표현식 및 제너레이터 내에서 사용할 수 있나요?
네, walrus는 comprehension에서 인기가 있으며, 이는 반복 계산을 피하는 데 특히 유용합니다.
numbers = [int(s) for s in ['1', '2', '3', '4'] if (n := int(s)) > 2] # 여기서 n은 int(s)의 결과를 저장하여 계산을 절약합니다
개발자가 여러 중첩된 walrus와 함께 긴 if 문을 작성합니다:
if (a := get_a()) and (b := a.get_b()) and (c := b.do_c()): print(c)
장점:
단점:
계산 절약과 가독성을 위해 의식적으로 사용하는 경우:
while (line := sys.stdin.readline()) != '': process(line)
장점:
단점: