초보 개발자

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

Python/윤성우 열혈 파이썬

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

taehyeki 2021. 12. 22. 18:45

[iterable 객체와 매개변수]

 

이번에 살펴 볼내용 4가지를 정리하면 다음과 같다.

func(*iterable)                  iterable 객체를 전달하면서 *을 붙여서 함수 호출할 때

func(**dict)                       dict 객체를 전달하면서 **을 붙여서 함수 호출할 때

def func(*args)                 함수를 정의하면서 매개변수 args에 *붙일 때

def func(**args)               함수를 정의하면서 매개변수 args에 **붙일 때

 

먼저 다음 두가지에 대해 살펴보려고한다. 이 둘은 객체를 전달하는 과정에서 언패킹이 진행되는 상황이다.

(리스트, 튜플, 문자열 모두 iterable 객체이다.)

 

*를 묶는다로 이해하면 되는데 푼다라고 해석하는 경우가 한 경우 있다.

이는 함수 호출 할 때 인자로 전달할 경우이다 ex )  a = (a , b)   func(*a) = func(a,b)

 

func(*iterable) 이 경우에는 푼다 !

def func(*args) 이 경우에는 묶는다 !

def who(a,b,c):
	print(a, b, c, sep = ', ')

who(*[1,2,3]) # 리스트를 풀어서 매개변수에 각각 전달
1, 2, 3
who(*(0.1,0.2,0.3)) # 튜플을 풀어서 매개변수에 각각 전달
0.1, 0.2, 0.3
who(*'abc') # 문자열을 풀어서 매개변수에 각각 전달
a, b, c

 

다음은 func(**dict)의 형태로 딕셔너리를 전달하는 예이다. 그런데 func(*iterable)의 형태로 딕셔너리를 전달하는 예도 보이고 있다. (딕셔너리도 iterable 객체이다. 키를 반환하는 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

 

그렇다면 키와 값을 튜플로 묶어서 함수에 전달하려면 어떻게 해야할까??

def who(a,b,c)
	print(a,b,c, sep=', ')
    
d = dict(a=1.b=2.c=3)
who(*(d.items())) # 이전에 설명했던 items 함수를 호출해서 뷰 객체를 얻는다.
('a',1), ('b',2). ('c', 3)

뷰 객체도 iterable 객체이므로 *을 붙이는 경우 리스트에 *를 붙이는 경우와 동일한 형태의 결과를 얻게 된다.

 

[딕셔너리와 매개변수]

함수 정의와 관련이 있는 다음 두 가지에 대해 살펴보려고 한다.

 

def func(*args)         값들이 튜플로 묶여서 args에 전달된다.

def func(**args)       전달되는 내용이 딕셔너리로 묶여서 args에 전달된다.

 

먼저 def func(*args) 형태의 함수 정의가 갖는 의미를 보이겠다. 이 매개변수 선언에 *를 붙이면 전달되는 값들이 모두 하나의 튜플로 묶여서 매개변수 args에 전달된다.

def func(*args):
	print(args) # args는 튜플
    
    
func() #빈 튜플이 전달되는 형태
()
func(1) # 1이 튜플로 묶여서 전달
(1,)
func(1,2) #1과 2가 튜플로 묶여서 전달
(1,2)
func(1,2,3)
(1,2,3)

무조건 하나의 튜플로 묶는다.

 

def func(**args):
	print(args) #args는 딕셔너리
    
func(a = 1)  # {'a':1} 생성되어 args에 전달
{'a':1}
func(a=1,b=2) # {'a':1,'b':2} 생성되어 args에 전달
{'a':1,'b':2} 
func(a=1,b=2,c=3) 
{'a':1,'b':2,'c':3}

**args는 딕셔너리로 묶겠다고 했으니까 키와 값 쌍으로 인자에 전달해야 할 것이다. 그러므로 a=1과 같은 형태로 보내주어야 한다!!

 

def func(*args1, **args2):
	print(args1) #args1은 튜플
    print(args2) #args2는 딕셔너리
    
func()
()
{}
func(1,a=1)
(1,)
{'a':1}
func(1,2,a=1,b=2)
(1,2)
{'a':1,'b':2}

'Python > 윤성우 열혈 파이썬' 카테고리의 다른 글

17강 dict & OrderedDict  (0) 2021.12.24
16강 dict & defaultdict  (0) 2021.12.24
14강 dict의 루핑 기술과 컴프리헨션  (0) 2021.12.22
13강 dict의 생성과 zip  (0) 2021.12.22
12강 네임드 튜플  (0) 2021.12.22