TIL(18) - Function Parameters
파이썬 함수의 다양한 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개밖에 설정이 되지 않기 때문에 갯수 초과로 에러메세지가 나게 된다.
Author And Source
이 문제에 관하여(TIL(18) - Function Parameters), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kyeongraekim/Python-TIL18-Function-Parameters저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)