함수를 정의 할때 우리는 parameter 즉 매개변수를 사용하게 된다.
함수에서 인수를 받을 변수들을 선언해주는 것이다. 그리고 나중에 함수를 호출 할때 인수를 받아 함수 안에서 처리하게 되는데
이러한 매개변수를 함수를 호출 하기 전에 “미리” 정의할수가 있다.
바로 default value parameter (해석 그대로 기본값 매개변수 이다.)
함수를 정의할때 “미리” 매개변수에 값을 지정하여주는것이다.
def self(name, age, address) :
print("이름 : " , (name))
print("나이 : " , (age))
print("주소 : " , (address))
print(self("김상식", 31, "대전"))
이름 : 김상식
나이 : 31
주소 : 대전
위와 같은 결과가 나오는데 매개변수에 미리 값을 지정해 놓은다면
def self(name, age, address="대전") :
print("이름 : " , (name))
print("나이 : " , (age))
print("주소 : " , (address))
print(self("김상식", 31, ))
위와 같이 작성 하여도 결과 값은 똑같이 나오게 된다. 따로 인수를 할당 하지 않아도 미리 정의된 값으로 출력되게 된다.
만약 함수에 기본값 매개변수가 있는 상황에서 print(self("엄재홍", 24, “안산”)) 라고 하면은 기본값 보다 선언한 인수가 우선적으로 출력된다.
여기서 주의 할게 있는데 만약 address(매개변수) 가 아닌 name (매개변수)을 미리 기본값 매개변수로 정의 한다면 어떻게 될까?
아마 출력되지 않고 오류가 날 것 이다.
왜냐하면 기본값 매개변수는 기본값이 없는 매개변수 앞에 오면 안되기 때문이다. 기본값 매개변수가 앞으로 오게되면 컴퓨터는 위치기반 인자들 인지 기본값 매개변수인지 인식을 못하기 때문이다.
def example(a, b, c=None, r="w" , d=[], *ae, **ab)
> a,b : positional parameter
> c=none : optional parameter
> r="w" : keyword parameter
> d=[] : list parameter
> *ae : keyword-only
> **ab : var-keyword parameter
오류가 발생하는 이유는 파라미터를 정의하는 순서 없이 무작위로 생성 시 함수는 어떤 파라미터에 어떤 값을 받아야 될지 정할 수 없기 때문이다
Parameter 란 매개변수라 칭하며 함수의 정의부분에 나열되어있는 변수들을 의미한다.
크게 두 종류가 있으며
default value parameter
def self(name, age, address=“서울”) :
print("이름 : " , (name))
print("나이 : " , (age))
print("주소 : " , (address))
위와 같이 매개변수를 미리 정의하여 따로 adress 값을 입력하지 않는다면 기본값이 서울이 출력된다.
만약 함수 호출 시에 address 자리에 (포지셔널 인자 이기때문에 자리라는 표현 사용) “안산” 이라 적는다면 기본값 대신 “안산” 이라는 문자열이 출력된다.
non-default value parameter
def self(name, age, address) :
print("이름 : " , (name))
print("나이 : " , (age))
print("주소 : " , (address))
매개변수에 따로 값이 지정되있지 않는 모습이다. 만약 함수 호출시에 각 지정된 매개변수 자리에 인자를 선언하지 않으면 오류가 나타나게 된다.
또 주의 할점은 default value parameter를 non-default value parameter 앞에 사용하면 안된다는 것이다.
non-default value parameter는 포지서녈 인자를 받기 때문에 컴퓨터가 어떤 매개변수 자리가 기본값 매개변수인지 아닌지 인식을 못하기 때문에 오류가 발생한다.
arguments 란 인수 라고 부르며 함수 호출시에 전달되는 실제 값 이라고 표현할수있다.
여러가지 arguments 가 존재한다. 하지만 여러 속성의 arguments 마다 성질이 다르기 때문에
쓰는 순서를 주의해야 한다.
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
위와 같은 코드가 있다.
코드를 진행 시키면 야무지게 오류가 떠버린다.
*args 는 가변인수 인데 몇개의 매개변수를 적어야 할지 모를때 사용하는 함수이다. 전달 받은 임의의 개수 인자를 Tuple 형태로 저장한다.
한마디로 자신 뒤에 있는 모든 인수가 자신의 인수라고 인식할수있다. 20은 age 위치에 있는 위치 인수인데 가변인수는 그것을 인지 못하고 20 까지 본인의 것이라 착각하여 age 자리에 값이 없다는 오류가 뜨는 것이다.
만약 정상적으로 출력하고 싶다면 두가지 방법이 있다. 그중 첫번째는 가변인수에게 여기는 age 자리 라는걸 알려주기 위해 func_param_with_var_args("정우성", "01012341234", "seoul", age =20) 라고 키워드 인수 방식을 사용해주면 된다.
하지만 이럴경우 arg 에 번호와 주소가 들어가니 출력은 되지만 무언가를 전달하고 표현하는데에는 부족함이 있어보인다.
두번째는 가변인수를 마지막 부분에 놓는 것이다. 그렇다면 함수 호출시에 위치인수들을 제대로 인식한 뒤
마지막 남은 값들만 가변인수로 포함되니 정상적으로 출력된다.
def func_param_with_kwargs(name, age, **kwargs, address=0):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
위 코드를 보면 역시 오류가 뜬다. 매개변수 address 값이 오류라고 나온다.
이유는 **kwargs (가변 키워드 인수) 때문이다. 가변 키워드 인수란 전달받은 키워드 인자를 Dictionary 형태로 저장하는 인수이다.
이때 가변 키워드 인수는 뒤에 address 부분까지 본인의 키워드 라고 인식하여 address의 키워드 인자들이 가변 키워드 인자에 저장 되어져서 발생하는 문제 같다.
그렇기에 가변 키워드 인수를 맨뒤로 보내면 정상 출력 되는걸 볼수있다.
_def mixed_params(name="아이유", *args, age, **kwargs, address):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)_
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
위 코드 역시 오류가 발생하는 코드 이다.
왜일까?
여러 이유가 있는데 첫번째는 가변 키워드 인수가 키워드 인수 보다 앞에있어 인식이 안되기 때문이다.
이것을 수정해도 오류가 나는데 두번째 이유는 age 의 위치 인수가 가변인수 보다 뒤에 있기에 위치인수가 인식되지 않기 때문이다.
그리고 세번째 이유는 default value parameter를 non-default value parameter 앞에 사용했기 때문이다. 이럴 경우에도 위치인수가 인식이 안되기때문에 오류가 발생 한다.
그리고 함수 선언 부분 에 맞춰 호출 부분에서도 각 인자와 인수들 위치를 맞춰 주어야 한다. 맞춰주지 않으면 위치인수는 인식이 안되기 때문에 address 부분에서 오류가 발생한다.