Story 15. 함수 호출과 매개변수 선언에 있어서 *와 **의 사용 규칙
1. iterable 객체와 매개변수
| func(*iterable) | iterable 객체를 전달하면서 *을 붙여서 함수를 호출할 때 |
| func(**dict) | dict 객체를 전달하면서 **을 붙여서 함수를 호출할 때 |
| def func(*args) | 함수를 정의하면서 매개변수 args에 * 붙일 때 |
| def func(**args) | 함수를 정의하면서 매개변수 args에 ** 붙일 때 |
| func(*iterable) | 리스트, 튜플, 문자열을 풀어서 전달 |
| func(**dict) | 딕셔너리의 값을 풀어서 전달 |
- 객체를 전달하는 과정에서 언패킹이 진행되는 상황
- 리스트, 튜플, 문자열 모두 iterable 객체임

- func(*iterable)의 형태로 함수를 호출하는 예제
- who(*[1, 2, 3]) : 리스트를 풀어서 매개변수에 각각 전달
- who(*(0.1, 0.2, 0.3)) : 튜플을 풀어서 매개변수에 각각 전달
- who(*'abc') : 문자열을 풀어서 매개변수에 각각 전달

- func(**dict)의 형태로 딕셔너리를 전달하는 예제
- who(*d) : 이렇듯 *을 붙이면 키가 매개변수에 전달됨
- who(**d) : 이렇듯 **을 붙이면 값이 매개변수에 전달됨

- 키와 값을 튜플로 묶어서 함수에 전달하기 위한 예제
- who(*(d.items())) : 이전에 설명했던 items 함수를 호출해서 뷰 객체를 얻음
- 뷰 객체도 iterable 객체이므로 *을 붙이는 경우 리스트에 *를 붙이는 경우와 동일한 형태의 결과를 얻게 됨
2. 딕셔너리와 매개변수
| def func(*args) | 값들이 튜플로 묶여서 args에 전달된다. |
| def func(**args) | 전달되는 내용이 딕셔너리로 묶여서 args에 전달된다. |

- def func(*args) 형태의 함수 정의가 갖는 의미를 보는 예제
- 매개변수 선언에 *을 붙이면, 전달되는 값들이 모두 하나의 튜플로 묶여서 매개변수 args에 전달됨
- func() : 빈 튜플이 전달되는 형태
- func(1) : 1이 튜플로 묶여서 전달
- func(1, 2) : 1과 2가 튜플로 묶여서 전달

- def func(**args) 형태의 함수가 갖는 의미를 보이는 예제
- 딕셔너리의 생성으로 이어지며, 이 딕셔너리를 구성할 키와 값의 정보를 key = value 형태로 전달해야 함
- print(args) : args는 딕셔너리
- {'a':1, 'b':2} 생성되어 args에 전달됨