[Python] 위치 인자와 가변 인자, 키워드 전용 가변 인자 (함수의 매개변수 2편)

이태권 (Taekwon Lee)·2022년 5월 29일
0

[Python]

목록 보기
2/5

개념

저번 1편에 다뤘던 위치 인수와 가변 인수의 차이점을 잠시 살펴보고 가자. 그리고 default(or non-default) value parameter도 개념을 보고 가자.

지난 편 복습

  1. 위치 인자(positional arguments): 함수 호출 시 전달되는 값이 매개변수에 순서대로 전달되는 인자. 가장 일반적으로 사용하는 argument다.
  2. 가변 인자(variable length arguments): 개수가 변할 수 있는 인자, 즉 함수 호출 시 인수의 개수를 다양하게 바꾸며 전달할 수 있다.
  3. default value parameter: 함수를 선언 시 미리 값이 정해지게 되는 매개변수
  4. non-default value parameter: 함수 선언 시 미리 값이 정해져 있지 않은 매개변수

이제 실제로 어떻게 코드로 구현되는지 살펴 보자.

*args (가변 인자)

  • 가변 인자는 기호 *와 뒤에 이름을 붙여 쓴다
  • 일반적으로 *args의 형태로 쓰인다.
  • non-default value parameter의 개수가 유동적일 때 사용한다.
  • 입력 받은 인자들은 튜플의 형태로 저장 된다.

**kwargs (키워드 가변 인자)

  • 키워드 가변 인자는 기호 **와 뒤에 이름을 붙여 쓴다
  • 일반적으로 **args의 형태로 쓰인다.
def saveInfo(name, age, address):
    print('이름: ', name)
    print('나이: ', age)
    print('주소: ', address)

saveInfo('홍길동', 20, '서울 종로구 사직로 161')
이름:  세종
나이:  20
주소:  서울 종로구 사직로 161

입력 인수의 우선 순위

  1. 위치 인자 (non-default)
  2. 위치 인자 (default)
  3. / (위치 인자들 어딘가에 존재한다)
  4. 위치 가변 인자 (*args)
  5. 키워드 전용 인자 (기본값 유무는 상관 없다)
  6. 키워드 전용 가변 인자 (**kwargs)


문제

배운 내용을 토대로 아래 3문제를 풀어 보자.

Q1. 아래 코드 1에서 어떤 에러가 발생하는지 확인하고, 에러를 고쳐 보자.

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)

에러 내용은 TypeError
*argsage보다 앞에 와 버리는 바람에 남은 인자 age를 찾지 못해 에러가 발생했다.

Traceback (most recent call last):
  File "<string>", line 6, in <module>
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
> 

해당 parameter *args, age의 위치와 호출하는 함수의 argument "seoul", 20의 위치를 바꾸면 해결!

def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("args=",end=""), print(args)

func_param_with_var_args("정우성", 20, "01012341234", "seoul")
name=정우성
age=20
args=('01012341234', 'seoul')

Q2. 아래 코드 2에서 어떤 에러가 발생하는지 확인하고, 에러를 고쳐 보자.

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

에러 내용은 SyntaxError
이번에는 키워드 전용 가변 인자 **kwargs의 위치가 address 앞에 위치해서 에러가 발생하였다.

File "<string>", line 1
def func_param_with_kwargs(name, age, **kwargs, address=0):
^
SyntaxError: invalid syntax

해당 parameter **args, address의 위치와 호출하는 함수의 argument 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
args=('01012341234', 'seoul')

Q3. 아래 코드 3에서 어떤 에러가 발생하는지 확인하고, 에러를 고쳐 보자.

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

에러 내용은 SyntaxError
위치 인자 age를 맨 첫 번째로, 키워드 가변 인자 **kwargs 맨 뒤로 보내면 해결! 물론 각각에 해당하는 함수의 인자의 순서도 바꿔야 한다. address=0은 키워드 전용 인자이기에, 가변 인자와 키워드 전용 가변 인자 사이에 위치한다.

File "<string>", line 1
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax
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", address="seoul", mobile="01012341234")
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

참고 자료

(GeeksforGeeks) *args and **kwargs in Python
(tistory, 불타는 키보드) [python]함수의 인자 형태와 순서 / (non)default value parameter, *args, **kwargs
(suasue.log) Python | 가변인자(*args)와 키워드 가변인자(**kwargs)
(intrepidgeeks) 위치인수와 가변인수

profile
(Backend Dev.) One step at a time

0개의 댓글