[Python] Function Parameter

송진수·2021년 7월 7일
0

함수의 인수(패러미터)를 설정하는 방법

def function(a,b):
    return print(a,b)

일 때, function을 호출할 때 a 와 b에 들어갈 인수를 입력하는 방법은 여러 가지가 있다.

  1. Positional Argument(위치 인수)
function("김","밥") # 김 밥

일반적인 방법으로 a와 b에 들어갈 인수를 순서대로 전달한다.

  1. Keyword Argument(키워드 인수)
function(b="밥",a="김") # 김 밥

위 예시처럼 인수의 이름(a,b)에 맞추어서 인수를 전달하면 순서에 상관 없이 활용할 수 있다. (Positional Argument와 혼용은 가능하나, Positional Argument는 순서를 지켜주어야 함)

  1. Variable Length Argument(가변 인수)
def function(*args):
    for arg in args:
        print(arg, end=" ")

function("김","밥","김","밥") # 김 밥 김 밥

입력되는 인수가 여러 개일 경우, *(인수 이름)으로 여러 개가 입력될 수 있도록 할 수 있다.


또, 함수를 선언할 때 default값을 설정해두면 호출할 때 인수를 입력하지 않아도 인수에 default값이 전달된다.
def function(a="김",b="밥"):
    return print(a,b)
 
function() # 김 밥

주의사항

1. default값을 사용할 경우, default값이 없는 인수 다음 순서에 있어야지만 syntax error가 발생하지 않는다.

def function(a="김",b):

SyntaxError: non-default argument follows default argument

만약 위와 같은 함수가 선언이 가능하다고 가정할 때, 아래와 같이 함수를 호출한다면

function("밥")

인수 a에 "밥"이 전달된 것인지, a의 default값을 그대로 두고 b에 "밥"이 전달된 것인지 구분이 불가능하기 때문이다.


2. 위치 인수와 가변 인수를 혼용할 때에도, 가변 인수가 위치 인수 앞에 입력되어서는 안된다.

def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
 
func_param_with_var_args("정우성", "01012341234", "seoul", 20)

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

가변 인수가 몇 개나 전달될 지 알 수 있는 방법이 없어 20까지 args의 가변 인수값으로 전달되었고, age 인수에 전달된 값이 없어 에러가 발생한다.

이를 적절하게 고치면,

def func(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    
func("정우성",20, "01012341234", "seoul")
# name=정우성
# args=('01012341234', 'seoul')
# age=20

3. 가변 키워드 인수(**(인수 이름)) 역시 가변 인수의 경우와 마찬가지로 키워드가 몇 개나 올지 알 수 없기 때문에 키워드 인수 뒷 순서에 선언되어야 한다.

def func_param_with_kwargs(name, age, **kwargs, address=0):

SyntaxError: invalid syntax

쉘에서는 선언조차 되지 않는다. 이를 고치면,

def func_param_with_kwargs(name,age, address=0, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func("정우성", "20",mobile="01012341234",address="seoul")
# name=정우성
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul

4. 결국 여러 종류의 인수가 복합적으로 있을 때에는 위치 인수, default값이 있는 인수, 가변 인수, 키워드 인수, 가변 키워드 인수의 순서로 선언되어야 한다.

def mixed_params(name="아이유", *args, age, **kwargs, address):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

invalid syntax로 선언되지 않는다.

선언 순서를 고치면,

def mixed_params(age, name="아이유", *args, address, **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
 
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
profile
보초

0개의 댓글