함수의 가장 기본적인 형태입니다. 위 처럼 문자열을 함수가 일반 변수로 받는 것입니다.
위처럼 순서에 맞추어서 parameter 값을 전해주지 않을 수 있는 방법도 있습니다.
순서 대신에 parameter 이름으로 맞추어서 값을 전해줄 수 있습니다. 이를 keyword argments 라고 합니다. 또한 parameter 순서가 바뀌어도 괜찮습니다. 또 가독성이 높아진다는 점도 있습니다.
위에 두 경우를 혼용해서 사용하는 것도 가능합니다. 다만 중요한 것은 keyword arguments는 순서가 바뀌어도 상관없지만 positional arguments 부분은 순서를 지켜줘야 한다는 것입니다. 예를 들어, 다음 처럼 함수를 호출하면 error가 납니다.
에러가 나는 이유는 keyword argument가 positional argument 보다 앞으로 위치되어 함수가 호출되었기 때문입니다. Positional arguments 는 순서를 지켜주어야하는데 순서가 틀렸기 때문에 에러가 나는것입니다.
README.md
Function Parameters
앞서 함수는 input parameter를 받아서 return 값을 output으로 리턴한다고 배웠습니다.
그리고 함수를 호출할때 parameter를 함수에 건내주어서(pass) 호출 한다고 배웠습니다.
함수의 parameter에는 여러 형태가 있는데요, 하나씩 보도록 하겠습니다.
먼저 가장 기본적인 형태는 다음과 같습니다.
위의 코드 처럼 순서대로 값이 parameter로 함수에 전해지는 경우가 가장 기본입니다.
Keyword Arguments
하지만 위의 경우 처럼 순서에 맞추어서 parameter 값을 전해주지 않을수 있는 방법도 있습니다.
순서 대신에 parameter 이름으로 맞추어서 값을 전해줄 수 있습니다. 이를 keyword argments 라고 합니다.
Keyword arguments 방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 괜찮습니다.
순서가 바뀌어도 괜찮다는 점 말고도 또 가독성도 높아진다는 점도 있습니다.
parameter 순서에 맞추어 값을 함수에 넘기는 경우, 실수로 값이 바뀌어도 알기가 힘들다는 단점이 있습니다. 그에 비해 keyword arguments는 parameter 이름에 맞추어서 값을 함수에 넘기기 때문에 실수로 값이 바뀔 확률이 상대적으로 적다고 할 수 있습니다. 또한 코드를 읽는 사람도 어떠한 값을 넘기는건지 명확하게 알 수 있기 때문에 가독성도 높아진다고 할 수 있습니다.
순서를 맞추어서 parameter 값을 전해주는 positional arguments와 keyword arguments를 혼용하여 사용하는것도 가능합니다.
다만 여기서 중요한것은 keyword arguments 는 순서가 바뀌어도 상관 없지만 positional arguments 부분은 순서를 지켜줘야 한다는 것입니다. 예를 들어, 다음 처럼 함수를 호출하면 error가 납니다.
def love_you(my_name, your_name):
print(f"{my_name} loves {your_name}")
love_you(your_name = "아이유", "정우성")
Traceback (most recent call last):
File "python", line 1
SyntaxError: positional argument follows keyword argument
에러가 나는 이유는 keyword argument가 positional argument 보다 더 앞으로 위치되어 함수가 호출되었기 때문입니다. Positional arguments 는 순서를 지켜주어야 하는데 순서가 틀렸기 때문에 에러가 나는것입니다.
함수의 parameter에 default 값을 정의해 줄 수 도 있습니다. Default값이 정의된 parameter은 함수가 호출될때 값이 넘겨지지 않아도 괜찮습니다. 값이 넘겨지지 않은 경우 default값이 자동으로 넘겨지게 됩니다
첫번째 생각 : 위에서 positional arguments은 순서를 중요하게 생각하다고 햇습니다. 그렇기에 "정우성"부분은 하나이긴 하나 첫번째 arguments이기 때문에 parameter중에서도 첫번째로 들어가야하는 것 같습니다.
그러나 순서가 상관없는 Keyword Arguments은 가능할 거라 생각했는데 같은 오류가 발생햇습니다.
그래서 두번째 생각을 하게 되었습니다.
두번째 생각 : 파이썬에서는 function parameter 첫번째는 무조건 non-default value parameter로 정의 해야하는 것이구나라고 생각했습니다.
또 다른 생각을 하게 되었는데 그러면 첫번째부분말고 뒤에 부분에서 non-default value parameter가 value parameter보다 뒤로 가면 에러가 나지 않을까 해서 테스트한 결과 에러가 발생하였습니다.
마지막 생각: python내부에서는 non-default value parameter가 무조건 default value parameter보다 앞에 있어야 에러가 발생되지 않게 만들어 놨구나라고 생각하였습니다.
위 함수를 실행하면
위와 같은 에러가 발생합니다. age parameters에 필수적으로 값이 들어가야하는데 없어서 발생하는 에러입니다. 코드에는 별 문제가 없는 것 같은데 문제가 발생한 이유는 args위치 때문입니다. args는 여러개의 arguments가 있어도 튜플로 인식하여 packing합니다. 그렇기에 args가 중간에 있으므로 원래 age에 들어가야 하는 20 argument까지 튜플에 포함시켜 packing하기에 age에 들어가야 하는 값이 사라진 것입니다.그렇기에 args를 맨 뒤로 보내어 앞에서 들어가야 하는 값은 저장되고 남은 값을 *args로 묶어버리면 됩니다.
해결 코드
결과값
일단 위에서 코드오류가 있는 것 같습니다. 가변키워드인자는 **kwrags 형태이기때문에 이와같이 변경해야하는 것 같습니다.
코드를 실행하니 이와 같은 에러가 발생하였습니다. 에러가 발생한 이유는 address = 0 인 키워드 인자가 가변키워드 인자보다 뒤에 있기 때문에 발생한 에러같습니다. 제가 보기에는 python내에는 parameter순서가 non-default value 다음에 default value다음이 가변인수인 것 같습니다.
해결코드
결과값
address이 부분은 원래는 0으로 정의되었는데 "seoul"로 덮어진것 같습니다. 이와 같이 정상적으로 출력되었습니다.
위에 코드를 실행하면 이와 같은 에러가 발생합니다. 이유는 인수의 순서가 맞질 않아서 오류가 난 것이다. 이제 완벽하게 parameter의 순서를 이해할 수 있다. non-default value -> default value -> 가변 인자 -> keword 인자 -> 키워드 가변 인자 순인 것을 알 수 잇었다.
해결코드
결과값