본문 바로가기
Python/기초

[파이썬/Python] 함수 심화: 인자 전달 방법과 default 값

by 모두의 케빈 2023. 7. 13.

이전 시간에는 함수의 정의와 기초적인 문법에 대해 알아봤습니다. 이번 시간에는 함수를 호출할 때 인자를 전달하는 방법에 대해 좀 더 알아보겠습니다.

 

Positional Argument와 Keyword Argument


 

파이썬에서 인자를 전달하는 방법에는 두 가지가 있습니다. 첫 번째는 정의된 매개변수의 순서대로 전달하는 방법이고, 두 번째는 매개변수를 지정하여 전달하는 방법입니다.

인자를 정의된 매개변수의 순서대로 전달하는 방법을 Positional Argument라고 합니다.

아래 코드를 보겠습니다. add_and_dev 함수는 처음 두 개의 인자를 먼저 더하고 마지막 인자로 나누어주는 함수입니다. 아래처럼 인자 전달의 순서가 중요한 경우에는 순서가 달라지면 예상하지 못한 결과나 에러가 발생할 수 있기 때문에 반드시 순서에 유념하여 인자를 전달해야 합니다.

def add_and_dev(a,b,c):
    print(f"인자 전달 순서: {a}, {b}, {c}")
    result = (a+b)/c
    return print(f"결과값: {result}")
    
    
add_and_dev(5,10,15)

# 위 코드의 결과값
인자 전달 순서: 5, 10, 15
결과값: 1.0

 

반면, 매개변수를 지정하여 인자를 전달하는 경우도 있습니다. 이러한 방식을 Keyword Argument라고 합니다. 이렇게 하면 순서가 중요한 경우에도 헷갈리지 않고 원하는 결과를 유도할 수 있습니다.

add_and_dev(c=15, a = 5, b = 10)

# 위 코드의 결과값
인자 전달 순서: 5, 10, 15
결과값: 1.0

 

 

Positional Argument와 Keyword Argument를 같이 쓰게 된다면?


Positional Argument는 무조건 Keyword Argument보다 앞에 있어야 한다.

 

인자를 전달하는 두 가지 방법을 함께 사용하고 싶으시다면, 하나만 기억하시면 됩니다. 무조건 Positional Argument 방식이 Keyword 방식보다 먼저 사용되어야 합니다. 만약 이를 어기면 에러가 발생합니다.

 

아래 코드를 보겠습니다. 먼저 매개변수 c에 15라는 값을 Keyword Argument 방식으로 전달했습니다. 그리고 남은 매개변수 a와 b는 Positional Argument 방식으로 인자를 전달했습니다. 이렇게 Keyword 방식을 먼저 사용하면 문법 에러가 발생합니다. (SyntaxError: positional argument follows keyword argument)

add_and_dev(c=15,5,10) # Keyword 방식이 앞에 사용되었기 때문에 에러가 발생

# 위 코드의 결과값
SyntaxError: positional argument follows keyword argument

 

에러 없이 인자를 잘 전달하기 위해서는 아래처럼 Positional Argument를 먼저 사용하면 됩니다.

add_and_dev(5, c=15, b=10) # Keyword 방식이 무조건 뒤에 와야 한다.

# 위 코드의 결과값
인자 전달 순서: 5, 10, 15
결과값: 1.0

 

 

인자를 전달하지 않으면? Default 값 설정하기


 

함수 안에서 특수한 경우에만 실행되도록 코드를 작성하고 싶거나, 인자를 전달하지 않으면 default 값이 설정되도록 할 수 있습니다.

defalut 값은 함수를 선언할 때 매개변수에 대입 연산자(=)를 활용하여 설정할 수 있습니다. 매개변수 d는 default 값이 False로 설정되었습니다. default 값이 설정된 매개변수는 함수를 호출할 때, 인자를 전달받지 못해도 에러가 발생하지 않습니다.

def add_and_dev(a,b,c,d=False): # 매개변수 d는 default값을 False로 설정
    print(f"인자 전달 순서: {a}, {b}, {c}")
    result = (a+b)/c
    
    if d == True:
        result = 9999
        
    return print(f"결과값: {result}")
    
    
    
add_and_dev(5, c=15, b=10)

# 위 코드의 실행 결과
인자 전달 순서: 5, 10, 15
결과값: 1.0

 

물론 default로 설정된 매개변수에 인자가 전달되면 해당 값으로 덮어쓰기 됩니다. 매개변수 d에 True값을 전달했기 때문에 default 값이 True로 대체됩니다. 따라서 함수의 if문이 실행되어 결과값이 9999가 출력됩니다.

add_and_dev(5, c=15, b=10, d=True) # default값이 설정된 매개변수에 인자 전달

# 위 코드의 실행 결과
인자 전달 순서: 5, 10, 15
결과값: 9999

 

 

default값을 가진 매개변수를 선언할 때는, 반드시 default 값이 없는 매개변수보다 뒤에 선언해주셔야 합니다. 그렇지 않으면 문법 에러가 발생합니다. (SyntaxError: non-default argument follows default argument)

# default 값이 선언한 매개변수는 Non-default 매개변수보다 뒤에 선언되어야 한다.
def add_and_dev(d=False, a,b,c):    
    print(f"인자 전달 순서: {a}, {b}, {c}")
    result = (a+b)/c
    
    if d == True:
        result = 9999
        
    return print(f"결과값: {result}")
    
    
    
 # 이 코드의 실행 결과
 SyntaxError: non-default argument follows default argument

 

 

다음 시간에는 여러 개의 인자를 전달할 때, 이를 받아줄 수 있는 *args와 **kwargs 매개 변수에 대해 알아보도록 하겠습니다.

댓글