Parameter & arguments [Wecode][210806]

이번에는 Python의 Parameter와 인수에 대해 알아보고자 한다.
특히, Parameter와 인수는 정의를 할 때 순서가 중요한 데 왜 그런지에 대해 고민해 볼 예정이다.

<목차>
1. 함수 정의 시 default value parameter & non-default value parameter의 정의 순서
2. 함수 정의 시 위치인수와 가변인수의 정의 순서
3. 함수 정의 시 가변 키워드의 정의 순서
4. 함수 정의 시 위치인수, 가변인수, 가변 키워드의 정의 순서

1. 함수 정의 시 default value parameter & non-default value parameter의 정의 순서

정의 순서를 알아보기 전에 각 Parameter가 어떤 것인지 먼저 알아보자.

  1. default value parameter : 인자값을 미리 지정한 것

  2. non-default value parameter: 인자값을 지정하지 않은 것

아래의 예제를 참고하기 바람.

def info(name="김정수", age, address):
print(name)
print("나이: ", age)
print("주소: ", address)

위의 코드에서 name="김정수"와 같이 변수에 인자 값이 미리 지정된 것을 default value parameter, 그 이외의 name, age와 같은 것은 non-default value parameter이다.

위의 함수를 정의하려고 하면, 아래와 같은 오류가 발생하게 된다.

기본적으로 Python은 변수 입력 시 앞에서 부터 순차적으로 채워 나가게 되는데, 위와 같은 예시에서 함수에 2개의 변수를 입력해주면 컴퓨터 입장에선 마지막 변수의 입력이 불가하기 때문인 것으로 보인다.

이에 반해서, 인자가 지정된 값을 가장 뒤로 보내줄 경우에는 앞에서 부터 변수를 채워서 2개를 채울 수 있고 마지막에 변수에는 이미 인자 값이 할당 돼 있어서 문제 없이 출력이 가능하다.

이런 이유 때문에, default value parameter를 나중에 지정해야 하는 것으로 보인다. 코드를 실제로 실행해 보면 아래와 같이 결과가 잘 도출된다.

2. 함수 정의 시 위치인수와 가변인수의 정의 순서

이번에도 정의 순서를 알아보기 전에 먼저 위치인수와 가변인수가 무엇인지 알아보자.

  1. 위치 인수(positional arguments): 함수에 인수를 순서대로 넣는 방식
  2. 가변 인수(variable length arguments) : 인수의 개수가 정해지지 않은 방식

위치 인수의 예시는 아래와 같다.

가변 인수의 예시는 아래와 같다.

위의 예시와 같이 인수의 갯수를 늘려서 입력해도 문제 없이 코드가 잘 작동 된다.

이제부터, 위치인수와 가변인수를 동시에 정의 할 때 어떤 인수를 먼저 정의해야 하는지 알아보자.

위의 예시에서 보면 가변 인수의 위치에 상관 없이 함수 정의가 되긴 한다.
그러나, 함수 실행을 하게 되면 위와 같은 에러가 발생하게 되는데, 컴퓨터에서 두 번째 변수부터 마지막 변수까지 가변인수로 인식해서 그렇다.

이 문제를 해결하기 위해서는 2가지 방법이 있는데, 첫 번째로는 함수 입력 시 age 변수에 인자 값을 지정해 주는 것.
두 번째는 가변 인수의 위치를 가장 마지막으로 보내주는 것이다.

첫 번째 방법은 입력 해야 할 때마다 변수에 인자 값을 지정해줘야 하는 불편함이 있기 때문에 왠만하면 가변 인수는 위치 인수보다 뒤에 위치 시키는 것이 좋아 보인다.

위와 같이 두 번째 방식을 적용했을 때 깔끔하게 실행 되는 것을 확인 할 수 있다.

3. 함수 정의 시 가변 키워드의 정의 순서

다음으로 가변 키워드의 정의 순서에 대해 알아보자.

위에는 함수 정의 시에 가변 키워드 인수가 포함이 되어있다. 보는 것과 같이 가변 키워드 인수가 가운데에 위치하게 되니 함수 정의 자체가 되질 않는다.

가변 키워드 인수를 마지막으로 보내주니 코드가 잘 실행 되는 것을 볼 수 있다. 다만, 만약 함수를 정의 하면서 변수 입력 시에 address=0 을 그냥 address로 변경해 주고, 함수 출력 시 변수를 address = "seoul"대신 "seoul"로 바꿔주면 아래와 같은 오류가 발생한다.

따라서, 가변 키워드 인수의 경우도, 변수 입력시 인자를 지정하지 않았을 때를 대비하여 가장 나중에 배치 하는 것이 문제가 없을 것으로 보인다.

4. 함수 정의 시 위치인수, 가변인수, 가변 키워드의 정의 순서

앞에서의 두 사례로 위치인수, 가변인수, 가변 키워드가 한 번에 정의 될 때 위치 인수보다는 가변인수, 가변 키워드 인수가 뒤쪽에 배치되어야 한다는 것을 합리적으로 추측할 수 있다.

그렇다면 가변인수와 가변 키워드 인수를 비교해서 어떤 것이 더 뒤쪽에 배치하면 되는지를 알아보면 모든 배치를 끝마칠 수 있을 것으로 보인다.

위의 예제를 살펴보자.
당연히 address, age 변수보다 인자가 설정되어 있는 변수인 name="아이유" 보다 앞에 있으므로 함수 정의가 되질 않는다. 따라서 순서를 아래와 같이 바꾸어 보았다.

위와 같은 변수를 입력하여 함수를 실행 했을 때, 오류 메시지가 발생하게 되는데, address변수가 address="정우성" 과 address="seoul"로 두 개가 겹쳐졌기 때문으로 보인다. 여기서 address="서울"을 지워주게 되면 정상으로 작동하는 것을 볼 수 있다.

그러나 값이 많이 뒤틀린 것을 알 수 있다. 그렇다면, 값이 정확하게 매치하게 끔 배열을 바꿔보자

잘 실행 되는 것을 볼 수 있다. 그렇다면, 마지막으로, 가변인수와 가변 키워드를 자리 바꿔서 출력해보면 배치 순서를 파악 할 수 있을 것으로 보인다.

다행히도 가변인수와 가변 키워드의 자리를 바꿔보니 함수 정의 자체가 되지 않는걸 확인 할 수 있었다.

따라서, 함수 정의 시에 인자의 배치의 순서는 아래와 같다.

  1. 인자 값이 지정되지 않은 위치 인수
  2. 인자 값이 지정 된 위치 인수
  3. 가변 인수
  4. 가변 키워드

마무리...

  블로그 작성을 해가면서 느끼는 것이지만, 코드를 직접 쳐보고 도출되는 결과를 시간의 흐름에 따라 캡쳐해서 첨부 하는 것이 내가 이해하기도 편하고 다른 사람들이 볼 때도 보기 수월할 것 같다.
앞으로도 좀 더 이해하기 쉬운 방법을 고찰하고 블로그 작성하는 능력을 키워 나가야 할 것 같다.

좋은 웹페이지 즐겨찾기