[python] 함수에서 위치 인수와 키워드 인수 사용하기

위치 인수와 리스트 언패킹 사용하기

# 다음과 같이 함수에 인수를 순서대로 넣는 방식을 위치 인수(positional argument)라고 한다.
# 즉, 인수의 위치가 정해져 있다.
print(1, 2, 3)


def print_nums(a, b, c):
    print(a)
    print(b)
    print(c)


# print_nums에 숫자 세 개를 넣으면 각 줄에 숫자가 출력된다.
print_nums(1, 2, 3)

# 이렇게 인수를 순서대로 넣을 때는 리스트나 튜플을 이용할 수도 있다.
# 다음과 같이 앞에 *(애스터리스크)를 붙여서 함수에 넣어주면 된다.
# 이 때 함수의 매개변수 개수와 리스트의 요소 개수는 같아야 한다. 그렇지 않으면 에러가 발생한다.
x = [1, 2, 3]
print_nums(*x)  # 앞에 * 를 붙이면 언패킹이 되어서 print_nums(1, 2, 3)과 같은 동작이 된다.
print_nums(*[1, 2, 3])  # 리스트 변수 대신 리스트 앞에 붙여도 동작은 같다.


# 위치 인수와 리스트 언패킹은 인수의 개수가 정해지지 않은 가변 인수에 사용한다.
# 가변 인수 함수는 매개변수 앞에 *를 붙여서 만든다.
# def 함수이름(*매개변수):
#     코드
def print_nums2(*args):
    for arg in args:
        print(arg, end=', ')
    print()


print_nums2(1, 2, 3, 4)
print_nums2(*[1, 2, 3, 4, 5])
print_nums2(*x)
print_nums2()


# 이처럼 함수를 만들 때 매개변수에 *를 붙여주면 가변 인수 함수를 만들 수 있다.

# 고정 인수와 가변 인수를 함께 사용하려면 고정 매개변수를 먼저 지정하고, 그 다음 매개변수에 *를 붙여주면 됩니다.
def print_nums3(a, *args):
    print(a)
    print(args)


print_nums3(1)
print_nums3(1, 10, 20)
print_nums3(*[10, 20, 30])

키워드 인수 사용하기

# 지금까지 함수에 인수를 넣을 때 값이나 변수를 아무렇게나 넣었는데,
# 이렇게 했을 때는 인수가 무슨 용도인지 알기가 어려웠는데,
# 보통의 함수는 사용 방법을 익힐 때 인수의 순서와 용도를 함께 외운다.
def personal_info(name, age, address):
    print('이름:', name)
    print('나이:', age)
    print('주소:', address)


# 이러한 함수를 사용할 때,
# 첫 번째 인수에 이름, 두 번째 인수에 나이, 세 번째 인수에 주소를 넣어야 한다.
# 순서가 달라지면 잘못된 결과가 출력될 것이다.
personal_info('park', 24, 'suwon')

# 수많은 함수들의 인수의 순서와 용도를 모두 기억하기는 너무 불편하다.
# 따라서, 파이썬에서는 인수의 순서와 용도를 매번 기억하지 않도록 키워드 인수라는 기능을 제공한다.
# 키워드 인수는 인수에 키워드를 붙이는 기능인데, 키워드=값 형식으로 사용된다.
personal_info(age=30, address='suwon', name='park')  # 이처럼 순서를 맞추지 않아도 키워드에 해당하는 값이 들어간다.

# 참고로, print 함수에서 사용했던 sep, end도 키워드 인수이다.
print(1, 2, 3, sep='!', end='@@')

키워드 인수와 딕셔너리 언패킹 사용하기

# 이번에는 딕셔너리를 이용해서 키워드 인수로 값을 넣는 딕셔너리 언패킹을 해보자.
# 다음과 같이 딕셔너리 앞에 ** 를 붙여서 함수에 넣어준다.
# 함수(**딕셔너리)
def personal_info(name, age, address):
    print('이름:', name)
    print('나이:', age)
    print('주소:', address)
    print()


x = {'name': 'park', 'address': 'suwon', 'age': 24}
personal_info(**x)

# 딕셔너리 언패킹을 사용할 때에는 매개변수 이름과 딕셔너리의 키 이름이 같아야 한다.
# 또한, 매개변수의 개수와 키의 개수도 같아야 한다.
# 위의 두 조건을 만족하지 않을 경우에는 에러가 발생한다.

personal_info(*x)  # 다음과 같이 딕셔너리를 한 번 언패킹하면 키를 사용한다는 뜻이 된다.
# 따라서, 이름: name, 나이: address, 주소: age


# 키워드 인수를 사용하는 가변 인수 함수를 만들어보자
def personal_info2(**kwargs):
    for kw, arg in kwargs.items():
        print(kw, ': ', arg, sep='')
    print()


personal_info2(name='park', age=24, address='suwon')
personal_info2(**{'name': 'park', 'age': 24, 'address': 'suwon'})


# 보통 **kwargs를 사용한 가변 인수 함수는 다음과 같이 함수 안에서 특정 키가 있는지 확인한 뒤 해당 기능을 만든다.
def personal_info3(**kwargs):
    if 'name' in kwargs:
        print('이름:', kwargs['name'])
    if 'age' in kwargs:
        print('나이:', kwargs['age'])
    if 'address' in kwargs:
        print('주소:', kwargs['address'])
    print()


personal_info3(name='park', address='suwon', age=24)


# 고정 인수와 가변(키워드) 인수를 함께 사용할 때에도 고정 매개변수를 먼저 지정하고 그 다음에 가변 인수를 지정해야 한다.
def personal_info4(name, **kwargs):
    print(name)
    print(kwargs)


# 위치 인수와 키워드 인수를 함께 사용할 때에 위치 인수가 먼저 오고 그 다음 키워드 인수가 와야 한다.
# 키워드 인수는 매개변수 순서에서 가장 뒤에 와야 한다.
def custom_print(*args, **kwargs):
    print(*args, **kwargs)


custom_print(1, 2, 3, sep='!', end='@@')

매개변수에 초깃값 지정하기

# 여태는 함수를 호출할 때 항상 인수를 넣어서 값을 전달했지만, 매개변수에 초기값을 설정해 인수를 생략할 수도 있다.
# def 함수이름(매개변수=값):
#     코드
def personal_info(name, age, address='비공개'):
    print('name:', name)
    print('age:', age)
    print('address:', address)


# address는 초기값이 있으므로 name과 age만 전달해서 함수를 호출할 수 있다.
personal_info('park', 24)

# def personal_info2(name, age='비공개', address):
#     print('name:', name)
#     print('age:', age)
#     print('address:', address)
# 위와 같은 함수를 만들려고 하면 에러가 발생한다.
# 초기값을 설정해 준 매개변수는 오른쪽으로 몰아줘야 한다.

Updated:

Leave a comment