Function parameters

Jinhyeon Son·2020년 3월 24일
0

개념

목록 보기
5/26

기본 형태

def function(a, *b, **c, d = "test"):
  • a = 일반 매개변수
  • *b = 여러 객체들을 튜플로 패킹하는 매개변수 형태
  • **c = 키:값 형태의 객체들을 사전형으로 패킹하는 매개변수 형태
  • d = 기본값을 갖는 매개변수

호출 방법

default value (기본값)

위 에서 선언한 function에서 d parameter는 "test"라는 스트링을 기본값으로 갖고있다
함수 선언시 parameter에 기본값이 있는상태로 선언되면 함수 호출시에 해당하는 parameter를
넘겨주지 않아도 오류 없이 동작한다

positional argument (위치 인자)

가장 일반적으로 사용하는 방식이다

호출시

function(a, b, c, d)

와 같이 모든 parameter들을 순서대로 넘겨준다

특징

  • 위치 인자는 생략이 불가
  • 정해진 위치에 전달되어야 함

keyword argument (키워드 인자)

함수 호출시 매개변수의 이름을 명시적으로 제시하는 방식
function(123, 456, d = "keyword", c = "argument)

와 같이 함수 호출 가능

특징

  • 키워드 인자는 디폴트 값을 지정해 줄 수 있으며 순서에 구애받지 않음
  • 디폴트 값이 주어진 키워드 인자는 함수 호출 시 생략이 가능

키워드 인자 사용 시 주의 사항

키워드 인자를 맨 처음 parameter로 넘겨줄 경우 그 뒤에 따라오는 인자들은 '
위치 인자가 아닌 키워드 인자로 넘겨 주어야 한다
function(d = "keyword", a, b, c) -> syntax error!자
function(a, c = "right", d = "keyword", b = "order") -> 올바른 방법

variadic argument (가변 인자)

parameter의 갯수를 명시적으로 정하지 않는 방법
Python 고유의 iterable한 객체들의 packing, Unpacking을 통해 이용한다
* list 뿐만 아니라 tuple, dict도 같은 방식으로 사용가능하다

packing

위 함수와 같이 parameter 앞에 * 를 붙여주면 가변 인자로 선언 된다	

이 함수를 호출할 때 다음과 같이 여러개의 위치 인자를 전달하면

printparameter(1, 2, 3, 4, 5)

함수 안에서는 해당 위치 인자들이 immutable한 tuple로 패킹되어 전해진다

unpacking

위와 같이 list를 unpacking 하는 방식으로도 인자를 건네줄 수 있으며
결과 값 또한 packing과 같다

이 때 list를 인자로 그대로 넘겨주는것 과의 차이는 id값에 있다
list를 그대로 넘겨줄 경우 얕은 복사가 되어 id값을 공유하나
unpacking을 통해 함수 안에서 packing할 경우 깊은 복사가 되어
함수 안 인자의 id값과 함수 바깥 인자의 id값이 달라진다

또 다른 unpacking의 형태

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 argument의 위치가 중요한 이유

함수가 동작하기 위해서는 호출될 때 모든 매개변수를 전달 받아야 하는데,
Default-value를 갖는 positional argument는 반드시 Default-value를 갖지않는 positional argument의 앞에 위치해야한다

Default value argument가 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 발생

keyword argument를 온전히 keyword argument로서 사용하려면?

def func(
	순서인자, ... , default 순서인자, ... , 가변위치인자, 키워드 인자, ... , 가변키워드 인자
	)
  • 위와 같은 순서로 매개변수를 정의하면 위치인자는 키워드 인자에 영향을 미칠 수 없기 때문에 온전히 키워드 인자를 통해서만 전달해줄 수 있는(keyword-only) 매개변수를 정의할 수 있다
  • 가변위치인자는 *매개변수명 형태로 이루어지지만 *단독으로도 기능한다
    여기서 가변위치인자로 선언된 매개변수는 매개변수 갯수를 넘어서서 전달되는
    모든 위치인자를 전달받아 immutable한 tuple에 저장한다
  • 위 동작을 통하여 위치인자의 갯수를 특정할 수 없는 경우에도 가변위치인자를 통해 함수를 정상적으로 사용할 수 있고 위치인자가 keyword only arguments에 값을 전달하는것을 방지하는 역할 또한 수행한다

위 처럼 매개변수를 분리시키면 위치인자가 키워드 인자에 영향을 미치지 못하게 되어
불확실 하지 않은 함수를 선언할 수 있다

0개의 댓글