위치 인수 : 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수
가변인수 : 인수의개수가 변할 수 있다는 의미.
(즉, 함수를 호출할때,
인수의 개수를 다양하게 바꿔가면 사용할 수 있는 함수를 의미.)
def info_id(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
info_id("장만월", "01022223333", "seoul", "100")
위의 함수를 call하면 error가 발생한다.
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
이 TypeError는 데이터 유형과 관련된 오류임을 뜻한다.
(age는 position임에도 불구하고 keyward가 입력되었다.)
따라서
def info_id(name, age, *args):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
### info_id("장만월", 100, "01022223333", "seoul")
정상 작동됨을 알 수 있다.
computer가 읽는 순서
Regular positional args -> Default args -> Variable length positional args ->
Non-default args -> Keyword-Only args with default -> Variable length kwargs
def info_id(name, age, **tell, address=0):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("tell=",end=""), print(tell)
print("address=",end=""), print(address)
info_id("장만월", "120", ="01022223333", address="seoul")
위의 함수를 call하면 error가 발생한다.
Invaild syntax
(문법이 틀렸다.)
info_id 함수를 보면 name, age =>(position) 그 뒤에 가변 인수가 위치하고 마지막으로 address가 위치하고 있다.
따라서 가변인수가 가장 마지막에 위치해야하고, address는 position(name, age)보다 뒤에 와야 옳은 방식이 된다.
def info_id(name, age, address=0, **tell):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("tell=",end=""), print(tell)
print("address=",end=""), print(address)
info_id("장만월", "120", tell="01022223333", address="seoul")
주의!!
address=0 상태는 keyword-Only args with default 이지만,
address만 입력하면 Non-dafault args가 된다.
하지만 이렇게 하여도 출력에는 문제되지 않는다.
def info_id(name="장만월", *gen, age, **tell, address):
print("name=",end=""), print(name)
print("gen=",end=""), print(gen)
print("age=",end=""), print(age)
print("tell=",end=""), print(tell)
print("address=",end=""), print(address)
info_id("120", "장만월", "01022223333", "female", tell="01022223333", address="seoul")
Incaild syntax
(문법 Error)
인식 순서를 다시 한번 생각해본다면
age를 맨 앞으로, ** tell과 address 위치를 치환한다.
이렇게만 해도 문제 없지만
name에 default값으로 "장만월"이 존재하는데 info_id에도 "장만월" 요소가 존재한다.
따라서, name의 default값을 사용한다면 name의 위치도 옮겨줘야한다.
def info_id(age, *gen, name="장만월", address, **tell):
print("name=",end=""), print(name)
print("gen=",end=""), print(gen)
print("age=",end=""), print(age)
print("tell=",end=""), print(tell)
print("address=",end=""), print(address)
info_id("120", "장만월", "01022223333", "female", tell="01022223333", address="seoul")
이렇게 순서를 바꿔주면 name의 "장만월"이 출력되고, tell에 "장만월 까지 묶인것을 확인할 수 있다.