[Python] 위치인수와 가변인수

손종일·2020년 8월 19일
0

Python

목록 보기
12/13
post-thumbnail

위치 인수(positional arguments)

다음과 같이 함수에 인수를 순서대로 넣는 방식을 위치 인수(positional argument)라고 합니다.

print(10, 20, 30) //10 20 30

가변 인수(variable length arguments)

위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 가변인자를 사용합니다.
위치인자와 키워드인자 모두 가변인자로 사용가능합니다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것입니다.

def refresh_connection(a, *args, **kwargs):
    a.close()
    return make_connection(*args, **kwargs) //None

args의 우선순위

Regular positional args -> Default args -> Variable length positional args ->
Non-default args -> Keyword-Only args with default -> Variable length kwargs**

아래의 코드는 왜 에러가 날까?

첫번째 문제 -----------------------------------------------------------------------------------

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: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
(age는 position인데 keyword가 있다는 오류)

즉, position, keyward 중 position이 먼저 와야한다 또한 가변인수(variable length arguments)는 순서상 가장 마지막에 와야한다. 따라서 position인수가 오고 그 다음에 variable length가 와야한다.

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("정우성", "01012341234", "seoul", 20)

-> //name=정우성
args=('seoul', 20)
age=01012341234

두번째 문제 -----------------------------------------------------------------------------------

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

-> //Invaild syntax

즉, position인 name과 age가 자리하고 위의 인자 우선순위 처럼 그 뒤로 가변키워드인수(Variable length keyword arguments)가 위치하고 마지막으로 Keyword-Only args with default인 address가 있기 때문이다.
아래 코드처럼 address와
**kwargs의 위치를 바꿔야한다. default값이 있는 address는 position보다 뒤에 와야되기 때문에 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") 

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

-> //Invaild syntax

즉, 아래 코드처럼 posiion인 age를 가장 앞으로 옮겨주고 address와 kwargs의 위치를 바꿔주면 오류는 사라진다.

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" ,mobile="01012341234", address="seoul")

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

default값을 사용할건지, 안할건지에 따라 name="아이유"의 값을 변경할 수 있는데
args와 name="아이유"의 값의 위치를 변경하게 되면 args의 출력에는 args=('정우성', '01012341234', 'male')이 출력되고 name에는 default 값인 아이유가 출력되는 것을 확인할 수 있다.

def mixed_params(age, *args, name="아이유", 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" ,mobile="01012341234", address="seoul")

-> //name=아이유
args=('정우성', '01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

profile
Allday

0개의 댓글