파이썬(python) | 함수: 변수 위치 인자 & 키워드 인자

Jihun Kim·2021년 12월 12일
0

파이썬

목록 보기
7/11
post-thumbnail
  • 키워드를 사용하면 위치 인자만 사용할 때는 혼동할 수 있는 여러 인자의 목적을 명확히 할 수 있다.
  • 선택적 키워드 인자는 항상 위치가 아니라 키워드를 사용해 전달돼야 한다.

-by 파이썬 코딩의 기술 3장 함수 157p '기억해야 할 내용'

변수 위치 인자

가변적인 위치 인자는 가변 인자(varargs) 또는 스타 인자(star args)라고 한다.
이렇게 이름 붙은 이유는 가변 인자의 이름을 *args로 붙이기 때문이다.

만약 함수에 인자로 리스트를 받는데 빈 리스트까지 넘겨야 한다면 코드 잡음이 생긴다. 따라서 이럴 때는 빈 리스트는 생략하는 것이 편한데, 이는 위치 인자 앞에 *을 붙여서 해결할 수 있다.

def log(message, *values):
	if not values:
    	print(message)
    else:
    	values_str = ','.join(str(x) for x in values)
        print(f'{message}: {values_str}'
        
log('안녕')  # 안녕

즉, 아래와 같이 *values를 인자로 넣으면 values 값이 없을 경우 에러가 나는 것이 아니라 아무 값도 리턴되지 않는 것이다.


주의할점

' * ' 연산자를 사용하면 가변 인자를 받는 함수에게 시퀀스 내의 원소들을 전달할 수 있다.
' *args '를 받는 함수에 새로운 위치 기반 인자를 넣으면 감지하기 힘든 버그가 생길 수 있다.



키워드 인자

파이썬 함수에서는 모든 인자를 키워드를 사용해 넘길 수 있다. 즉, 함수 호출시 괄호 내부에서 파라미터 이름을 대입 연산해 사용하면 된다.

이 때, 위치 기반 인자를 지정하려면 키워드 인자보다 앞에 지정해야 한다.

def remainder(number, divisor):
    return number & divisor

remainder(number=10, 2)   # 에러
remainder(2, divisor=1)   # 성공

**연산자

**연산자는 파이썬이 딕셔너리에 들어 있는 값을 함수에 전달하되, 각 값에 대응하는 키를 키워드로 사용하도록 명령한다.

my_kwargs = {
	'number': 20,
    'divisor': 10
}
assert remainder(**my_kwargs) == 2  # True

또한, **연산자를 함수의 인자로 여러개 사용하는 것도 가능하다. 단, 각 딕셔너리에 겹치는 키워드들이 없어야 한다!

아무 키워드 인자나 받는 함수를 만들고 싶을 때는 모든 키워드 인자를 dict에 모아주는 **kwargs를 사용한다.

def print_parameters(**kwargs):
	for key, val in kwargs.items():
    	print(f'{key} & {val}')

print_parameters(jihun=10, someone=5, another=7)

>>> 

jihun & 10
someone & 5
another & 7

키워드 인자의 이점 세 가지

1. 키워드 인자를 사용하면 코드를 처음 보는 사람들에게 함수 호출의 의미를 명확히 알려줄 수 있다.
👉 키워드 인자를 사용한 호출에서 numbers=20과 divisor=7을 보면 어떤 파라미터가 어떤 목적을 가지는지 명확해진다.

2. 함수 정의에서 디폴트 값을 지정할 수 있다.
아래와 같이 유량을 계산하는 함수가 있다고 했을 때, 마지막 측정 값을 가지고 한 시간이나 하루 단위의 유입량을 추정하기 위해 'period' 파라미터를 추가한다고 해보자. 아래와 같이 period=1로 디폴트 설정을 해놓으면 period는 이제 선택적인 인자가 된다. 즉, 인자에 들어가도 되고 안들어가도 된다~

def flow_rate(weight_diff, time_diff, period=1):
	return (weight_diff / time_diff) * period

flow_per_period = flow_rate(weight_diff, time_diff)
flow_per_hour = flow_rate(weight_diff, timediff, period=3600)  # 키워드 인자를 이용해 선택적 인자 값을 설정했다. 

👉 선택적 인자를 지정하는 최선의 방법은 항상 키워드 인자를 사용하고 위치 인자를 절대 사용하지 않는 것이다. 이를 통해 혼동을 최소화 할 수 있다.

3. 어떤 함수를 사용하고 있던 기존 호출자에게는 하위 호환성을 제공하면서 함수 파라미터를 확장할 수 있는 방법을 제공하게 된다.
👉 키워드 파라미터와 그 값을 갖는 디폴트 파라미터를 추가하면 되기 때문이다.


참고
파이썬 코딩의 기술 개정 2판(저자: 브렛 슬라킨)

profile
쿄쿄

0개의 댓글