안녕하세요. 이번시간에는 파이썬 min, max에 대해 알아보겠습니다. 이것은 각 원소간에 <가 지원되면 가능합니다. 저는 보통 리스트에 있는 수들을 가지고 max, min값을 뽑을 때 상당히 많이 쓰곤 합니다.

 


 기본적으로 max와 min은 빈 sequence에서는 동작하지 않습니다. 이 프로그램을 실행시켜 보겠습니다.

 

 빈 리스트를 min의 인자로 넘겨주었습니다. 어떠한 값도 없으니 min이나 max를 적용하는 것은 불가능해 보입니다.

 

 default는 이런 상황에서 유용하게 쓰일 수 있습니다. 똑같이 빈 리스트인 상황입니다. default값을 -1로 두었습니다.

 

 이 경우, 예외가 떨어지는 것이 아니라 -1이 출력됩니다. 즉, sequence에 값이 없을 때 디폴트 값 k을 설정해 주면 빈 리스트를 넘겨주었을 때, k가 떨어지게 됩니다.

 


 max는 list와 같은 sequence에서 가장 큰 값을 찾게 됩니다. 위 코드를 볼까요? 2, -1, 7이 들어 있는 리스트가 있어요. 최소값은 -1이고, 최댓값은 7이에요. 그러면 결과는 1번째 줄에 -1, 2번째 줄에는 7이 나올 겁니다.

 

 여기까지는 그러려니 하고 넘어갈 수 있습니다. 그런데 조금 더 특이한 일을 하고 싶습니다. 바로 변환된 결과가 최소, 혹은 최대가 되는 x 값을 리턴하고 싶습니다. 이 때 key를 쓰면 됩니다.

 

 key는 무엇일까요? key=lambda k: -k가 있는데요. 이를 편의상 함수라고 하겠습니다. 쉽게 말해, x에 대응되는 f(x)라고 해 볼게요. key로 함수 f를 주면, f(x)가 최소가 되는 x 값을 구해줍니다. 위 예제에서는요. lambda k: -k이기 때문에, f(x) = -x가 됩니다. x가 2, -1, 7인 경우에, f(x)의 값은 -2, 1, -7이 됩니다. f(x)의 최소값은 -7이 됩니다. 그럴려면 x가 7이 되어야 겠네요?

 

 즉, 2, -1, 7이 있다면, f(x)를 최소가 되게 하는 것은 7이 되기 때문에 7이 리턴됩니다.

 

 결과는 7이 나옵니다.

 

 이번에는 리스트에 있는 수들 중 절댓값이 최소인 것을 구하고 싶습니다. 이건 또 어떻게 하면 될까요? 복잡하게 생각하지 않아도 됩니다. 그냥, lambda y: abs(y)를 넘겨주면 됩니다. 그러면 x를 넘겨주었을 때, f(x) = abs(x)가 됩니다. -2, 1, 7 중 절댓값이 최소인 것은 1이므로, 1이 리턴됩니다.

 

 정말 그렇게 나오는군요

 

 이건 어떨까요? 각 아이템들이 list입니다. lambda y: sum(y)입니다. 인풋은 list이네요? output은 sum(list)입니다. 리스트를 받으면, 함수 f는 리스트에 있는 수들의 합을 리턴해요. [-2, 0, 3]의 합은 1, [-1, 19]는 18, [3, 7]은 10, []은 0이니까 합이 가장 큰 [-1, 19]가 리턴되겠네요?

 

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