지난 TIL:04 에서 Parameter와 Argument를 정리 했음에도 More complex Function Parameters 단원에서 한참의 시간이 소요되었다. Kwargs에 대한 제대로 된 정리와 이해가 없었기 때문인 것 같고, 결정적으로 Assignments의 문제 자체를 이해를 잘 못 했었다. 첫 단추가 잘 못 끼워져 있기 때문에 밑에 단추를 이리저리 잘 끼워 맞춰보려 해봤자 소용이 없었던 것이다.
언패킹이란 개념이 있다. 하나의 Parameter(인자)로 여러개의 인자를 입력할 수 있게 만들어 준다고 보면 되는데, 예시를 통해 알아보자.
def print_num(a,b,c):
print(a)
print(b)
print(c)
print_num(10, 20, 30).. 으로 input을 할 경우 다음과 같이 출력이 된다.
10
20
30
이것을 애스터리스크()와 리스트(or튜플)로 훨씬 간편하게 입력할 수 있다.
x = [10,20,30]
print_num(x)
10
20
30
다음과 같이 출력이 된다.
딕셔너리 또한 애스터리스크를 활용해 언패킹을 할 수 있다.
def personal_info(name, age, address):
print('이름: ',name)
print('나이: ',age)
print('주소: ',address)
x = {'name' : '김기욱' , 'age': 30, 'address' : '서울시 송파구 오금동'}
personal_info(**x)
이름 : 김기욱
나이 : 30
주소 : 서울시 송파구 오금동 ....#출력결과
왜 딕셔너리는 애스터리스크(별표)를 두 번 사용할까? 딕셔너리는 키-값 쌍 형태로 값이 저장되어있는 형태기 때문이다. 그러므로 애스터리스크를 한 번 만 사용할 경우 키만 호출이 된다.
personal_info(*x)
이름 : name
나이 : age
주소 : address
사용예시
def 함수이름 (**매개변수)
코드
for loof와 활용
def personal_info(**kwargs):
for kw, arg in kwargs.items():
print(kw, ': ', arg, sep='')
personal_info 함수에 키워드와 값을 넣어서 실행할 수 있다. 값을 한 개 넣어도 되고, 세 개 넣어도된다.
personal_info(name='김기욱', age=30, address='서울시 송파구 오금동')
name : 김기욱
age : 30
address : 서울시 송파구 오금동
- 잠깐? sep=''는 뭘까? : (enter)역할을 해주는 줄바꿈 표시다.
- 잠깐? 왜 items()를 뒤에 붙일까? : kw, arg 는 각각 키와 값을 뜻한다. kw, arg를 for, if문으로 둘 다 인식시키려면 items로 키와 값 모두를 출력 중인 상태로 만들어야 한다. items 없이 기본 dictionary형태나 dic.keys()형태면 '키'만 읽어온다.
if 와 활용
def personal_info(**kwargs):
if 'name' in kwargs: # in으로 딕셔너리 안에 특정 키가 있는지 확인
print('이름: ', kwargs['name'])
if 'age' in kwargs:
print('나이: ', kwargs['age'])
if 'address' in kwargs:
print('주소: ', kwargs['address'])
보통 **kwargs를 사용한 가변 인수 함수는 다음과 같이 함수 안에서 특정 키가 있는지 확인한 뒤 해당 기능을 만든다.
문제
what_is_my_full_name 함수는 주어진 parameter중 first_name 과 last_name 이라는 parameter를 조합하여 full name을 리턴해주어야 합니다.
예를 들어, first_name이 "우성" 이고 last_name 이 "정" 이면 "정 우성" 라고 리턴하면 됩니다.
Last name과 first name 사이에 space(빈칸)이 들어가 있어야 합니다.
만일 last_name이 없거나 first_name이 없으면 둘 중 하나만 리턴하면 됩니다.
예를 들어, last_name이 없으면 "우성" 이라고 이름만 리턴하면 됩니다,
마지막으로, last_name과 first_name 둘다 없으면 "Nobody" 라고 리턴하면 됩니다.
해결
다음 구문에서 last_name과 first_name 둘 다.
kwargs안에 'key'를 의미한다.
last_name은 존재(in), first_name이 없으면(not in)
kwargs(딕셔너리)의 ['last_name]키에 맞는 값을 return한다.
last_name은 없고(not in), first_name이 존재하면(in)
kwargs(딕셔너리)의 ['last_name]키에 맞는 값을 return한다.
last_name, first_name 둘 다 없다면 "Nobody"를 return한다.
위에 세 가지 모두 해당되지 않으면 last_name(한 칸띄고)first_name을 return한다.
kwargs[first_name] 은 그 자체로 '값 = 이름'을 뜻하는 변수가 될 수 있다. 그러므로 포매팅으로 활용할 수 있는 것이다. 참고로 두 칸, 세 칸 띄우기 역시 포매팅영역과 포매팅영역 사이에 간격을 띄우는 것으로 간단히 해결 할 수 있다.