c, c++에서 제가 꽤 많이 쓰던 것 중 하나는 삼항 연산자였습니다. 파이썬에는 없을까요?

 


 예를 들어, a의 절댓값을 구하는 mabs 메서드를 생각해 보겠습니다. 이것은 아래와 같이 쓸 수 있습니다.

 

 

 a가 0보다 작으면, -a를 리턴합니다. 그렇지 않으면, if문에 걸리지 않으니 4번째 줄을 수행합니다. a를 돌려주는데요. 7번째 줄에 -1을 인자로 넣어서 mabs를 호출합니다.

 

 

 실행 결과는 위와 같습니다. -1의 절댓값은 1이니, 의도한 결과대로 잘 나왔음을 볼 수 있어요.

 


 이 링크를 보면, 중간에 이런 구문이 나옵니다.

 

 이것은 C이면, x가 평가되고, 그렇지 않으면 y로 평가됩니다.

 

 

 즉, C가 참이면, 노란색이 수행되고, 아니면 y가 수행됩니다. 이를 응용하면, mabs를 1줄로 바꿀 수 있습니다. a를 인자로 받았다면, a가 0보다 작다면 -a를, 그렇지 않으면 a를 평가하면 됩니다. 즉, -a if a < 0 else a 이렇게 쓰면, a < 0인 경우에는 -a를 수행하고, 그렇지 않으면 a를 수행합니다.

 

 이 값을 리턴하면 됩니다. 이를 코드로 작성하면 아래와 같습니다.

 

 

 if a < 0이 Condition이라는 것을 보시면 됩니다. 이걸 만족했을 때, x가, 즉 -a 가 평가되었다는 것만 보시면 됩니다.

 

 

 실행 결과는 위와 같습니다.

 

 


 이제, 몇 개의 문제를 풀어보도록 합시다. 먼저 윤년 계산입니다. 윤년은 400의 배수이거나, 100의 배수가 아니면서 4의 배수이면 됩니다.

 

 

 그러면, if절의 조건을 y % 400 == 0 이거나, (y % 4 == 0이면서 y % 100 != 0)인 경우에 1을 평가하고, 아니면 0으로 평가해 버리면 됩니다.

 

 

 2001부터 2400년까지 윤년의 갯수는 97개입니다. 4의 배수는 100개인데, 여기서 3개, 2100, 2200, 2300이 빠지기 때문입니다. 다음에 학점 계산을 풀어봅시다. 이것은 A, B, C, D, F 이렇게 5개의 점수가 있어서 생각보다 다루기 까다로워 보입니다. 그런데, 이 문제는, 특정 학점이 연속된 구간이라는 겁니다.

 

 그러면, 배열 초기화를 하고, 정렬한 다음에 bisect 모듈을 써서 계산할 수 있습니다.

 

 

 이런 식으로요. 여기에서 저는 트릭을 약간 썼는데요. 먼저 tuple은 가장 먼저 나오는 것의 대소 관계가 중요하고, 그 다음에 2번째로 나오는 원소의 대소 관계, ... 이런 식으로 우선 순위를 판단합니다. int나 str이나 비교 가능하므로, 정렬이 됩니다. 그리고 dummy를 'Z'로 두었는데요. 이는 score가 80점인 경우, 이런 경우를 경계라고 하는데요. 이 경우에, bisect_right가 (80, 'B')를 가리키는 게 아니라, (90, 'A')를 가리키게 하기 위함입니다. 1단계 위 학점을 가리키게 했으니, 실제로는 거기서 -1을 빼야 하겠죠.

 

 

 이걸 삼항 if else를 이용하면 이렇게 길어집니다. 만약에 학점이 A+, A0, A-, B+, B0, B-, C+, C0, C-, D+, D0, D-, F 이렇게 13개가 있다면 어떨까요? 이 경우에도 계속 if else 삼항 연산자로 연결해야 할까요? 이런 경우에는 정적 배열에 미리 답을 채워놓는 것이 더 좋습니다. init를 해서 초기화를 한 다음에, 정적 배열에 있는 값을 사용하면 됩니다.

 

 사실 if else if else 이렇게 걸리는 경우에도 다시 생각해 보시는 게 좋습니다. 읽기가 난해하기 때문입니다.