함수 호출과 매개변수 선언에 있어서 *와 ** 사용 규칙

YangJiWon·2020년 8월 30일
0

python

목록 보기
9/12

iterable 객체와 매개변수

호출할 때 *와 **사용할 경우

  • func(*iterable) : 리스트, 튜플, 문자열을 풀어서 전달
  • func(**dict) : 딕셔너리의 값을 풀어 전달
def who (a, b, c):
    print(a, b, c, sep = ', ')
who(*[1, 2, 3]) # 1, 2, 3
  • 위의 예제는 func(*iterable)의 형태로 함수를 호출하는 예입니다.
def who (a, b, c):
    print(a, b, c, sep = ', ')
d = dict(a = 1, b = 2, c = 3)
who(*d) # a, b, c *을 붙이면 키가 매개변수에 전달됩니다.
who(**d) # 1, 2, 3 **을 붙이면 값이 매개변수에 전달됩니다.
  • 위의 예제는 func(**dict)의 형태로 딕셔너리를 전달하는 예제입니다.
  • 그렇다면 키와 값을 튜플로 묶어서 함수에 전달하려면 어떻게 해야 할까요?
  • 다음과 같이 하면 됩니다.
def who (a, b, c):
    print(a, b, c, sep = ', ')
d = dict(a = 1, b = 2, c = 3)
who(*(d.items()))
# ('a', 1), ('b', 2), ('c', 3)

함수 매개변수에 *와 **을 사용할 경우

  • def func(*args) : 값들이 튜플로 묶여서 args에 전달됩니다.
  • def func(**args) : 전달되는 내용이 딕셔너리로 묶여서 args에 전달됩니다.
  • def func(*args) 예제
def func(*args):
    print(args)
func()  # ()
func(1) # (1, )
func(1, 2) # (1, 2)
func(1, 2, 3) # (1, 2, 3)
  • 이 예에서 보이듯이 매개변수의 선언에 *를 붙이면, 전달되는 값들이 모두 하나의 튜플로 묶여서 매개변수 args에 전달됩니다.
  • def func(**args) 예제
def func(**args):
    print(args)
func(a = 1) # {'a' : 1}
func(a = 1, b = 2) # {'a' : 1, 'b' : 2}
  • 그리고 매개변수 선언에 있어서 다음과 같이 *args와 **args를 동시에 둘 수도 있습니다.
def func(*args1, **args2):
    print(args1)
    print(args2)
func() # () {}
func(1, a = 1) # (1, ) {'a' : 1}
func(1, 2, a = 1, b = 2) # (1, 2) {'a' : 1, 'b' : 2}

정리

  • func(iterable) : iterable 객체를 전달하면서 을 붙여서 함수 호출할 때는 언패킹 되어 매개변수에 들어갑니다.

  • func(**dict) : dict객체를 전달하면서 **을 붙여서 함수 호출할 때는 언패킹되어 매개변수에 들어갑니다. 를 붙이면 키를, **를 붙이면 값이 들어갑니다.
    키와 값을 동시에 넣고 싶으면 items()를 언패킹하여 넣는 방법도 있습니다.
    `ex) who(
    (d.items())`

  • def func(args) : 함수를 정의하면서 매개변수 args에 붙일 때는 호출하는 변수들을 패킹하여 매개변수에 하나의 튜플 형태로 전달하게 됩니다.

  • def func(**args) : 함수를 정의하면서 매개변수 args ** 붙일 때는 호출하는 변수들을 패킹하여 매개변수에 딕셔너리 형태로 전달하게 됩니다.

profile
데이터데이터데이터!!

0개의 댓글