input값이 순서에 맞춰 parameter로 함수에 전해진다.
def test_func(name, hobby) :
print(f'I am {name}, my hobby is {hobby}.')
test_func('juri', 'soccer')
#'I am juri, my hobby is soccer.'
input값이 parameter의 이름에 맞추어 함수에 전해진다. 그렇기때문에 함수에 주어지는 parameter의 순서는 뒤바뀌어도 상관없다.
def test_func(name, hobby) :
print(f'I am {name}, my hobby is {hobby}.')
test_func(hobby='basketball', name='kelly')
#'I am kelly, my hobby is basketball.'
위의 1번과 2번을 함께 사용할 수도 있다.
position arguments부분은 순서대로 선언해야하고, keyword arguments는 순서와 상관없다.
def test_func(name, food) :
print(f'{name}'s favorite food is {food}.')
test_func(nana, food = 'pasta')
test_func(food = 'pasta', 'nana') #error
position arguments가 keyword arguments보다 앞에 위치해야 한다.
함수의 parameter에 값이 입력되지않았을 때 그 자리를 대신할 값을 미리 설정해둘 수 있다. 이 값을 default 라고 한다.
def test_func(name, hobby='breathing')
print(f'{name} like {hobby}.')
test_func('juri')
#'juri like breathing'
non-default argument vs default argument
4번의 예제를 보면 default 값이 선언되지 않은 parameter가 dafault 값이 선언된 parameter 보다 앞에 위치한 것을 확인할 수 있다. 반대로 순서를 바꾸면 오류가 발생한다.
def test_func(name='nobody',age ,hobby)
pass
test_func(20,running)
위의 예제처럼 함수에 default를 설정한 값을 제외하고 그 나머지 값만을 넣으면 파이썬은 어떤 input이 어느 parameter와 연결되는지 결정할 수 없다.
default 값이 설정된 argument는 항상 default 값이 설정되지 않은 argument의 뒤에 위치해야한다.
argument를 선언하는 우선순위가 있다. 순서가 맞지않으면 파이썬은 올바른 parameter을 못찾고 길을 잃으니 조심하자
1.Position Argument
2.Default Position Argument
3.*args
4.Keyword Argument
5.**kwargs
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)
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
#TypeError: func_param_with_var_args() missing 1 required #keyword-only argument: 'age'
파이썬이 'age'에 할당된 값을 찾지못한다. args가 이후의 모든 값을 args로 인식했기 때문이다.
def func_param_with_var_args(name,age, *args):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
#name=정우성
#args=('01012341234', 'seoul')
#age=20
age 와 *args의 순서를 바꿔주었더니 동작한다.
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")
**kwargs가 keyword argument보다 앞에 위치한다. argument간의 우선순위를 고려해 위치를 변경한다.
def func_param_with_kwargs(name, age, address=0, **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", mobile="01012341234", address="seoul")
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")
argument의 특성에 따라 분류한 뒤 우선순위에 맞춰 재배열한다.
name -> default position argument 2
age -> position argument 1
address -> keyword argument 4
*args 3
**kwargs 5
def mixed_params(age, name="아이유", *args, address,**kwargs, ):
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")