Programming Language/Python

[Python]함수 - Packing/Unpacking

Sergemeow 2023. 2. 18. 16:56

08)함수_Packing/Unpacking

패킹/언패킹 연산자(packing/unpacking operator)

  • 모든 시퀀스형(리스트, 튜플 등)은 패킹, 언패킹 연산자 * 를 사용하여 객체의 패킹 또는 언패킹이 가능
  • 패킹
    • 대입문의 좌변 변수에 위치
    • 우변의 객체 수가 좌변의 변수 수보다 많을 경우 객체를 순서대로 대입
    • 나머지 항목들은 모두 별 모양 기호 표시된 변수에 리스트로 대입
  • 언패킹
    • 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