파이썬 함수의 "Parameter" 형태와 규칙

김건우·2020년 7월 21일
0

1. defalt value는 non-default value parameter 앞에 정의 할 수 없다

1. 함수의 parameter의 기본적인 형태

def 함수 이름(매개변수1, 매개변수2)
	실행 구문
    return 반환값태
  • 매개변수를 parmeter라 하며, 매개변수를 받아 함수를 실행시킬 수 있다.

2. 매개변수는 반드시 positional arguments부분의 순서를 지켜줘야 한다.

  • 위의 코드를 살펴보면 크게 문제가 될 것 처럼 보이지 않지만 실행을 시키게 되면...

  • SyntaxError가 나는 것을 볼 수 있다. 오류 내용을 좀 더 자세히 읽어보면,
    Non-default argument는 default argument 따르고(앞에) 있다는 내용을 볼 수 있다.

    이렇게 기본값이 부여된 my_name을 뒤로 보내야 실행이 되는데 컴퓨터는 똑똑한데... 알아서 빈 값에 넣어주면 될텐데... 왜 그래야만 하는지 생각해 보았다.

  • 먼저 함수의 매개변수는 위와 같이 순서에 맞춰 실행된다.

  • 함수실행을 위해 값을 넣었을 때, 첫번째 값은 첫번째 매개변수와 두번째 값은 두번째 매개변수와 대응한다.

  • 함수 사용자가 값을 넣었을 때, 값이 비어있는 매개변수에 알아서 가지 못한다.

  • 오류가 일어난 코드를 실행시킨다고 가정해보자 (love_you("아이유"))

  • 이때 사용자가 아이유를 디폴트 값을 대체하려고 한것인지, 디폴트값(my_name="정우성")은 두고, your_name에 넣으려고 했던 것인지 알 수가 없다.

  • 이러한 혼란을 막기 위한 규칙 또 코드의 순차적인 실행 때문이라고 생각했다.

2. 위치 인수와 가변 인수

위치 인수

  • 실행 코드
- 인수는 위치가 지정된 순서에 대응하여 함수의 매개변수(인자)에 저장된다.

가변 인수

  • 위와 같이 함수를 구현할 때 선언한 매개변수 개수에 맞추어, 호출할 때에도 개수에 맞게 파라미터를 넘겨준다.
  • 이에 비해 가변인수는 임의 개수의 파라미터를 받는다.
  • 매개변수의 이름 앞에 *기호를 붙이면 이 자리 이후로 여러개의 파라미터가 붙을 수 있다.

아래의 오류가 난 코드를 해결하면서, 가변인수의 위치를 알아보자.

  • 오류의 내용으로는 TypeError가 나있다.
  • 인자와 인수의 각 Type이 맞지 않다는 것인데, 인자의 순서를 변경해 보았다.

  • 인자의 순서에서는 age를 앞으로 *args 를 뒤로 보냈고, age에 맞는 인수 20을 age의 위치와 맞춰 주었다.
  • 오류 없이 실행이 잘 된 모습을 볼 수 있다.
  • 이 코드를 통해 가변인수(*args)는 매개변수에서 항상 맨 뒤에 있어야 한다는 것을 알 수 있다.
  • 가변인수의 특징은 임의 개수의 파라미터를 받는 것인데, 만약에 앞에 나와있다면 지금 입력된 인수가 어떤 인자와 대응되는 것인지 알 수가 없다.

3. 가변 키워드 인수

  • 아래 코드의 오류를 분석하고 해결하면서 알아보자.

  • 먼저 오류의 내용을 분석해보면 SyntaxError:invalid syntax(구문오류가 난것을 확인 할 수 있다)
  • 이전 오류를 해결하면서 **kwargs(가변 키워드 인자)가 가장 끝에 가야 된다는 것을 알 고 있다.

  • 인자의 위치를 변경해 주면서 오류를 해결했다.

Q) **가 붙은 가변키워드 인자와 인수랑 무엇일까?

  • 가변인자 함수에 딕셔너리 변수를 전달할 때 **을 추가한다.
  • kwargs 인자에 인수가 저장되면서, {'mobile': '01012341234'} 라는 딕셔너리 타입의 결과값을 볼 수 있다.

4. 위치 인수와 키워드 가변 키워드 인수 오류 해결하기

  • 지금 까지 공부한것을 토대로, 아래 오류를 수정해보았다.


    현재 Syntax Error가 나오고 있는 코드이다.

  • 현재 인자가 없는 인수는 01012341234와 male 이다.
  • mobile="01012341234"의 경우 가변키워드 인수로 저장해주면서, 딕셔너리로 변환해주면 좋을 것 같다.
  • address는 현재 인자가 등록되어 있고, 인수에서도 어떤 인자에 들어가면 좋을지 키워드를 알려주고 있기 때문에 오류가 없다.
  • non-default value parameter -> default value -> 가변인수 -> 키워드 가변 인수 -> address 순으로 지정해 주면 될 것 같다.
  • 수정코드
  • 결과 값
profile
꾸준하게 공부하기

0개의 댓글