파이썬에서 *asterisk**

2019-04-24


파이썬에서 *는 수학적 용도 이외에도 다양한 곳에 사용할 수 있다. (도큐먼트에서 뭘 찾아보기가 너무 어렵다ㅠㅠ 어렵게 찾아냄..)


Unpacking Argument Lists

먼저 함수 호출 시 인자로 주어진 리스트를 unpacking 할 수 있다. 흔히 볼 수 있는 케이스가 *args 가 아닐까 싶다. 딕셔너리에서 Key를 unpacking 하려면 **kwargs를 쓰면 된다.

def foo(*args, **kwargs):
    # something

이렇게 하면, 매개변수의 갯수를 제한해 두지 않고 받을 수 있다.

Extended Iterable Unpacking

할당문에서 왼쪽편에서 iterable unpacking을 할 수 있다.

a, *b, c = range(5)
# a - 0
# b - [1, 2, 3]
# c - 4

for문 안에서 튜플을 implicit 할당할때도 사용할 수 있다. (짱 신기!)

for a, *b in [(1,2,3),(4,5,6,7)]:
  print(b)

# [2, 3]
# [5, 6, 7]

Additional Unpacking

코딩퀴즈 풀다가 알게된 마지막 사용법은, 튜플과 리스트를 unpacking 할 수 있는 방법이다. 자바스크립트의 ... rest/spread 랑 비슷한데 일단 *별표라서 더 심플한듯.

print(*[1,2], *[3,4,5])
# 1 2 3 4 5

딕셔너리는 ** 두개를 사용해서 unpacking 할 수 있다.

print({**{'x': 1}, **{'y': 3, 'z': 4}})
# {'x': 1, 'y': 3, 'z': 4}

딕셔너리를 *만 사용하면, 키값만 unpacking 할 수 있다. 짱짱!

print([*{1:2,3:4}, 5, 7])
# 1, 3, 5, 7

또한 튜플, 리스트, 세트, 딕셔너리를 다양하게 멀티플 unpacking을 할 수 있다!

print(*range(4), 4)
# 0, 1, 2, 3, 4,

print([*range(4), 4])
# [0, 1, 2, 3, 4]

print({*range(4), 4, *(5, 6, 7)})
# {0, 1, 2, 3, 4, 5, 6, 7}