[python] 매개변수에 대해( *args, **kwargs)

amuse·2020년 10월 21일
0
post-thumbnail

🤔 Default Value Parameter

🕹 함수를 호출할때 인자의 값을 를 지정하지 않고 호출해도 이미 함수 매개변수에 명시되어 있는 상태이기 때문에 값을 넘겨 받지 않아도 된다.

def add(a=1, b=2):
   return a + b
   
add()

🕹 하지만 함수를 호출할때 인자를 명시해 준다면 순서대로 값이 대입된다!(중요한 특성)

⚡️ 3 -> a
⚡️ 5 -> b

def add(a=1, b=2):
   print(a)
   print(b)
   return a + b
   
add(3, 5)
출력결과:
3
5

🤔 Positional Arguments

🕹 기본적인 형태는 함수가 호출될때 인자값을 ⚡️순서대로 매개변수로 넘겨 받는다.


def add(a, b):
   return a + b
   
add(1, 2)

⚡️1 -> a
⚡️2 -> b


🤔 Keyword Arguments

🕹 함수를 호출할때 미리 인자와 매개변수를 ⚡️명확하게 정해서 넘겨주는 방법도 있다!

def (a, b):
   print(a)
   print(b)
   return a + b

add(b =2, a = 1)
출력결과:
1
2

이렇게 순서에 상관없이 값을 넘길 수 있다! 또 가독성 또한 높아지기때문에 일석이조😚


🤔 Positional Arguments vs Keyword Arguments

만약에 ⚡️Positional Argument와 ⚡️Keyword Arguments함께 쓴다면...?

def add(a, b):
    print(a)
    print(b)
 
 add(b=1, 2)
Traceback (most recent call last):
File "python", line 6
SyntaxError: positional argument follows keyword argument

🕹 오류가 난다. 내용을 살펴보면 ->
⚡️Positional argument가 ⚡️keyword argument 뒤에 위치하기 때문이라고 되어있다.

🕹 Keyword Argument는 명확히 매개변수로 받을 인자값을 지정해주어서 순서에 상관없이 작성할 수 있지만 Positional argument는 순서를 꼭 지정해줘야 하기 때문에 에러가 난것이다.


🤔 Positional Argument vs Default Arguments

def add(b=2, a):
   return a + b
   
result = add(2)
print(result)

⚡️ Positional Argument 와 ⚡️ Default Arguments 를 함께 쓸때도 위와 같은 이유로 순서를 지켜주지 않는다면 오류가 발생한다!

🕹 Default Argument가 가진 특성때문에 매개변수 선언시 Default Arguments 를 앞에 NON-Default Argument 앞에 선언한다면 첫번째 인자가 첫번재 매게변수에 대입되려고 하는 특성때문에 오류가 발생한다!!


🤔 *args 란?

🕹 *args는 임의의 갯수의 ⚡️ Positional Argument 이다. 즉, 인자가 아무리 많더라도 *args 매개변수로 받을 수 있다는 것이다. 👍
🕹 *args 매개변수 선언되면 모든 인자들은 함수내부에서 tuple 형태로 처리된다.

출력결과:
뮤즈씨
뮤즈씨 amuse
뮤즈씨 amuse amuseCoding

🕹 고장난 예1)
def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("args=",end=""), print(args)


func_param_with_var_args("정우성", "01012341234", "seoul", 20)

⚡️ 만약 *args 매개변수가 중간에 선언될경우 뒤에 위치한 모든 매개변수를 tuple 형태로 받아버리기 때문에 age 매개변수에 값을 대입해줄 수 없기때문에 오류가 발생한다😭

🕹 좋은 예1)
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") 

🤔 **Kwargs 란?

🕹 kwargs는 임의의 갯수의 ⚡️ keyword arguments이다. args와 마찬가지로 인자가 아무리 많더라도 모두 매개변수로 받을 수 있다.

🕹 args 와 다른점은 kwargs는 함수 내부에서 인자들을 dictionary(딕셔너리) 형태로 처리한다.


🕹 고장난 예1) args 같은 이유로 kwargs가 중간에 선언될경우 모든 매개변수를 dictionary 형태로 받아버리기 때문에 함수에서 address 값을 받지 못한다.
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")
🕹 좋은 예1)
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")

🕹🕹 중요함 🕹🕹
def mixed_params(age, name="아이유, *args, **kwargs):
    print("age=",end=""), print(age)
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("kwargs=",end=""), print(kwargs)

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

🕹 Positional Argument 가 제일 먼저 위치해야하고 그다음에 Keyword Argument, *args, **kwargs 순으로 인자를 받아야한다!!!

1개의 댓글

comment-user-thumbnail
2021년 7월 27일

잘 설명해 주셔서 감사합니다!

답글 달기