0. 들어가며
packing은 여러개의 객체를 하나로 묶는 것.
unpacking은 여러개의 객체를 묶어 놓은 것을 풀어내는 것임.
# 패킹 : test에 한꺼번에 1,2,3을 집어넣는다
test = 1,2,3
# a,b,c 변수에 test안에 묶여있던 값들을 풀어서 집어넣는다.
a,b,c = test
#결과
print(a, b, c)
>>> 1,2,3
피보나치 수열 등을 작성할 때 아래 처럼 swap(변수 바꾸기) 했는데, unpacking 과 유사하다는 느낌이 들었다.
a,b = b, a+b
용어 설명
- 매개변수(Parameter) : 함수를 정의할 때 사용되는 변수
- 인자(Argument): 실제로 함수가 호출될 때 입력되는 변수값
- 위치인자 : 인자와 매개변수에 위치와 일치시키는 인자, 항상 키워드 인자보다 먼저 작성해야함
- 키워드인자 : 매개변수에 이름으로 일치시키는 인자
예시
- 매개변수는 args, kwargs
- 인자는 print 함수로 출력된 func(1,2,3,4,5) func1(이름 ="베베", 성 = "김") 의 1,2,3,4,5 와 이름 ="베베", 성 = "김"
- 위치인자 : 아래 코드의 1,2,3,4,5
- 키워드인자 : 이름 ="베베", 성 = "김"
- ex. func('py', b='thon') ’py’→위치인자, b=’thon’ → 키워드 인자
def func(*args):
print(args)
print(type(args))
def func1(**kwargs):
print(kwargs)
print(type(kwargs))
print(func(1,2,3,4,5))
print(func1(이름 ="베베", 성 = "김"))
#kewargs는 키워드 = 특정값 형태
# 결과값
(1, 2, 3, 4, 5)
<class 'tuple'>
{'이름': '베베', '성': '김'}
<class 'dict'>
1. 패킹
위 예시 코드를 통해 알수 있듯이,
1) 함수에 반영된 매개변수(parameter)에 패킹을 할 수 있다.
2) 위치인자 패킹은 * 을 매개변수 앞에 붙이고
3) 키워드인자 패킹은 ** 을 매개변수 앞에 붙인다.
2. 패킹을 사용하는 이유
이렇게 함수의 매개변수에 패킹을 사용해주면, 매개변수 하나에 여러개의 값을 받을 수 있다.
예를 들어 합계 함수를 구할때 인자에 구체적으로 몇개의 값이 입력될지 알수 없을 수 있다.
이때 패킹을 활용하면 이를 해결할 수 있다.
또, 인수가 입력되지 않았을 때도 오류 없이 처리할 수 있다.
# 매개변수 a,b 두개 입력
def sum_test1(a,b):
return a+b
# 3개의 인자를 입력하면 오류 발생
sum_test1(1,2,3)
#매개변수 패킹 활용
def sum_test2(*args):
result = 0
for arg in args:
result += arg
return result
# 3개의 인자를 입력해도 오류 발생하지 않음
sum_test2(1,2,3)
# 인자를 아예 입력하지 않아도 오류 발생하지 않음
sum_test2()
3. 한개의 값을 받는 매개변수와 여러개의 값을 입력받는 매개변수에 활용
추가로 반드시 1개의 값이 입력되어야 하는 매개변수와 여러개의 값을 입력해야하는 매개변수를 구분해서 작성할 수 있다.
아래 코드에서 매개변수 name에는 1개의 값만 입력받고, animals는 *을 매개변수 이름 앞에 붙여 여러 값을 받을수 있게 되었다.
def animal_family(name,*animals):
print("반려동물 보호자 : ", name)
print("반려동물 : ", animals)
animal_family("사람이름", '강아지',' 고양이','토끼')
함수를 실제로 사용할 때, 사람이름을 먼저 입력받고 뒤에 동물들을 쭉 나열하여 입력했다.
눈치챈 사람도 있을 수 있겠지만, 동물은 몇마리를 입력 받을지 알수 없기때문에,
함수를 정의할때 def animal_family(*animals, name) : 이라고 매개변수의 순서를 바꿔쓰면 오류가 발생한다.
인자를 animal_family( '강아지','고양이','토끼','사람이름') 라고 입력해도 컴퓨터는 어디까지가 animals인지 알수 없기 때문이다.
이는 아래 예시 코드를 통해서 확인 가능하다.
# 정상 작동
def test(a,*b):
print(a)
print(b)
test(1,2,3,4,5,6)
# 결과값
1
(2, 3, 4, 5, 6)
#오류 발생
def test(a,*b):
print(a)
print(b)
test(1,2,3,4,5,6)
#결과값
test() missing 1 required keyword-only argument: 'b'
'파이썬' 카테고리의 다른 글
문자열 메서드(파이썬 자료구조와 알고리즘 정리) (0) | 2022.08.17 |
---|---|
언패킹(Unpacking) (0) | 2022.08.17 |
진법변환(feat. 파이썬 자료구조와 알고리즘) (0) | 2022.08.17 |
복소수 (0) | 2022.08.17 |
++, --, +=,-=,*= 그리고 a,b = b,a (swap) (0) | 2022.08.09 |