다양한 매개변수

  • 위치 매개변수(positional parameter)
  • 기본 매개변수(default parameter)
  • 키워드 매개변수(keyword parameter)
  • 위치 가변 매개변수(positional variable length parameter)
  • 키워드 가변 매개변수(keyword variable length parameter)

위치 매개변수(positional parameter)

  • 가장 기본적인 매개변수
  • 함수를 호출할 때 순서대로 데이터(인자)를 넘겨줘야 한다.
  • 다른 매개변수와 함께 쓸 때는 항상 맨 앞에 써야 한다.
def my_func(a, b):
    print(a, b)

my_func(2, 3)

기본 매개변수(default parameter)

  • 매개변수의 기본적인(Default) 값
  • 함수를 정의할 때 매개변수의 기본 값을 지정할 수 있다.

예제에서는 content 가 기본 매개변수가 된다. 기본 매개변수는 함수를 호출할 때 다시 할당을 하지 않아도 된다.

def post_info(title, content='내용없음'):
    print('제목 :', title)
    print('내용 :', content)

post_info('출석')

제목 : 출석
내용 : 내용없음

content를 두 번째 인자로 줘야 하는데 없으니깐 그냥 기본값을 쓴다.

키워드 매개변수(keyword parameter)

  • 함수 호출 시에 키워드를 붙여 호출한다.
  • 매개변수의 순서를 지키지 않아도 된다.
def post_info(title, content):
    print('제목 :', title)
    print('내용 :', content)
>>> post_info(content='없음', title='내용 무')
제목 : 내용 무
내용 : 없음

함수에서의 인자 순서와 다르게 인자를 키워드를 붙여 전달해주었다.

위치 가변 매개변수(positional variable length parameter)

  • 가변 매개변수 = 개수가 정해지지 않은 매개변수
  • 매개변수 앞에 *가 붙는다. (튜플형)
def print_fruits(*args):
    print(args)
    for arg in args:
        print(arg)
>>> print_fruits('apple', 'orange', 'mango', 'grape')
('apple', 'orange', 'mango', 'grape')
apple
orange
mango
grape

키워드 가변 매개변수(keyword variable length parameter)

  • 가변 매개변수 = 개수가 정해지지 않은 매개변수
  • 매개변수 앞에 **가 붙는다. (딕셔너리형)
def comment_info(**kwargs):
    print(kwargs)
    for key, value in kwargs.items():
        print(f'{key} : {value}')
>>> comment_info(name='안녕', content='클레오파트라')
{'name': '안녕', 'content': '클레오파트라'}
name : 안녕
content : 클레오파트라

매개변수 작성 순서

위치 -> 기본 -> 위치 가변 -> 키워드(기본) -> 키워드 가변

def post_info(*tags, title, content, **kwargs):
    print(f'제목 : {title}')
    print(f'내용 : {content}')
    print(f'태그 : {tags}')
>>> post_info('#안녕', '#파이썬', '함수', '내용 없음')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: post_info() missing 2 required keyword-only arguments: 'title' and 'content'

이렇게 기본 매개변수 앞에 위치 가변 매개변수를 쓸 경우 키워드를 적어주지 않으면 에러가 난다. 그 이유는 모든 인자들이 다 *tags에 할당되기 때문이다.

매개변수의 순서를 바꾸거나 키워드를 사용해주면 이 에러를 해결할 수 있다.

>>> post_info('#안녕', '#파이썬', title='함수', content='내용 없음')
제목 : 함수
내용 : 내용 없음
태그 : ('#안녕', '#파이썬')

정의된 함수에 튜플 및 딕셔너리 전달

이번에는 반대로 정의된 함수에 매개변수로 튜플 및 딕셔너리를 입력하는 방법을 정리해보자. 위에서의 *의 활용 방식과 매우 유사한데 만약 튜플을 넘기고 싶다면 튜플의 변수명 앞에 *을 하나 붙이고 함수로 넘기고 딕셔너리의 경우에는 *을 2개 붙여서 넘기면 된다.

다음은 튜플을 함수의 매개변수로 넘기는 방법에 대한 예제이다.

def some_func(first_val, second_val, third_val):
    print("first:", first_val)
    print("second:", second_val)
    print("third:", third_val)

some_args = 4, "foo", "bar"
print(some_args)

some_func(*some_args)

>>>
(4, 'foo', 'bar')
first: 4
second: foo
third: bar

튜플 some_args를 정의한 이후에 함수 some_func에 *을 하나 붙여서 some_func(*some_args)와 같이 매개변수로 넘겨주면 된다.

마찬가지로 딕셔너리를 함수의 매개변수로 넘기는 방법에 대한 예제이다.

some_kwargs = {"first_val": 4, "second_val": "foo", "third_val": "bar"}
some_func(**some_kwargs)

>>> 
first: 4
second: foo
third: bar