언어/파이썬

파이썬 어디까지파봐썬9강(1)_인수의 형식

디지털랫드 2024. 2. 23. 20:13

1. 인수의 형식

1) 위치 인수


함수에 넣는 인수의 위치가 정해져 있는 방식을 위치 인수(positional argument)라고 합니다.
다음 예시를 보겠습니다.

 
실행 완료
30
20
10

인수를 순서대로 넣을 때, 리스트나 튜플을 사용할 수도 있습니다.
아래 예시처럼 리스트나 튜플 앞에 *(애스터리스크)를 붙여서 함수에 넣어주면 됩니다.

함수(*리스트) 
함수(*튜플)
 
 
실행 완료
30
20
10

세 개의 인수를 가각 넣지 않고 요소가 3개인 리스트 앞에 *만 붙였는데 함수가 잘 작동했습니다.
리스트 앞에 *를 붙이면 언패킹(unpacking)이 되어서 print_nums(10, 20, 30)와 똑같은 동작이 되기 때문입니다.
언패킹(unpacking)은 말 그대로 리스트나 튜플의 포장을 푼다는 뜻입니다.

리스트 변수 말고 직접 *을 붙여도 동작은 같습니다.

 
 
실행 완료
30
20
10

단, 매개 변수의 개수와 리스트의 요소 개수가 같아야 합니다. 같지 않으면 에러가 발생합니다.

개수가 다를 때 에러를 확인해봅시다.

 
 
실행 완료
 

2) 가변 인수


이때까지 배운 함수에서는 요구하는 개수만큼만 인수를 전달 해야됐습니다.
예를 들어 def aiffel(a, b, c) 함수는 인수를 3개만 전달해야 하고 def aiffe_2(a) 함수는 인수를 1개만 전달해야 합니다.

이에 비해 지금 배울 가변 인수(variable argument) 는 임의 개수의 인수를 받을 수 있습니다.
방법은 간단합니다. 매개변수 앞에 * 기호를 붙이면 됩니다.

def 함수명(*매개변수):
    코드

주의할 점은 언팩킹은 인자에 * 기호를 붙이는 것이고, 가변 인수는 매개변수 앞에 * 기호를 붙인다는 것입니다.

그럼 예시로 전달하는 인수들은 모두 더해주는 함수를 가변인수를 활용해서 만들어보겠습니다.

 
 
실행 완료
 

*args에 들어온 가변인수들은 튜플이어서 for문으로 반복할 수 있게 됩니다.

 
 
실행 완료
[40]:
6
 
 
실행 완료
[38]:
55
 
 
실행 완료
[37]:
0

임의 개수의 인수를 받기 때문에 3개, 10개뿐만 아니라 아무런 인수가 없어도 에러 없이 리턴값을 출력합니다.

이렇게 함수에 인수를 직접 여러 개 넣어도 되고, 리스트나 튜플 언패킹을 사용해도 됩니다.

 
 
실행 완료
[36]:
25

3) 키워드 인수


지금까지 함수에 인수를 넣을 때 값이나 변수를 그대로 넣었습니다.
그러다 보니 각각의 인수가 무슨 용도인지 알기가 어렸웠습니다.
이런 점을 보완하기 위해 키워드 인수를 사용할 수 있습니다.

용도를 알고 있으면 순서와 상관없이 용도에 맞게 인수가 자기 자리를 찾을 수 있도록 키워드 인수를 사용합니다.
예를 들어 반려견의 정보를 출력하는 함수를 만들어보겠습니다.

 
 
실행 완료
 

이 함수를 사용할 때는 이름, 나이, 품종 순으로 인수를 넣어야 합니다.
만약 인수의 순서가 달라지면 잘못된 결과가 출력을 할 것입니다.

인수를 알맞은 순서로 넣은 결과와 잘못된 순서로 넣은 결과 모두 보겠습니다.
(예 : 저의 본가집에 있는 규봉이로 해보겠습니다.)

 
 
실행 완료
이름 : 규봉이
나이 : 10
품종 : 진돗개
 
 
실행 완료
이름 : 10
나이 : 진돗개
품종 : 규봉이

나이가 진돗개라니, 아주 잘못된 결과가 출력되네요.
이처럼 인수의 순서와 용도를 모두 기억하려면 너무 불편합니다.
그래서 파이썬에서는 인수의 순서와 용도를 매번 기억하지 않아도 되도록 키워드 인수(keyword argument)라는 기능을 제공 합니다.

키워드 인수는 말 그대로 인수에 키워드를 붙여서 순서와 상관없이 자기 용도에 맞게 쓸 수 있게 합니다.
그럼 다시 잘못된 순서로 인수를 dog_info(10, '진돗개', '규봉이')를 키워드 인수를 활용해서 수정해 보겠습니다.

 
 
실행 완료
이름 : 규봉이
나이 : 10
품종 : 진돗개

전과 다르게 순서도 올바를 뿐만 아니라 인수의 용도가 정확하게 보입니다.
이 두가지가 키워드 인수를 사용하는 가장 큰 장점입니다.

키워드 인수 중 가장 대표적인 것은 print함수의 sep, end가 대표적입니다.
다음 코드를 확인해 봅시다.

 
 
실행 완료
10:20:30:40:50끝

4) 키워드 인수 + 딕셔너리 언패킹


이번에는 딕셔너리를 사용해서 키워드 인수로 값을 넣는 딕셔너리 언패킹을 해보겠습니다.
딕셔너리 언패킹은 딕셔너리 앞에 ** (애스터리스크 두 개)를 붙여서 함수에 넣어주면 됩니다.

함수(**딕셔너리)

위에서 만들었던 dog_info함수를 재사용하겠습니다.

 
 
실행 완료
 

이제 딕셔너리에 '키워드': 값 의 형식으로 인수를 저장하고 앞에 ** 붙여서 함수에 넣어보겠습니다.

 
실행 완료
name : 규봉이
age : 10
breed : 진돗개

키워드에 맞게 잘 출력되었습니다.
리스트나 튜플을 언패킹할 때 처럼 변수 대신 딕셔너리 앞에 바로 ** 를 붙여도 동작은 같습니다.

 
 
실행 완료
name : 규봉이
age : 10
breed : 진돗개

※ 왜 ** 두 번 사용할까?


그런데 왜 딕셔너리만 *을 두 번 사용할까요?
왜냐하면 딕셔너리는 키:값 쌍의 형태로 값이 저장되어 있기 때문입니다.
*을 한 번만 사용하면 어떻게 되는지 함께 보겠습니다.

 
 
코드 실행
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_13/1517085679.py in <module>
----> 1 dog_info(*{'name':'규봉이', 'age':10, 'breed':'진돗개'})

TypeError: dog_info() takes 0 positional arguments but 3 were given

오류가 나는게 아니고 키만 출력됩니다.
따라서 딕셔너리는 ** 를 사용해야 합니다.

5) 키워드 가변 인수


키워드 인수를 사용하면서 동시에 가변 인수 함수를 만들 수 있습니다.
이 함수를 만드는 방법은 가변 인수 함수를 만드는 것과 동일합니다.

def 함수명(*매개변수):
    코드

다른 점은 인수를 함수에 넣을 때, 키워드와 함께 넣어야 한다는 것입니다.
키워드 가변 인수 함수인 dog_info 함수를 새롭게 만들고 인수를 넣어보도록 하겠습니다.

 
 
실행 완료
 

딕셔너리 때 배웠던 items() 기억나시나요?
기억이 안나도 괜찮습니다. 지금 복습하고 갈테니까요.

딕셔너리의 Key:Value 쌍을 얻을 때 쓰는 함수 입니다.
키워드와 인수를 넣었을 때, 자동으로 키워드와 인수를 저장해줍니다.

 
 
실행 완료
name : 규봉이
 
 
실행 완료
name : 규봉이
age : 10
gender : male

이렇게 인수를 직접 넣어도 되고 딕셔너리를 언팩킹해도 됩니다.