파이썬에서 왈러스 연산자는 3.8부터 등장한 기능입니다. 한 마디로 요약하면 대입과 평가를 한번에 할 수 있다는 것입니다. 문서에 나온 예제들이 그리 어렵지 않으니 한 번 쯤 훑어보셔도 괜찮을 듯 싶습니다. 저는 간단하게만 정리하겠습니다.
t에 3을 대입한 다음에 이게 0과 같은지 비교해서, 같으면 1을 출력하고 싶습니다. 이런 류의 연산이 생각보다 많이 일어나는데요. 2번째 줄과 같이 if (t = 3) != 0: 이런 식으로 쓸 수도 있다고 생각할 수 있습니다. 사실 저는 그렇게 생각했습니다.
그런데 결과를 보면 invalid syntax라고 뜨네요. 이럴 때 쓸 수 있는 게 왈러스 연산자입니다.
2번째 줄에 보면 (t := 3)이 있습니다. 이것은 변수 t에 3을 대입합니다. 다음에, (t := 3) != 0? 이것은 3이 대입된 t와 0을 비교합니다. 평가합니다. 이미 t가 왈러스 연산자에 의해 3이 대입되었고, t := 3 부분이 3으로 평가되었다는 사실이 중요합니다. 3과 0은 당연히 다르기 때문에, 결과는 1이 출력될 겁니다.
정말 그러하네요.
또 다른 예제를 하나 보겠습니다.
위 예제는 10진수의 자릿수 합을 리턴하는 프로그램입니다. 사실, 더 간결한 방법이 있긴 합니다. sum과 map, int의 조합으로 1줄만에 코딩할 수 있습니다만. 넘어가도록 하겠습니다. 보시면, x가 0인지 아닌지 판단하는 부분과, x에 x의 몫을 넣는 5번째 줄이 있습니다. 이를 통해 x는 몫임을 알 수 있습니다. 현재 수에 대해, 10으로 나눈 나머지를 더한 다음에, 현재 수에서 10으로 나눈 몫을 취합니다. 그 몫이 0이 된다면, 빠져나옵니다.
결과는 제대로 나왔는데요. x가 0인지 비교하는 부분과, x에 x를 10으로 나눈 몫을 집어넣는다는 것이 걸리적 거립니다.
어떻게 해야 할까요? 일단 x에 x // 10을 대입하는 연산과 비교하는 연산을 한꺼번에 수행합시다. 3번째 줄이 그러한 일을 수행합니다. 그런데, 이 프로그램은 딱 봐도 제대로 된 결과가 나오지 않음을 알 수 있는데요. x가 3인 경우에, 3번째 줄에서, x에 3을 10으로 나눈 몫인 0이 평가되어 버립니다.
결과는 요래 나오는데요. 간단한 해결책이 있습니다. while loop를 돌기 전에, ret값을 x % 10으로 초기화 시켜주면 됩니다.
2번째 줄에 ret = 0 대신에 ret = x % 10이 들어갔음을 알 수 있습니다. 그러면 끝 자리수를 먼저 더할 겁니다. 다음에 3번째 줄에 있는 x := x // 10:에 의해, x에 x // 10이 대입이 됩니다. 예를 들자면 x가 12345였다면, 12345를 10으로 나눈 몫인 1234가 x에 대입됩니다. 다음에, x가 1234로 평가됩니다. while x:는 x가 0이 아니라면 참을 돌려줄 텐데, 0이 아니라 1234입니다. 따라서 참이 돌려질 겁니다.
결과가 15, 42로 의도했던 결과가 나왔음을 알 수 있습니다. 물론, 이것은 sum(map(int, "12345"))로 한 줄만에 코딩할 수 있긴 합니다.
'코딩 > 파이선' 카테고리의 다른 글
파이썬 re findall 메소드와 finditer 메소드에 대해 알아봅시다. (0) | 2022.08.06 |
---|---|
파이썬 itemgetter 함수에 대해 간단하게 알아봅시다. (0) | 2022.07.13 |
파이썬 defaultdict를 언제 쓰는지 간단하게 알아봅시다. (0) | 2022.06.09 |
파이썬에서 os.environ이 무엇을 담고 있는지 알아봅시다. (0) | 2022.05.19 |
파이썬 sys.path는 어떤 데이터를 저장하고 있을까요? (2) | 2022.05.05 |
최근댓글