파이썬과 인자(2)
이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.
기본 매개변수값
다음 함수를 보자.
def greetings(name, intro = 'hello,') :
print(intro,name)
intro
와 name
을 차례대로 출력하는 함수인 것 같다. 그런데 마지막 매개변수인 intro
를 보면, 매개변수에서 ‘hello’를 대입하고 있다. 마치 키워드 인자를 쓰는 것 마냥 매개변수에서 이러고 있다.
키워드 인자와 위치 인자를 이용해 같은 매개변수에 값을 두 번 이상 대입시키려고 하면 오류가 발생했었다. 이번에도 그럴까?
greetings('john', 'hi')
이러면 ‘hi john’ 이 나오는 것을 볼 수 있다. ‘hello,’는 어디로 간걸까? 그리고 이번엔 왜 오류가 발생하지 않는 것일까?
여기서 intro
는 기본 매개변수값인 ‘hello’를 가지고 있다고 이야기 할 수 있다.
함수를 호출할 때, 기본 매개변수값을 지닌 매개변수에게 아무런 인자도 전달하지 않았을 때, 해당 매개변수는 기본 매개변수값을 사용하게 된다. 아래와 같이 매개변수 intro
에 아무것도 주지 말고 호출해보면 이해가 될 것이다.
greetings('john')
이렇게 호출하면 ‘hello, john’이 출력되는 것을 확인할 수 있을 것이다.
인자 모으기
이 때까지 쓰고 있었던 print() 함수를 생각해보자. 인자를 1개만 전달해도, 2개를 전달해도 주어진 인자들을 잘 출력했다. 그러면 print() 함수는 얼마나 많은 매개변수들을 선언해둔걸까? 그리고 그 매개변수들은 모두 기본 매개변수값으로 ‘‘을 가지고 있는 것일까?
print()같은 함수에서 인자가 얼마나 들어올 지 모르는데 미리 매개변수를 많이 선언해 두는 것은 비효율적이다. 1개를 선언하면 2개가 들어올 수 있고, 2개를 선언하면 3개가 들어올 수 있고… n개를 선언하면 n+1개가 들어올 수 있다.
Python은 print()와 같이 얼마나 들어올 지 모르는 인자들을 하나로 묶어주는 기능을 제공한다. 그리고 키워드 인자와 위치 인자는 사용하는 방법이 다르므로, 각각의 인자들을 따로 묶어준다. 그러면 인자들을 어떻게 하나로 묶어주는지 한 번 알아보도록 하자.
위치 인자 모으기
위치 인자를 모으기 위해서는 함수의 매개변수를 다음과 같이 선언해주면 된다.
def helloFriends(*args) :
뭔가 이상한 점을 느낄 수 있을 것이다. 분명히 매개변수도 변수의 일종이기 때문에, 변수의 이름에 특수문자가 들어갈 수는 없다고 기억하고 있을 것이다. 그런데 이름의 시작이 별표(*)다. 어찌된 일일까?
별표의 정식 명칭은 Asterisk로, 애스터리스크로 읽지만 편의상 별표라고 쓰겠다. 영어로도 star라고 종종 쓰인다.
함수의 인자가 별표로 시작한다는 것은, 이 인자에 위치 인자들을 모아두겠다! 라는 것을 의미한다. 그러면 args에 위치 인자가 어떻게 모이는 것일까? 한 번 확인해보자.
def helloFriends(*args):
print(args)
이러면 왜 print()에 들어가는 args
에는 별표가 안붙느냐? 라는 생각을 할 수 있는데, 별표는 ‘이 매개변수는 위치 인자를 모아두는 매개변수입니다’ 라는 표시일 뿐, 실제 변수 이름에 포함되지는 않는다. 따라서 args
라고만 써야 한다.
그러면 대충 아무거나 집어넣어서 어떻게 나오는지 확인해보자.
helloFriends(1,2,3,'aa')
이러면 다음과 같이 출력되는 것을 확인할 수 있을것이다.
(1, 2, 3, 'aa')
helloFriends()에 들어간 인자들이 하나의 튜플에 묶여 있는 것을 확인할 수 있다. 이제 이 튜플에 들어있는 인자들을 함수에서 의도한 대로 사용하면 된다. 마침 함수 이름이 helloFriends니, 각각의 인자에 대해 안녕이라고 출력해주자.
def helloFriends(*args):
for friend in args:
print('hello',friend)
그러면 위치 인자를 모으기 위해선 args라는 이름만 써야하나? 라는 의문이 들 수 있는데, 그렇진 않다. 변수의 이름 조건만 충족한다면 무엇이든지 넣을 수 있다. 앞에 별표만 붙이면 그 매개변수에 위치 인자들이 모일 것이다.
def helloFriends(*friends):
for friend in friends:
print('hello',friend)
위치 인자를 모은 매개변수에 args
라는 이름을 붙이는 것은 나름의 전통이라고 생각하면 될 것 같다. 이름만 보고도 ‘아, 여기엔 위치 인자들을 모았겠구나!’ 라는 생각이 들 수 있도록 말이다.
키워드 인자 모으기
위치 인자는 모아봤고, 키워드 인자도 모아보자. 키워드 인자는 이렇게 모으면 된다.
def whatisit(**kwargs):
위치 인자를 모을 때와 비교해보면 무엇이 다른가? 별표를 2개 쓰고 있다. 별표를 2개 쓰면 키워드 인자를 모으는 매개변수가 된다.
kwargs도 키워드 인자를 모으는 매개변수의 전통적인 이름이다. keyword arguments의 약자라고 보면 된다.
위치 인자는 튜플로 묶어두었다. 그러면 키워드 인자는 뭘로 묶어둘까?
def whatisit(**kwargs):
print(kwargs)
whatisit(a='b', c=2)
위의 코드를 실행한다면 이걸 보게 될 것이다.
{'a': 'b', 'c': 2}
리스트도 튜플도 아닌 처음 보는 형태의 데이터가 보인다. 대충 보면 함수를 호출할 때 집어넣었던 a와 ‘b’, 그리고 c와 2가 묶여있는 것 처럼 보이기도 한다. 이건 무슨 데이터일까?
딕셔너리(dictionary)라고 한다. 다음 포스트에서 딕셔너리가 어떤 데이터 형인지 알아보도록 하자.
Comments