[TIL - 4 / Python ] Function Parameters

haejun-kim·2020년 7월 21일
0

[Python]

목록 보기
10/19

Function Parameters

함수는 input parameter를 받아서 returs값을 output으로 리턴한다.
그리고 함수를 호출할 때 parameter를 함수에 건내주어서 호출한다. 함수의 parameter에는 여러가지 형태가 있다.

default parameter

가장 기본적인 경우이다. 순서대로 값이 parameter로 함수에 전해지는 경우이다.

Keyword Arguments

기본적인 경우와는 다르게 순서를 신경쓰지 않고 parameter에 값을 전해주는 방법도 있다. 순서가 아닌 이름으로 값을 전달해주는 경우인데 이 경우가 keyword argument이다. Keyword arguments 방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 괜찮다.

순서가 바뀌는 점 말고 또 다른 장점으로는 가독성이 좋아진다. 값을 넘길때부터 명확히 이름으로 넘기기 때문에 이름만 보아도 어떤 값을 넘기는지 더 파악하기 좋다. 또한, 순서에 신경써야 하는 경우 순서를 잘못 입력하면 에러로 이어지지만 keyword argement같은 경우는 이름으로 넘기기 때문에 순서를 잘못 입력해두어도 실수로 값이 바뀌는 경우는 상대적으로 적다.

Mixing positional arguments and keyword arguments

순서를 맞추어서 parameter 값을 전해주는 positional argumentskeyword arguments를 혼용하여 사용하는것도 가능하다.

다만 여기서 중요한것은 keyword arguments 는 순서가 바뀌어도 상관 없지만 positional arguments 부분은 순서를 지켜줘야 한다는 것이다.

Parameter Default Value

함수의 parameterdefault 값을 정의해 줄 수 도 있다. Default 값이 정의된 paramter는 함수가 호출될때 값이 넘겨지 않아도 괜찮다. 값이 넘겨지 않은 경우 default 값이 자동으로 넘겨지게 된다.

주의 : default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter 보다 먼저 위치해 있으면 안된다.


정리

1. default value parameter를 non-default value parameter 앞에 정의 하면 안된다. 이유는?

파이썬에서 파라미터를 받는 순서는 규칙으로 정해져있고 그 규칙은 다음과 같다.


def compute(a, b, c, *more, print_result=False, ignore_execeptions=True, **kwargs):
...

위의 규칙을 지켜주지 않으면 파이썬에서는 어떤 파라미터에 어떤 값을 받아야할지 정할 수 없게되어 오류가 발생한다. 이전에 *args**kwargs에 대해 공부할때에도 순서가 중요했는데, **kwargs*args앞에 올 수 없었다. 그 이유는 파이썬에서는 어디서부터 어디까지 * 변수에 담아야 할지 알 수 없기 때문에, 일반 변수를 앞에 두고 그 뒤에 *변수를 지정해주어야 에러가 발생하지 않는다는것을 배웠는데 비슷한 이유이지 않을까 생각한다.

2. 다음의 함수 오류부분 수정

2-1. 위치 인수(positional arguments)와 가변 인수(variable length arguments)의 위치

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)

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

  • 해당 오류는 function'age' parameter에 필요한 argument가 할당되지 않았다는 오류인데, 이 오류는 *args때문에 발생했다. 여러개의 arguments를 받아 tuple 형태로 리턴해주기 때문에, 호출할 때 받은 인자중 *args를 포함한 그 뒤의 있는 인자는 모두 *args에 할당되기 때문에 age가 할당되지 않은것이다. 따라서 age를 지워주면 된다.
    상단의 코드를 다음과 같이 수정해주면 오류를 해결할 수 있다.
def func_param_with_var_args(name, *agrs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)


func_param_with_var_args("정우성", "01012341234", "seoul", 20)
  • 오류 수정 결과

2-2. 가변 키워드 인수 (variable length keyword arguments)의 위치

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


func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
  • 이번에 발생한 오류는 다음과 같다.
    def func_param_with_kwargs(name, age, **kwargs, address=0): ^ SyntaxError: invalid syntax

address부분에서 문법적인 오류가 발생했으니 이부분에 대해 확인하면 될 듯 싶다.
파이썬의 파라미터 규칙에 의하면 **kwargs는 가장 뒤에 위치해야한다. 따라서 위치를 다음과 같이 수정해주자.

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_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
  • 오류 수정 결과

2-3. 위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치

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)


mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
  • 오류
    SyntaxError: invalid syntax

이번에도 문법적인 오류가 발생했다. 위의 문제에서 해결한방법으로 **kwargs의 위치를 가장 뒤로 옮겨주자.

def mixed_params(name="아이유", *args, age, 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")

실행시켜보니 첫번째 문제와 같은 오류가 동일하게 발생했다.

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

age에 할당할 수 없다고 하니 다시 한번 age를 호출 순서에 맞춰준다.

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")

이제 위 코드를 동작시켜보면 정상동작하는것을 확인할 수 있다.

  • 오류 수정 결과

참고자료

0개의 댓글