[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)
# 위와 같은 함수를 만들려고 하면 에러가 발생한다.
# 초기값을 설정해 준 매개변수는 오른쪽으로 몰아줘야 한다.
Leave a comment