가변 인자 Asterisk

1. 함수 안에서 정의하는 경우: packing

def purchase(*product):
    print(f"{product}를 구매하였으며 수량은 {len(product)}개 입니다.")


purchase("사과", "바나나", "딸기")
-----------------------------------------------
('사과', '바나나', '딸기') 구매하였으며 수량은 3 입니다.

purchase 함수의 인자는 product 1개 뿐이지만, 함수를 사용할 때는 3개의 값을 넣었습니다. 원래는 TypeError: purchase() takes 1 positional argument but 3 were given과 같은 에러가 나지만 앞에 *(asterisk)를 붙여줌으로써 여러 개의 값을 넣어주더라도 product하나로 패킹해버립니다. 근데 지금 출력문을 보면 패킹되어있는 모습이 약간 불편합니다. 조금 더 예쁘게 출력하기 위해 패킹되어 있는 상태를 언패킹하고 싶습니다.

2. 함수 실행할 때 사용하는 경우: unpacking

def purchase(*product):
    print(*product, end="")
    print(f"를 구매하였으며 총 개수는 {len(product)}개입니다.")


purchase("사과", "바나나", "딸기")
-----------------------------------------------
사과 바나나 딸기를 구매하였으며  개수는 3개입니다.

print()함수 내에서 *(asterisk)를 사용해 언패킹을 시행하였습니다.

unpacking은 zip 함수와 함께 자주 사용됩니다.

seq = [['가', '나', '다'], ['A', 'B', 'C'], [1, 2, 3]]

for i in zip(*seq):
    print(i)
-------------------------------------
('가', 'A', 1)
('나', 'B', 2)
('다', 'C', 3)

3. 변수명 앞에 붙인 경우: 부분적 unpacking


# first, second, third, fourth, fifth = ['철수', '영구', '영미', '짱구', '순애']


first, *rest = ['철수', '영구', '영미', '짱구', '순애']

print(first)

print(rest)
-------------------------------------
철수
['영구', '영미', '짱구', '순애']

[‘철수’, ‘영구’, ‘영미’, ‘짱구’, ‘순애’]로 묶여있는 데이터를 부분적으로 unpacking 하였습니다.

first, *rest, last = ['철수', '영구', '영미', '짱구', '순애']

print(first)

print(rest)

print(last)
----------------------------------------
철수
['영구', '영미', '짱구']
순애
*first, rest, last = ['철수', '영구', '영미', '짱구', '순애']

print(first)

print(rest)

print(last)
---------------------------------------------
['철수', '영구', '영미']
짱구
순애

4. 가변 키워드 인자

def checklist(**kwargs):
    for key in kwargs:
        print(f"{key}: {kwargs[key]}")


checklist(mike="check", john="not check")
---------------------------------------------
mike: check
john: not check

인자에 값을 넣어줄 때, 마치 mike, john이라는 인자가 있는 것처럼 편하게 사용하면 됩니다.

Tags:

Categories:

Updated: