매개변수(parameter)와 인수(aruments)는 혼용해서 사용되는 헷갈리는 용어라서 잘 기억해두자
매개변수
는 함수에 입력으로 전달된 값을 받는 변수
인수
는 함수를 호출할 때 전달하는 입력값을 의미한다.
def add(a,b): # a,b는 매개변수(parameter)
return a+b
print(add(3,4)) # 3,4 는 인수(argument)
일반적으로 선언하는 인자를 의미합니다. 키워드 인자(Keyword parameter)는 인자 뒤에 param=default 형태로 기본 param = default
형태로 기본값을 선언해주면 입력값이 있을 땐 위치인자로 처리되고 값이 없을 때 default값으로 처리됩니다.
가변인자에 대하여 알아보기 전에 패킹과 언패킹 의미를 정리해야 합니다.
패킹은 단어 뜻처럼 묶는 것을 의미하고, 여러개의 값을 하나의 자료구조 데이터로 묶어 변수에 저장하는 것입니다.
언패킹은 반대로 묶은 것을 푸는 것을 의미하고, 자료구조 데이터의 요소를 여러개 변수에 나누어 저장하는 것입니다. 패킹시*
를 붙인 변수는 남은 요소 전체를 리스트에 담아 저장합니다.
언팩킹된 *arg
값이 파라미터들 중에 가운데에 있기 때문에 에러가 뜨는것입니다.
언패킹되있는 파라미터를 끝으로 옮겨주고, age에 대한 인수를 파라미터와 위치를 같게 조정해주면 바로 에러가 해결되는 모습입니다.
위치인자와 키워드인자 모두 가변인자로 사용가능합니다. 코드에서 많이 보는 *args
**kwargs
형태가 가변인자 입니다.
variable length keyword arguments
def func_param_with_kwargs(name, age, **kwargs, address):
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")
이 코드는 왜 실행이 안될까 고민해보면
*args
tuple 타입으로 형태로 저장합니다.
**kwargs
임의개수의 키워드인자 하지만 있는 dictionary 형태로 저장합니다.
def func_param_with_kwargs(name, age, address ,**kwargs, ):
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", address="seoul", mobile="01012341234" )
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")
이번 코드의 문제점
1. 가변인자*args
가 일반인자age
,address
보다 뒤에 위치해있다.
2. 키워드 가변인자**kwargs
도 다소 앞에 위치해있다.
3.name="아이유"
는 디폴트값 인자인데 맨 앞에 있다. 디폴트값 인자는 맨 뒤에 위치한다.
4. 인자가address="seoul"
처음보는 형태인데 "특수 인자값"으로*args
보다는 뒤에 위치한다.
일반 인자 >> default 일반 인자 >> 가변 인자 >> keyword-only 인자 >> 키워드 가변 인자
인자부분을 확인하여 함수 파라미터 순서를 정해준다!
20
일반인자"정우성"
일반인자 인거 같지만 파라미터 값을보면 name="아이유"
따라서, default 일반인자!!*args
파라미터 의 값으로 {"01012341234", "male"}
가변인자!!address="seoul
**kwargs
: 키워드 가변파라미터 {mobile : 01012341234}
: 키워드 가변 인자python에서 함수 정의하는법과 정의할때 파라미터와 인수 간의 관계를 살펴보았고, 함수가 정의 될때 의 우선순위를 지켜주어야만 에러가 뜨지 않고 진행된다는 사실을 알게되었다. 사실 가장 중요한 부분은 함수 정의 시 순서 라고 생각됩니다.