파이썬의 입출력(1) - 함수
프로그래밍을 하다 보면 반복해서 작성하고 있는 자신을 발견할 것이다. 이때가 함수를 사용해야 할 때이다.
반복적으로 사용되는 부분을 하나로 묶어 특정 값을 입력할 때 결과 값을 리턴해주는 식으로 작성하는 것이다.
사실 함수는 굉장히 자주 쓰이기 때문에 앞으로 실습을 진행하면서 자연스레 익혀보겠다. 이 글에서는 함수의 정의보다는 사용될 때 생길 수 있는 경우에 대해 간단히 다루겠다.
함수의 기본 구조
함수의 기본 구조는 다음과 같다.
def add(a, b):
return a + b
의미에 대해서는 다음과 같이 해석할 수 있다.
함수의 이름은 add이고 입력으로 2개의 값을 받으며 리턴값은 2개의 입력값을 더한 값이다.
코드에서는 이런 식으로 사용이 가능하다.
>>> def add(a, b):
... return a+b
...
>>>
>>> a = 3
>>> b = 4
>>> c = add(a, b) # add(3, 4)의 리턴값을 c에 대입
>>> print(c)
7
이 상황에서 함수를 사용하다 보면 매개변수와 인수라는 단어를 수 없이 들어볼 텐데 함수를 사용할 때 함수 안에 값을 넣는 것을 인수라고 하고, 인수로부터 넘어온 값을 정의 부분에서 받아들이는 a, b를 매개변수라고 한다.
함수의 입력값과 리턴값
>>> def say():
... return 'Hi'
>>> a = say()
>>> print(a)
Hi
위와 같이 함수는 입력 값이 없을 수도 있으며
>>> def add(a, b):
... print("%d, %d의 합은 %d입니다." % (a, b, a+b))
>>> add(3, 4)
3, 4의 합은 7입니다.
리턴 값이 없을 수도 있다.
>>> def say():
... print('Hi')
>>> say()
Hi
물론 둘 다 없을 수도 있다.
매개변수 지정
>>> def sub(a, b):
... return a - b
위와 같은 함수가 있을 때 매개 변수를 지정할 수도 있다.
>>> result = sub(a=7, b=3) # a에 7, b에 3을 전달
>>> print(result)
4
이렇게 변수를 지정해 줄 수도 있다. 이때는 인수의 순서는 상관없다.
입력값이 여러 개인 함수
>>> def add_many(*args):
... result = 0
... for i in args:
... result = result + i # *args에 입력받은 모든 값을 더한다.
... return result
이처럼 매개변수 앞에 *을 붙이면 입력값을 모두 모아 튜플로 만든다.
>>> result = add_many(1,2,3)
>>> print(result)
6
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55
kwargs
키워드 매개변수를 사용할 때 매개변수 앞에 별 2개를 붙인다.
>>> def print_kwargs(**kwargs):
... print(kwargs)
이 단순한 함수를 다음과 같이 사용해보자
>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}
의미를 잘 파악했으면 좋겠다.
리턴값은 하나이다.
간단히 설명하면 ㅈㄱㄴ이다.
하나만 리턴값으로 지정할 수 있고,
>>> def add_and_mul(a,b):
... return a+b, a*b
이렇게 작성하면 리턴값들이 한 튜플로 저장된다.
>>> result1, result2 = add_and_mul(3, 4)
이렇게 호출하면 각각 변수에 들어가긴 한다.
초기값 설정
초기값을 미리 설정해놓을 수 있다.
def say_myself(name, age, man=True):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % age)
if man:
print("남자입니다.")
else:
print("여자입니다.")
이 코드를 예시로 들겠다.
쉽게 설명하자면 함수 정의 시 초기값을 설정하면 호출 시 인수를 주지 않으면 초기값으로 입력된다.
def say_myself(name, man=True, age):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % age)
if man:
print("남자입니다.")
else:
print("여자입니다.")
만약 이렇게 정의하면
say_myself("박응용", 27)
이렇게 호출 시에 오류가 난다. 인터프리터 언어에서 27을 man에 넣을지 age에 넣어야 할지 판단하기 어렵기 때문이다.
인수가 없을 때 초기값을 설정하기 때문에 초기값을 설정해줄 매개변수는 가장 뒤에 정의해야 한다.
함수에서 사용할 수 있는 함수 밖에서 정의한 변수, 파이썬에서 가장 중요한 요소인 lambda에 대한 내용은 다음 글에서 다루겠다.