본문 바로가기

코딩/Python

[Python/파이썬] 가변 인자 함수(*args), 키워드 인자(**kargs)

반응형

 

 

 

※ 관련 포스팅

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 - 함수 인자의 개수를 알 수 없을 때

함수, 메서드를 작성할 때 대부분의 경우 매개변수의 개수를 명확히 지정해준다. 하지만 때로는 내가 작성한 함수의 인자로 몇 개가 입력될지 모를 때가 있다. 그럴 때는 매개변수에 *를 붙이면

duck-tube.tistory.com

 

728x90