Programming Language/Python
[Python]함수 - Packing/Unpacking
Sergemeow
2023. 2. 18. 16:56
08)함수_Packing/Unpacking
패킹/언패킹 연산자(packing/unpacking operator)
- 모든 시퀀스형(리스트, 튜플 등)은 패킹, 언패킹 연산자 * 를 사용하여 객체의 패킹 또는 언패킹이 가능
- 패킹
- 대입문의 좌변 변수에 위치
- 우변의 객체 수가 좌변의 변수 수보다 많을 경우 객체를 순서대로 대입
- 나머지 항목들은 모두 별 모양 기호 표시된 변수에 리스트로 대입
- 언패킹
- argument 이름이 *로 시작하는 경우, argument unpacking이라 함
-
- 패킹의 경우, 리스트로 대입
-
- 언패킹의 경우, 튜플로 대입
-
- argument 이름이 *로 시작하는 경우, argument unpacking이라 함
- 가변인자(*args)
- 가변인자란 여러개의 positional argument를 하나의 필수 parameter로 받아서 사용하는 것을 말함
- 몇 개의 positional argument를 받을지 모르는 함수를 정의할 때 유용
x, y = 1, 2 # x에 1, y에 2 할당
z = 1, 2, 3 # 1,2,3이 튜플 요소로 할당됨
a, b = 1, 2, 3, 4 # 에러. too many values to unpack(expected 2)
a, *b = 1, 2, 3, 4 # 1은 a에 할당. 2,3,4는 b에 할당
def my_sum(a, b, c):
return a + b + c
num_list = [10, 20, 30]
# result = my_sum(num_list[0], num_list[1], num_list[2])
result = my_sum(*num_list)
def test(*values):
for value in values:
print(value)
test(1)
test(1, 2)
test(1, 2, 3, 4, 5 ... ) #도 가능.
# 매개변수를 가변적으로 받을 수 있는 함수를 만들 수 있음
def my_sum(*agrs):
rlt = 0
for value in agrs:
print(value)
return rlt
my_sum() #0
my_sum(1, 2, 3) #6
#인자 하나는 꼭 받아야한다면.. def my_sum(a, *agrs)의 형태로 가능
- 패킹은 여러개의 데이터를 묶어서 변수에 할당하는 것을 말함
numbers = (1,2,3,4,5)
print(numbers)
- 언패킹은 시퀀스 속의 요소들을 여러개의 변수에 나누어 할당하는 것을 말함
numbers = (1,2,3,4,5)
a, b, c, d, e = numbers
print(a, b, c, d, e)
- 언패킹시 변수의 개수와 할당하고자 하는 요소의 개수가 동일해야함
- 언패킹시 왼쪽의 변수에 asterisk(*)를 붙이면, 할당하고 남은 요소를 리스트에 담을 수 있음
Asterisk(*)와 가변인자
- *는 시퀀스 언패킹 연산자라고도 불리며, 말 그대로 시퀀스를 풀어헤치는 연산자
- 주로 튜플이나 리스트를 언패킹하는데 사용
- *을 활용하여 가변 인자를 만들 수 있음
예시) packing을 통해 받은 모든 숫자들의 합을 구하는 함수 만들기
def sum_all(*numbers):
result = 0
for number in numbers:
result += number
return result
print(sum_all(1, 2, 3))
print(sum_all(1, 2, 3, 4, 5, 6))
- 반드시 받아야하는 인자와, 추가적인 인자를 구분해서 사용할 수 있음
def print_family_name(father, mother, *pets):
print(f'아버지 : {father}')
print(f'어머니 : {mother}')
print('반려동물들..')
for name in pets:
print(f'반려동물: {name}')
print_family_name('아부지','어무니','멍멍이','냥냥이')
가변 키워드 인자(**kwargs)
- 몇 개의 키워드 인자를 받을지 모르는 함수를 정의할 대 유용
- **kwargs는 딕셔너리로 묶여 처리되며, parameter에 **을 붙여 표현
def family(**kwawrgs):
for key, value in kwargs.items():
print(key, ":", value)
family(father='아부지', mother='어무니', baby='아기')
...
father: 아부지
mother: 어무니
baby: 아기
- 가변 인자와 가변 키워드 인자를 함께 사용할 수 있음
def test(*args, **kwargs): #keyword arguments
print(kwargs, type[kwargs])
kwargs['name']
return kwargs
test(1,2,3,4, name = 'aiden', age=21)
#1,2,3,4인자들은 args. 키워드는 kwargs