def function(a, *b, **c, d = "test"):
위 에서 선언한 function에서 d parameter는 "test"라는 스트링을 기본값으로 갖고있다
함수 선언시 parameter에 기본값이 있는상태로 선언되면 함수 호출시에 해당하는 parameter를
넘겨주지 않아도 오류 없이 동작한다
가장 일반적으로 사용하는 방식이다
호출시
function(a, b, c, d)
와 같이 모든 parameter들을 순서대로 넘겨준다
함수 호출시 매개변수의 이름을 명시적으로 제시하는 방식
function(123, 456, d = "keyword", c = "argument)
와 같이 함수 호출 가능
키워드 인자를 맨 처음 parameter로 넘겨줄 경우 그 뒤에 따라오는 인자들은 '
위치 인자가 아닌 키워드 인자로 넘겨 주어야 한다
function(d = "keyword", a, b, c) -> syntax error!자
function(a, c = "right", d = "keyword", b = "order") -> 올바른 방법
parameter의 갯수를 명시적으로 정하지 않는 방법
Python 고유의 iterable한 객체들의 packing, Unpacking을 통해 이용한다
* list 뿐만 아니라 tuple, dict도 같은 방식으로 사용가능하다
위 함수와 같이 parameter 앞에 * 를 붙여주면 가변 인자로 선언 된다
이 함수를 호출할 때 다음과 같이 여러개의 위치 인자를 전달하면
printparameter(1, 2, 3, 4, 5)
함수 안에서는 해당 위치 인자들이 immutable한 tuple로 패킹되어 전해진다
위와 같이 list를 unpacking 하는 방식으로도 인자를 건네줄 수 있으며
결과 값 또한 packing과 같다
이 때 list를 인자로 그대로 넘겨주는것 과의 차이는 id값에 있다
list를 그대로 넘겨줄 경우 얕은 복사가 되어 id값을 공유하나
unpacking을 통해 함수 안에서 packing할 경우 깊은 복사가 되어
함수 안 인자의 id값과 함수 바깥 인자의 id값이 달라진다
numbers = [1, 2, 3, 4, 5, 6]
# unpacking의 좌변은 리스트 또는 튜플의 형태를 가져야하므로
# 단일 unpacking의 경우 *a가 아닌 *a,를 사용
*a, = numbers
# a = [1, 2, 3, 4, 5, 6]
*a, b = numbers
# a = [1, 2, 3, 4, 5]
# b = 6
a, *b, = numbers
# a = 1
# b = [2, 3, 4, 5, 6]
a, *b, c = numbers
# a = 1
# b = [2, 3, 4, 5]
# c = 6
함수가 동작하기 위해서는 호출될 때 모든 매개변수를 전달 받아야 하는데,
Default-value를 갖는 positional argument는 반드시 Default-value를 갖지않는 positional argument의 앞에 위치해야한다
def testfunction1(a, b, c, number = 123)
def testfunction2(number = 123, a, b, c)
testfunction1의 경우 default값이 존재하는 매개변수가 존재 하므로 positional argument인 a와 b, c만 넘겨준다면 정상적으로 동작한다
그러나 testfunction2의 경우에는 default value가 존재함에도 positional argument만으로 함수를 호출할 경우 인자 4개를 모두 넘겨주어야 한다
파이썬 인터프리터는 positional 인자가 대입되는 매개변수가 default value를 가지고 있는지 여부는 검사하지 않기 때문이다
testfunction1(4, 5, 6) #문법상 문제가 없음
testfunction2(4, 5, 6) # syntax error 발생
def func(
순서인자, ... , default 순서인자, ... , 가변위치인자, 키워드 인자, ... , 가변키워드 인자
)
*
매개변수명 형태로 이루어지지만 *
단독으로도 기능한다 위 처럼 매개변수를 분리시키면 위치인자가 키워드 인자에 영향을 미치지 못하게 되어
불확실 하지 않은 함수를 선언할 수 있다