※ 관련 포스팅
2021.06.15 - [코딩/Python] - [Python/파이썬] 객체를 함수 매개변수로 전달하기 - 전역변수, 지역변수, 매개변수
파이썬 코드를 짜다보면 함수의 매개변수(input)을 몇개를 지정해야 될지 생각하게 되는 경우가 있다. 아래 코드는 두 숫자를 입력받아 덧셈하여 출력해주는 함수이다.
<코드>
def sum(a, b): #매개변수 a,b
sum = a + b
print("합계 :", sum)
sum(1,2)
<결과>
합계 : 3
만약 두 숫자가 아닌 3개의 숫자를 더해주고 싶다면? 함수의 매개변수를 3개로 하여 두고 아래처럼 코드를 작성할 수 있다.
<코드>
def sum(a, b, c): #매개변수 a,b,c
sum = a + b
print("합계 :", sum)
sum(1,2,3)
그런데 매개변수의 숫자가 많아진다고 해보자. 그리고 매개변수의 숫자도 매번 달라질 수 있다고 가정해보자. 그럼 위와 같은 방식은 매개변수 숫자에 따른 함수가 여러개 정의되어야 한다. 굉장히 비효율적이다.
그럼 매개변수 개수와 상관없이 함수를 1개로 작성할 수 있을까? 이 질문에 대한 답은 그렇다이다. 입력값을 애초에 리스트, 튜플과 같은 반복형(literable) 자료로 받던가 아니면 이번 포스팅의 주제인 가변인자함수 방식을 사용하는 것이다.
1. 반복형(literable) 자료를 매개변수로 선택하는 법
가변 인자 함수를 사용하기 전에 아래 방식을 사용해보았다. 매개변수(a)를 리스트로 설정하여 입력받으면 함수 1개로 작성하여도 매개변수 숫자가 가변되는 상황에 대응할 수 있다. 주의할 점은 입력값이 리스트 자료형 1개라는 것이다.(또는 튜플)
<코드>
def sum(a): #입력 매개변수는 list 또는 tuple 타입
total = 0
for num in a:
total = total + num
print("합계 : ", total)
sum([1,2,3,4,5,6]) #리스트 1개 입력
sum((5,5,5)) #튜플 1개 입력
<결과>
합계 : 21
합계 : 15
2. 가변 인자 함수(Variable argumnet)
가변 인자 함수는 말 그대로 함수의 매개변수 숫자를 모를 때 사용하는 방식이다. 사용 문법은 아래와 같다. 함수의 매개변수 앞에 * (별표)를 한개 붙여주면 함수의 매개변수를 몇개를 입력하든 함수 내에서 튜플로 인식한다. 아래 예시를 보자.
1번 방식의 입력값은 자료형 1개(리스트 또는 튜플)이지만 가변 인자 함수 사용시 실제 입력 되는 변수가 여러개인 것이 차이점이다.
<코드>
def multi_sum(*args): #함수의 매개 변수는 가변 인자 *args로 정의
num = len(args)
print("입력 된 변수 개수 : ", str(num)+"개")
print(args)
multi_sum(1,2,3,4,5,6,7) #매개변수(int) 7개
multi_sum(5,1,3,2) #매개변수(int) 4개
<결과>
입력 된 변수 개수 : 7개
(1, 2, 3, 4, 5, 6, 7)
입력 된 변수 개수 : 4개
(5, 1, 3, 2)
일반 매개 변수와 가변 인자 함수를 같이 사용하는 것도 가능하다. 아래 코드의 offset은 일반 매개변수이다.
<코드>
def offsetSum(offset, *args):
total = offset
for num in args:
total = total + num
print(total)
offset = 100
offsetSum(offset,1,2,3)
offsetSum(offset,5,1,3,2)
<결과>
106
111
3. 키워드 인자(keword arguments)
파이썬에서는 키워드 인자를 전달하는 함수도 생성할 수 있다. 키워드 인자일 경우 매개 변수명 앞에 ** (별표2개)를 붙이면 된다. 키워드 인자로 전달하면 아래 처럼 함수 내에서 딕셔너리로 인식한다.
<코드>
def saveDic(**kargs):
print(kargs)
saveDic(a=1, b=2, c=3)
saveDic(fru="사과", veg="당근")
<결과>
{'a': 1, 'b': 2, 'c': 3}
{'fru': '사과', 'veg': '당근'}
키워드 인자일 경우에도 동일하게 일반 매개변수 또는 가변 인자 함수와 같이 사용 가능하다.
<코드>
def saveDic(category, **kargs):
print("카테고리 : ",category)
print(kargs)
category = "숫자"
saveDic(category, a=1, b=2, c=3)
category = "과일,야채"
saveDic(category, fru="사과", veg="당근")
<결과>
카테고리 : 숫자
{'a': 1, 'b': 2, 'c': 3}
카테고리 : 과일,야채
{'fru': '사과', 'veg': '당근'}
키워드인자와 가변 인자 함수, 키워드 인자와 일반 매개 변수 사용시 입력 순서는 무조건 키워드인자 함수는 뒤에 나와야 한다. 아래 코드를 실행하면 오류가 발생한다.
<코드>
def saveDic(**kargs, category):
print("카테고리 : ",category)
print(kargs)
category = "숫자"
saveDic(a=1, b=2, c=3, category)
<결과>
def saveDic(**kargs, category):
^
SyntaxError: invalid syntax
**kargs와 category의 순서를 바꿔보면 정상적으로 동작하는걸 확인할 수 있다.
참고링크 : https://duck-tube.tistory.com/16
'코딩 > Python' 카테고리의 다른 글
[Python/파이썬] 데코레이터(Decorator) 2편 : 매개변수 있는 함수에 데코레이터 적용 (0) | 2021.07.16 |
---|---|
[Python/파이썬] 함수 속의 함수 - 데코레이터(Decorator) 1편 (0) | 2021.07.14 |
[Python/파이썬] 자료형 - Dictionary 2편 : 딕셔너리 컴프리헨션 (0) | 2021.06.19 |
[Python/파이썬] 객체를 함수 매개변수로 전달하기 - 전역변수, 지역변수, 매개변수 (0) | 2021.06.15 |
[Python/파이썬] 자료형 - Dictionary 1편 : 기초 (0) | 2021.06.13 |