지금부터 정리하는 것은 저의 사견입니다. 틀린 부분이 있음을 주의해주세요! 있다면, 댓글로 알려주시면 정말 감사하겠습니다!
파이썬 함수 관련 글에서 "고정" 인자라는 표현은 쓰는 곳이 있고 안 쓰는 곳이 있다. 이 의미는 사실 이미 어딘가에 포함된 의미이고 어찌보면 당연하게 "내장된" 의미라고 생각해서 이에 대한 설명은 자세히 안하는 곳이 더 많은 것 같다. 나와 같이 "고정 인자" 라는 표현을 어딘가에서 봤을 수 있는데 명확히 정리하고 싶은 "정리충"을 위해 굳이 이 글에서 정리해보고자 한다.
우선, 파이썬에서 함수를 정의할 때,
매개변수를 정의할 때, 인자의 갯수가 정해져있는 것(고정)과 정해져있지 않은 것(가변)으로 나뉜다. -> (글쓴이 생각)
좀 더 정확하게는 "고정"의 뜻은 반드시 인자로 전달될 때 명기를 해서 처리한다는 뜻이다.
그리고 이것은 다시 위치 인자와 키워드 인자로 나뉜다.
자, 그러면 인자의 갯수의에 따라 2종류가 여기서 나뉜 다음에 위치와 키워드라는 2종류로 나눈다.
그러면 파이썬에서 함수를 만들 때 인자의 종류는 총 4가지이다.
2종류 * 2종류 = 4종류
고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자이다.
위치 인자와 키워드 인자에 대해서는 파이썬 공식 문서에 설명이 나와있다.
docs.python.org/ko/3.6/glossary.html
가변 인자라는 설명도 자주 보인다.
www.geeksforgeeks.org/args-kwargs-python/
헌데, 고정 인자라는 말이나 표현은 잘 안보인다. (어딘가 있을텐데 굳이 언급을 잘 안하는 것 같다.)
왜? 우리가 함수 정의할 때, 애스터리스크(*) 이용해서 가변 인자로 안하고 그냥 자연스럽게 위치 인자랑 키워드 인자로 표현하는 인자들은 모두 "고정" 인자다. 뭐가 고정인데? 매개변수 인자의 갯수가 고정되어 있다. (= 가변이 아니다라는 의미이다)
좀 더 정확하게는 "고정"의 뜻은 반드시 인자로 전달될 때 명기를 해서 처리한다는 뜻이다.
가변 인자는 변수의 갯수를 정하지 않고 두는 거다. 0 도 가능하다. 헌데,
고정 인자는? 고정 인자는 정해두면 무조건 넣어줘야 된다. 안그러면 에러가 발생한다.
주피터 노트북에서의 예제를 한 번에 확인해보자.
우선, 아래 함수를 정의했다. 모든 인자들이 다 들어가 있다.
a,b,c,d - 고정 위치 인자
*args - 가변 위치 인자
e,f - 고정 키워드 인자
**kwargs - 가변 키워드 인자
def all_arguments(a,b,c,d, *args, e,f, **kwargs):
print(locals())
여기서 질문! e 와 f 는 왜 고정 키워드 인자인거지?
파이썬 3.6 버전 공식 문서에서는
▶ 키워드 인자 (keyword argument): 함수 호출 때 식별자가 앞에 붙은 인자 (예를 들어, name=) 또는 ** 를 앞에 붙인 딕셔너리로 전달되는 인자. 예를 들어, 다음과 같은 complex() 호출에서 3 과 5 는 모두 키워드 인자다
라고 나와 있는데? 저기에는 식별자 (=) 도 없고 애스터리스크 연속2개(**) 도 없는데?
파이썬은 함수를 호출할 때, 고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자 순으로 넣어서 처리된다. 이 순서는 함수 정의할 때도 그대로 반영된다.
자, 그러면 고정 위치 인자와 고정 키워드 인자는 나왔다. e 와 f 는 자연스레 키워드 인자로 처리가 된다.
(왜? 이미 위치 인자의 순서는 끝났거든! 그래서 키워드 인자로 보는 것이다! )
자, 그러면 인자들을 각각 넣어서 함수를 호출한 케이스의 결과들을 자세히 봐보자.
앞에서 가변 인자는 인자가 아무것도 없으면 가변 위치인자 - 빈 튜플 , 가변 키워드 인자 - 빈 딕셔너리 로 나오는 것을 확인할 수 있다. 그래서 가변 인자는 아무것도 없어도 실행되는데 전혀 문제 없다.
헌데, 고정 위치 인자와 고정 키워드 인자들은 분명히 넣어줘야 된다.
특히 고정 키워드 인자는 함수 정의할 때는 식별자(=) 안 썼는데 호출할 때는 원래대로 식별자(=) 써서 인자를 넣어줘야 한다.
자, 그러면 정리해보자.
1. 함수에서 고정 인자들은 반드시 꼭 다 넣어줘야 한다.
2. 가변 인자들은 안 넣어줘도 빈 튜플과 빈 딕셔너리로 나온다. 즉, 가변 인자는 0도 포함하는 개념으로 보인다.
3. 키워드 인자는 식별자나 애스터리스크2개 를 붙이는 게 일반적인지만 함수에서 인자의 처리 순서(고정 위치 인자, 가변 위치 인자, 고정 키워드 인자, 가변 키워드 인자)에 따라서 위치 인자처럼만 넣어줘도 키워드 인자가 되는 경우가 있다.
4. 가변 인자가 아니면 다 고정 인자다. 무조건 다 넣어줘야 (초기화 안되어 있다는 전제하에서) 실행이 된다.
간단한 코드니깐 타이핑 해보고 생각을 정리하면 파이썬 함수에서 인자 종류에 대해서 다 정리가 될 것이다.
이거 굳이 정리한 이유는 뭔가 맨날 알고 있는데 '고정인자' 포함해서 매개변수 종류들 정리 안하니깐 맨날 어딘가 가려운 느낌이었다. 가려운 부분을 없애기 위해 포스팅 하면서 정리해보았다.
이 내용은 '문용준' 선생님의 저서 '손에 잡히는 파이썬'을 참고해서 작성하였습니다. 정말 좋은 책입니다!
----------------------------------------------------------------------------------------
아무도 안궁금하겠지만, 현재 실행하는 주피터 노트북의 파이썬 버전은 3.8 이다. 왜 3.6 참고하면서 3.8 이냐구요?
(프로젝트 따로 만들때 3.6.8 이나 3.6.10 을 애용하지만 지금 이건 간단한 스터디니깐 3.8이어도 상관없다고 생각해서요 ㅎㅎ)
그리고 keyword-only arguments 는 파이썬 3.7까지 반영되어 있고, 파이썬 3.8 부터는 Positional-Only Parameters 도 반영되어있음!
www.python.org/dev/peps/pep-0570/
위 문서 참고
'Python_programming' 카테고리의 다른 글
[Python] 함수(function)와 메서드(method)의 차이점 (0) | 2021.05.16 |
---|---|
'callable object' 에 대한 고찰 (0) | 2021.05.14 |
'정보 은닉'에 대한 고찰 (0) | 2021.05.09 |
Python 생성자(__new__)에 대한 고찰 (0) | 2021.04.22 |
Python self 에 대한 고찰 (0) | 2021.04.22 |