def hello(name='원재연'):
return name
def hello(name):
return name
두개가 섞인다면 어떻게 되는 걸까?
# 틀린 표현
def adorable(name="raon",dog):
print(f"{dog} {name} so cute")
# 맞은 표현
def adorable(dog,name="raon"):
print(f"{dog} {name} so cute")
이런식으로 default value parameter를 먼저 사용하면 에러가 난다.
Positional arguments는 순서를 지켜주어야 하는데 순서가 틀렸기 때문에 에러가 나는것입니다.
따라서 default value parameter가 있으면 그 parameter가 가장 나중에 와줘야 된다는 것이다.
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
파이썬의 파라미터를 받는 순서이다.
받는 순서의 위치가 틀릴시, 함수는 어떤 파라미터에 어떤 값을 받아야 될지 정할수 없기 때문에 오류가 난다.
인수가 가변 인수일 경우에는 함수의 매개변수를 가변매개 변수로 씁니다.
가변 매개 변수는 def 함수이름(매개변수이름)으로 사용합니다.
가변 매개변수를 사용할때는 변수명은 관습상 args 로 사용합니다
def foo(*args): result=0 for i in args: result+=i return result ex=foo(1,2,3,4,5,6,7,8,9,10) print(ex) #실행결과 55 나옵니다.
인수의 개수가 총 10개 였지만 가변 매개변수를 사용하면 100개를 넣어도 상관없습니다.
다음과 같이 사용하면 결과값이 튜플입니다.
def foo(*args): return args ex=foo('김규영', '서한선', 'BestFriend') print(ex) #실행결과 ('김규영', '서한선', 'BestFriend')
가변 인수는 순서가 중요합니다. 일반 매개변수, *arg 순서대로 사용해야 합니다.
def foo(relations,*args): print(relations,args) ex=foo('BestFriends', '김규영', '서한선') #실행결과 BestFriends ('김규영', '서한선')
만약에 순서를 바꿔서 *arg, 일반 매개변수 순서로 사용할 경우
def foo(*args, relations): print(relations,args) ex=foo('BestFriends', '김규영', '서한선') # *arg를 어디까지 적용할지 알수 없기에 실행이 안되고 다음과 같은 에러문구가 뜹니다. # TypeError: test_func() missing 1 required keyword-only argument: 'relations'
따라서 아래와 같은 코드도
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)
이런식으로 가변 파라미터를 제일 나중에 주면 정상적으로 출력이 가능합니다.
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")
위처럼 코드를 작성하게 되면 에러가 난다.
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", address="seoul", mobile="01012341234")
결과값:
name=정우성
age=20
kwargs={'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")
위의 코드에서 파라미터의 순서를 다시 정리하여 밑의 코드로 입력을 하면 정상 출력 된것을 확인 할 수 있다.