TIL13 | Python Function - Arguments position

2021. 10. 10. 16:52언어/Python

반응형

Function Parameters - 2

위치 인수(Positional arguments)

함수를 호출할 때 전달되는 값이 인자들이 매개변수 순서와 동일하게 전달하는 방식으로 가장 많이 사용되는 방식이다.

가변 인수(Variable length arguments)

인수의 개수가 변할 수 있다는 의미로, 함수를 호출할 때 인수의 개수를 다양하게 바꿔가며 전달할 수 있는 방식이다.

 

가변 인수(*arg)를 사용할 땐 입력하는 인수들의 순서가 중요하다.

우선순위

  1. 위치 인수 (default X)
  2. 위치 인수 (default O)
  3. / (위치 인수들 어딘가에 존재)
  4. 위치 가변 인수 (*)
  5. 키워드 전용 인수 (기본값 유무 상관 없음)
  6. 키워드 전용 가변 인수 (**)

위치인수(Default O vs Default X)

default value parameternon-default value parameter 앞에 정의 하면 안 되는 이유

위치 인수가 parameter에 할당될 때 왼쪽에서 오른쪽 순서의 방향성이 존재한다.
따라서 default value parameternon-default value parameter앞에 정의하고 argument를 1개만 전달하면 해당 argument는 default value parameter에 할당되므로 non-default value parameter는 할당받는 값이 없어서 오류를 발생하게 된다.

def love_you(my_name = "정우성", your_name): 
    print(f"{my_name} loves {your_name}") 

love_you("아이유")

> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument

 

위치 인수와 가변 인수

다음 코드를 실행하면 age값이 *arg값이랑 바뀌어서 정상 출력되지 않는다는 의미의 error가 발생한다.

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)
# error
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

age값과 *arg 값을 위치를 바꿔 호출하면 오류가 발생하지 않는다.

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

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

 

가변 키워드 인수

다음 코드를 실행하면 가변인수가 위치하고 가변인수 뒤에 address가 위치해 있기 때문에 error가 발생한다.

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")
# error
SyntaxError: invalid syntax

address값과 `kwarg`** 값을 위치를 바꿔 호출하면 오류가 발생하지 않는다.

이 때 address는 default값을 가지기 때문에 위치 인자(positional arguments)인 name, age 보다 뒤에 위치해야한다.

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

''' output
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''

 

위치인수와 가변인수, 가변 키워드 인수

다음 코드도 마찬가지로 error가 발생한다.

def mixed_params(name="아이유", *args, age, **kwargs, address=0):
    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")
# error
SyntaxError: invalid syntax

위치 인수인 age를 첫번째 매개변수로 이동시켜주고 `kwargs`**를 맨 뒤로 옮겨준다.

adderss는 키워드 전용 인수이므로 가변 인수 뒤 가변 키워드 인수 앞에 위치한다.

def mixed_params(age, name="아이유", *args, address=0, **kwargs):
    print("age=",end=""), print(age)
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("address=",end=""), print(address)
    print("kwargs=",end=""), print(kwargs)

mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

''' output
age=20
name=정우성
args=('01012341234', 'male')
address=seoul
kwargs={'mobile': '01012341234'}
'''

 

all-argument-position

 

참고 사이트

https://getkt.com/blog/python-keyword-only-arguments/

 

반응형

'언어 > Python' 카테고리의 다른 글

TIL16 | Python Modules & Packages, 절대경로와 상대경로  (0) 2021.10.11
TIL15 | Python Set과 Dictionary  (0) 2021.10.11
TIL14 | Python List와 Tuple  (0) 2021.10.11
TIL12 | Python Function Parameters  (0) 2021.10.10
TIL11 | Python 문법  (0) 2021.10.10