반응형

 파이썬에서 왈러스 연산자는 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"))로 한 줄만에 코딩할 수 있긴 합니다.

반응형

댓글을 달아 주세요