# 1. *args tuple형태 파라메터
def call(*args):
    print(args)

call('a', 'b', 'c')
('a', 'b', 'c')


_tuple = ("a", "b", "c")

call(_tuple)
(('a', 'b', 'c'),)

call(*_tuple)
('a', 'b', 'c')


_list = ["a", "b", "c"]

call(_list)
(['a', 'b', 'c'],)
 
call(*_list) # list형식을 던질수 있고, 튜플로 처리한다.
('a', 'b', 'c')


>>> def developer(name, *language):
	print("이름 : {}".format(name), end=" ")
	for lang in language:
		print(lang, end=" ")
	print()

>>> developer("홍길동", "java", "php", "asp", "c", "c++")
이름 : 홍길동 java php asp c c++ 
>>> 
>>> developer("김모씨", "python", "javascript")
이름 : 김모씨 python javascript 
>>> 



# 2. **kwargs dictionary형태 파라메터
def call(**kwargs):
    print(kwargs)
    print(kwargs.keys())
    print(kwargs.values())

call(a=1, b=2, c=3)
{'a': 1, 'b': 2, 'c': 3}
dict_keys(['a', 'b', 'c'])
dict_values([1, 2, 3])



# 3. *args, **kwargs 같이사용 순서 바뀌면 안됨 반대로하면 에러발생
def call(*args, **kwargs):
    print(args)
    print(kwargs)

call('a', 'b', 'c', a=1, b=2, c=3)
('a', 'b', 'c')
{'a': 1, 'b': 2, 'c': 3}



# 4.
def call(one, two, three):
    print(one, two, three)

_tuple = ('a', 'b', 'c')
call(*_tuple)    # call(_tuple) 에러 
a b c

_list = ['a', 'b', 'c']
call(*_list)     # call(_list) 에러
a b c

_dic = {'a': '1', 'b': '2', 'c': '3'}
call(*_dic)  # call(**_dic) <-- error 발생
a b c