파이썬 기본문법 중 비교적 최근 3.8 버전부터 도입된 `:=` 문법이 있습니다.
바다코끼리(Walrus) 문법이라고 불리는데요.
정식 명칭은 대입식(Assignment Expression)입니다.
Assignment과 Expression 둘 다 무슨 개념인지 정확히 이해하고 계신다면
의미 자체가 어렵지는 않습니다. 이해하지 못하고 있어도 괜찮습니다.
지금 이해하면 되니까요!
대입과 식
파이썬에서 대입(assignment)은 이런 거죠.
a = 1
b = 2
가만히 보시면 파이썬을 포함한 대부분의 프로그래밍언어에서 할당문은 리턴을 하지 않습니다.
(예외로 자바스크립트는 기본적으로 할당문이 식(expression)이기 때문에, 할당문이 리턴을 합니다.)
이렇게 기본적인 동작의 차이 때문에 파이썬 3.8 이전에는
불가피하게 아래처럼 비효율적인 코드를 작성하게 되는 경우가 종종 있었습니다. 문법적인 한계가 있었죠.
예를 들어 while문의 경우 아래처럼,
line = input() # <---
while line != "quit":
print(line)
line = input() # <--- 반복
`line = input()` 이라는 할당문이 불가피하게 두 번 작성되어야 하는데요.
`:=` 대입식을 사용하면 아래처럼 효율적인 코드를 작성할 수 있게 됩니다.
while (line := input()) != "quit":
print(line)
간단히 설명하면, line에 input()의 결과를 대입(할당)하기도 하지만, 동시에 할당한 값을 리턴도 해 주는 덕분에
할당문이 while문이나 if문 안에 들어갈 수 있게 되는 거죠.
할당문이 가장 많이 쓰이는 기본문법 중 하나는 리스트컴프리헨션입니다.
`a_list`라는 리스트문자열 안의 단어들 중에서
"a" 글자를 제외하고도 글자 수가 3자 이상인 문자열만 모아서 `b_list`를 만들고 싶다면?
대입식(:=)이 있기 전에는 아래 코드가 가장 짧은 방식이었습니다.
a_list = ["banana", "kakao", "papaya", "apple", "pineapple"]
b_list = [i.replace("a", "") for i in a_list if len(i.replace("a", "")) > 3]
print(b_list)
# 결과 : ['pple', 'pinepple']
위의 `while`문 예시처럼, 이번에는 `replace` 연산이 두 번 실행되는 게 다소 불편합니다.
이건 할당식을 활용하면 어떻게 효율적으로 코딩할 수 있을까요?
아래처럼 if문 안에는 할당문을,
그리고 결과식 부분에는 할당된 임시변수 `word`를 써주면 중복연산이 일어나지 않습니다.
b_list = [word for i in a_list if len(word:=i.replace("a", "")) > 3]
print(b_list)
# 결과는 동일
이렇게, "할당을 하는데 리턴도 같이 해준다!"는 할당식의 특징은
업무자동화에서도 효율적으로 코딩하는 데 유용하게 쓰일 수 있습니다.
(필수적인 문법은 아니므로, 당장 이해가 되지 않는다면 굳이 억지로 도입할 필요는 없습니다.)
pyhwpx의 `hwp.get_selected_text()` 메서드를 예로 들어볼까요?
예제를 위한 예제 같은 느낌이지만ㅜ 간단한 예시를 하나만 들어보겠습니다.
현재 캐럿이 들어있는 셀의 값이나, 본문에서 선택중인 텍스트의 값을 파이썬으로 가져올 때
유용하게 사용할 수 있는 `hwp.get_selected_text()` 라는 메서드가 있습니다.
사용법은 아래와 같습니다.
만약 문서의 A1셀에서부터 값을 하나씩 출력하다가, 빈 셀이 나오면 출력을 멈추는 프로세스를 짜야 하는데
기존 방식으로는 아래처럼 짜게 됩니다.
hwp.get_into_nth_table(0)
while hwp.get_selected_text():
print(hwp.get_selected_text())
hwp.TableRightCell()
혹은 아래처럼 미리 할당을 해 두는 방식으로 짤 수도 있죠. 하지만 비효율적인 중복코드는 불가피합니다.
hwp.get_into_nth_table(0)
val = hwp.get_selected_text()
while val:
print(val)
hwp.TableRightCell()
val = hwp.get_selected_text()
이 경우에도 간단히 할당문을 사용해볼 수 있겠죠? 아래처럼요.
hwp.get_into_nth_table(0)
while val := hwp.get_selected_text():
print(val)
hwp.TableRightCell()
기본적으로 한글오토메이션API의 최적화 수준이 뛰어난 덕분에 큰 속도향상이 있지는 않지만,
45개 셀 기준으로 (아주 경미하게) 10ms 내외의 실행속도 개선이 있기는 하네요^^;
마치며
파이썬은 의도적으로(?) 문법 요소를 단순화했기 때문에
do-while 문법이나 switch문도 제공하지 않았습니다.
이런 점으로 인해 어느 정도 중복되거나 다소 비효율적인 코드가 불가피하게 사용할 수밖에 없었지만,
이 포스팅에서 소개드린 할당식 문법이나, `match-case` 문법 등이 도입됨에 따라
점차 언어적으로도 보완되고 있는 추세입니다.
개인적으로는 파이썬의 이런 변화가 대부분 바람직하다는 생각이지만,
막상 입문자들에게는 (필수로 배워야 하는 문법이 전혀 아님에도)
언어의 체감난이도를 높이는 요소로 작용하지 않을까 하는 작은 우려가 있기는 합니다.
하여튼 잘 취사선택 하셔서
재미있는 파이썬 공부, 그리고 업무자동화 연습에도 잘 활용하시기를 바랍니다^^
그럼 늘 건승하시고,
행복한 하루 되세요!!
'기타 > 파이썬 관련' 카테고리의 다른 글
[세상 쉬운 파이썬중급] nonlocal? closure? yield? generator? (0) | 2024.03.13 |
---|---|
opencv와 np.ascontiguousarray (0) | 2024.02.01 |
jupyter notebook을 pdf로 저장할 때 오류가 난다면? (0) | 2024.01.31 |
댓글