TIL(18) - Function Parameters

12320 단어 Python3Python3

파이썬 함수의 다양한 Parameter(매개변수) 학습기록

👉 def xxxx('이곳에 들어갈 수 있는 다양한 매개변수의 기능을 탐구해보자')

01.Function Parameters

  • 기본적으로 함수는 parameter를 받아서 output을 리턴한다.
  • parameter의 가장 기본형은 순서대로 값이 주어지는 것이다.

02.Keyword Arguments

  • 위 기본 순서대로 대입되는 매개변수 외에도 키워드를 설정해서 그 순서를 무작위로 하여도 작동하는 함수 호출 방법이다.
  • 순서가 바뀐다는 점 외에도 키워드를 통한 가독성 향상에 이점이 있다. 위 기본형처럼 일일이 순서를 맞추기 위한 사람의 수작업이 훨씬 덜해지기 때문이다.

03. Positional/keyword arguments 혼합형태

  • 그리고 위 1,2번 항목을 함께 혼용하여 사용하는 것도 가능하다.
  • 다만 이 때 주의할 점은, 고정된 위치인자를 그 자리를 꼭 지켜야 한다는 점이다. Keyword arguments 간의 순서이탈은 문제가 안되나, 위치인자가 있어야할 곳에 다른 것이 오게 된다면 에러가 나게 될 것이다.

04. Parameter Default Value

  • 함수 호출 시 인자를 통해서 값을 받는 것이 아닌, 함수 호출 매개인자에 직접 기본값(default value)을 셋팅하는 방법도 있다.
  • 이 때 또한, 위치 인자의 고유의 자리를 defaut value를 갖는 매개변수가 침범하지 않도록 하는게 중요하다.

05. Parameter와 관련된 생각거리...

1) default value parameter와 non-default value parameter의 위치가 서로 바뀐다면?

  • 자신의 위치가 고정적으로 정해진 parameter는 default argument 앞에 놓여있어야한다. 언어 문법적인 측면에서, 이런 필수 고정 위치가 정해져있지 않고 혼재되어 있다면, 인터프리터 프로그램이 어떤 값이 어떤 인자와 매칭되어야 하는지 알 수가 없을 것이다. 만일 default value parameter가 더 앞에 놓이게 되면 다음과 같은 에러메세지가 뜨게 된다. "SyntaxError: non-default argument follows default argument"

<코드예제>

 def love_you(your_name = "Kim", my_name):
   print(f"{my_name} loves {your_name}")
출력결과: "SyntaxError: non-default argument follows default argument"

2) 위치 인자(positional arguments)와 가변 인자(variable length arguments)의 위치 서로 바뀐다면?

  • 위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 가변인자를 사용한다.
    위치인자와 키워드인자 모두 가변인자로 사용가능합니다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것입니다.

  • 위치 인자는 항상 제일 앞에 와야하는 특징을 지닌다. 그렇지 않으면 매개변수가 성립이 되지 않는다. 위치상 우선순위는 다음 흐름과 같다: [Regular positional args -> Default args -> Variable length positional args ->
    Non-default args -> Keyword-Only args with default -> Variable length kwargs]

<코드예제 2.1: 위치 에러>


def func(*args, p1, p2):
    print("positional-or-keyword:...{}, {}".format(p1, p2))
    print("var-positional (*args):..{}".format(args))

func(1, 2, 3, 4, 5, 9)
출력결과: TypeError: func() missing 2 required keyword-only arguments: 'p1' and 'p2' 

<코드예제 2.2: 위치 수정>


def func(p1, p2, *args):
    print("positional-or-keyword:...{}, {}".format(p1, p2))
    print("var-positional (*args):..{}".format(args))
    print("var-keyword:............{}".format(kwargs))

func(1, 2, 3, 4, 5, 9)
출력결과: positional-or-keyword:...1, 2
var-positional (*args):..(3, 4, 5, 9)

3) 위치 인자(positional arguments)와 키워드 인자(variable length keyword arguments)의 위치 서로 바뀐다면?

  • 2번 항목과 마찬가지로 위치 인자는 자신의 고정된 위치를 지켜야하고 keyword 인자와 위치가 서로 바뀌면 해석불가한 상황에 놓여 Syntax Error가 발생하게 된다.

<코드예제 3.1: 위치에러>


def func(**kwargs, p1, p2, *args):
    print("positional-or-keyword:...{}, {}".format(p1, p2))
    print("var-positional (*args):..{}".format(args))
    print("var-keyword:............{}".format(kwargs))

func(1, 2, 3, 4, 5, 9, key1=7, key2=8)
출력결과: def func(**kwargs, p1, p2, *args):
        SyntaxError: invalid syntax

<코드예제 3.2: 위치수정>

def func(p1, p2, *args, **kwargs):
    print("positional-or-keyword:...{}, {}".format(p1, p2))
    print("var-positional (*args):..{}".format(args))
    print("var-keyword:............{}".format(kwargs))
    
func(1, 2, 3, 4, 5, 9, key1=7, key2=8)    
출력결과: positional-or-keyword:...1, 2
var-positional (*args):..(3, 4, 5, 9)
var-keyword:............{'key1': 7, 'key2': 8}

*특이사항으로, 3.2 예제에서 args를 지우면, "TypeError: func() takes 2 positional arguments but 6 were given" 와 같은 에러메세지가 뜨게 되는데, 이는 중간 가변인자가 사라져서 주어진 정수 인자값을 모두 위치인자로 착각했기 때문이다. 위치인자는 2개밖에 설정이 되지 않기 때문에 갯수 초과로 에러메세지가 나게 된다.

좋은 웹페이지 즐겨찾기