Python 매개변수
by AMAD
함수를 정의 할 때 default value parameter를 non-default value parameter 앞에 정의 하면 안되는 이유?
매개변수의 종류에는 4가지가 있다.
- 위치 매개 변수
- 기본 매개 변수
- 키워드 매개 변수
- 가변 매개 변수(튜플형, 사전형)
위치 매개 변수
가장 기본적인 매개 변수 이다.
함수 호출 시 정해놓은 순서 그대로 매개변수를 입력 해야한다.
함수 정의 - def test(a,b,c)
함수 호출 - test(1,2,3)
순서와 개수가 처음 정의한 것으로 입력되어야 한다.
또한 위치 매개 변수와 다른 매개 변수를 함께 사용 할 때에는 위치 매개 변수를 제일 앞에 사용해야 한다.
기본 매개 변수 (Default 매개 변수)
함수 선언 시 매개 변수의 Default 값을 입력 할 수 있다.
만약 함수 호출 시 해당 매개변수가 입력 되지 않았으면, Default로 설정한 값이 들어간다.
만약 함수 호출 시 다른 값이 전달 된다면 해당 값으로 업데이트 한다.
함수 정의: def test(a=1, b=2, c=3)
함수 호출 1: test() -> a:1, b:2, c:3
함수 호출 2: test(5,4) -> a:5, b:4, c:3
함수 호출 3: test(5,6,7) -> a:5, b:6, c:7
키워드 매개 변수
함수 호출 시 키워드를 지정하여 매개변수를 입력하게 되면 순서가 바뀌어도 문제 없이 전달이 된다.
함수 정의: def test(a,b,c)
함수 호출: test(c=5, b=4, a=3)
가변 매개 변수
가변 매개변수는 튜플형과 사전형 두가지로 구분이 된다.
튜플형 가변 매개변수
튜플형은 매개변수 앞에 '*'가 붙는다.
전달 시 튜플로 전달이 된다.
함수 정의: def test(*args)
함수 호출: test(1,2,3,4) -> args:(1,2,3,4)
사전형 가변 매개 변수
사전형은 매개변수 앞에 '**'가 붙게 된다.
전달 시 사전형(dictionary)으로 전달이 된다.
함수 정의: def test(**args)
함수 호출: test(a=1, b=2, c=3) -> args: {'a':1, 'b':2, 'c':3}
다시 문제로 돌아가서 default value parameter를 non-default value parameter 앞에 정의하면 안 되는 이유에 대해 알아보자.
파라미터 내부의 인자 중 default argument가 앞 쪽에 위치하게 된다면 인자가 들어갈 곳이 애매모호해 진다.
default 값 파라미터 자체가 입력이 될 수도, 안 될 수도 있는 값이기 때문에, 정확히 원하는 값을 반환하는데 어려움이 있다.
이러한 일들을 방지하고자 함수에서 default 값이 없는 값을 앞부분으로 오도록 코드를 작성해야 한다.
위치인수와 가변인수의 위치를 참고 자료를 통해 조사해서 어떤 에러가 발생하는지 확인하고, 에러를 고쳐 정상적으로 출력해보자
위치 매개 변수인 age가 가변인수 *args보다 뒤에 와서 age에 어떤 값이 들어갈지 알 수 없어 나오는 오류이다. 오류 수정을 위해 매개변수를 수정했다.
이렇게 인수를 함수의 매개변수에 맞추어서 수정하니 정상적으로 출력되는걸 볼 수 있다.
혹은 이렇게 수정도 가능하다.
age 자체를 키워드 인수로 사용하여 값을 정해놓고 (age=20) 매개 변수에 할당하여도 정상적으로 출력이 된다.
가변 키워드 인수의 위치를 참고자료를 통해 어떤 에러가 발생하는지 확인하고, 에러를 고쳐 정상적으로 출력해보자
syntax error: 문법에러가 발생했다.
구글링 참고자료:
- 매개변수 순서에서 **kwargs는 반드시 가장 뒤쪽에 와야 한다. (뒤에는 어떤 인자도 위치할 수 없다. 함수 정의 시 **kwargs가 맨 마지막으로 이동해야 한다.) 특히 고정 매개변수와 *args, **kwargs를 함께 사용한다면 def custom_print(a, b, *args, **kwargs):순으로 지정해야 한다.
구글링 참고자료를 토대로 매개 변수를 수정해보면
정상적으로 출력되는걸 볼 수 있다.
위치 인수와 키워드 가변 인수의 위치를 참고자료를 통해 조사해서 어떤에러가 발생하는지 확인하고, 에러를 고쳐 정상적으로 출력해보자
위의 문제처럼 syntax error가 발생했다.
구글링 참고:
-> parameter 순서
함수를 정의할 때 매개변수를 어떤 형식과 순서로 지정하느냐에 따라서 함수를 호출할 때 입력하는 인수가 달라질 수 있다. 그리고 파이썬에서 매개변수를 입력하는 순서는 정해져 있다. 바로 다음과 같다!
위치 인자 - 기본값(default)인자 - 가변 인자 - 키워드 인자 - 키워드 가변 인자
예를 들어 위 순서에 맞게 def func(a, b="Hello", *args, c, **Kwargs) 라는 함수를 정의해 보면
여기서 주목해서 보아야 할 부분은 키워드 인자이다. 함수를 정의할 때는 c가 위치 인자인 a와 다를바 없어 보인다. 하지만 가변 인자인 *args 뒤에 위치해 있다는 점이 중요하다. 가변 인자 뒤에 위치한 인자들은 c=value와 같이 키워드 인자로 호출해야 한다.
그냥 값만 호출하면 안 되나??
안 된다. 왜냐하면 위에서 언급한 바와 같이 *arg 뒤에 위치해있기 때문이다. 가변인자 *args는 뒤에 나오는 모든 값들을 자신의 것으로 빨아들이기 때문에 c=value와 같이 키워드와 값을 묶어서 value가 c의 것임을 알려주어야 한다.
가변 인자가 등장하면 나머지 인자는 키워드 인자를 통해서만 전달 될 수 있다.
키워드 전용 인자라는 의미에서 영어로는 Keyword only argument라고 한다.
또한, 키워드 인자에도 기본값(default)를 지정할 수 있다. 기본값을 지정하면 함수를 호출 할 때 인자를 넘겨주지 않아도 에러가 나지 않는다.
만약 기본값을 정의하지 않으면 어떤 문제가 발생할까?
기본값이 없으면 함수를 호출 할 때 인자를 아예 전달하지 않거나 키워드 없이 값만 전달한다면 에러가 난다.
이를 방지하기 위해 기본값을 지정하는 것이다.
그렇다면 기본값이 없는 키워드 인자와 기본값이 있는 키워드 인자의 순서는 어떻게 해야 할 까??
순서는 상관없다. 왜냐하면 얘네들은 위치인자가 아니라 키워드 인자이기 때문이다. 매개변수에 기본값이 없다면 호출할 때 키워드도 명시해야 하기 때문에 구분할 수 있다.
하지만, 위치 인자의 경우는 다르다! 기본값이 있는 경우가 뒤에 나와야 한다. 기본값 매개변수가 앞에 있으면 함수를 호출할 때 어떤 매개변수를 생략한 것인지 알 수 없게 되기 때문이다.
위치 인자 자리에 키워드 인자를 사용하고 싶다면?
하지만 가변 인자 다음에 키워드 인자만 가능하다고 해서 다른 곳에서 키워드 인자를 쓰지 말라는 법은 없다. 원래 위치 인자의 자리를 / 로 구분하면 앞 쪽은 위치 인자 뒤 쪽은 키워드 인자가 사용할 수 있다. 아래의 그림을 참고하면 이해가 쉬울 것이다.
위의 참고 자료들을 토대로 매개변수의 순서를 수정하면 다음과 같다.
함수를 호출 할 때 address = seoul 이라고 인수의 값이 정의 되어있다.(키워드 인수)
mixed_params()의 *args(가변인자) 뒤에 인자로는 키워드 인자(=addreses)가 와야 한다.
하여 adress를 *args 뒤로 보내고 실행하니 정상출력이 되는 걸 확인 할 수 있다.
'Python' 카테고리의 다른 글
Python - 데코레이터 (2) | 2022.12.13 |
---|---|
itertools 모듈 combination 함수 사용하기 (2) | 2022.11.27 |
블로그의 정보
성장 하고 싶은 개발자
AMAD