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

김기용·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 순으로 인자를 받아야한다!!!

profile
매일 새로운 배움을 통해 꾸준히 성장하는 것을 목표를 두고 있습니다. 논리적인 사고로 문제해결 하는것에 희열을 느끼고 언젠가 제가 만든 결과물들이 사람들에게 편이를 제공하며 사용되는 날을 간절히 소망하고 있습니다. 🙏

1개의 댓글

comment-user-thumbnail
2021년 7월 27일

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

답글 달기