11.23 TIL

sunwoo·2020년 11월 23일
0

TIL

목록 보기
4/8
post-thumbnail

positional arguments(위치 인수) & variable length arguments(가변 인수)

위치 인수 : 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수

가변인수 : 인수의개수가 변할 수 있다는 의미.
(즉, 함수를 호출할때,
인수의 개수를 다양하게 바꿔가면 사용할 수 있는 함수를 의미.)

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")

정상 작동됨을 알 수 있다.

WHY?

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
(문법이 틀렸다.)

WHY?

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)

WHY

인식 순서를 다시 한번 생각해본다면
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에 "장만월 까지 묶인것을 확인할 수 있다.

profile
고영희를 모시고 있는 Backend 개발자 🐈

0개의 댓글