- 일반적인 함수
입력값이 있고 결괏값이 있는 함수가 일반적인 함수이다. 앞으로 여러분이 프로그래밍을 할 때 만들 함수는 대부분 다음과 비슷한 형태일 것이다.
def 함수이름(매개변수):
<수행할 문장>
...
return 결과값
다음은 일반 함수의 전형적인 예이다.
def add(a, b):
result = a + b
return result
>>> a = add(3, 4) #결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, ...)
>>> print(a)
7
- 입력값이 없는 함수
입력값이 없는 함수가 존재할까? 당연히 존재한다.
>>> def hello():
... return 'world'
...
>>>
hello라는 이름의 함수를 만들었다. 그런데 매개변수 부분을 나타내는 함수 이름 뒤의 괄호 안이 비어 있다. 이런 경우 어떻게 사용하는 걸까?
>>> a = hello()
>>> print(a)
world
- 결괏값이 없는 함수
결괏값이 없는 함수 역시 존재한다. 다음 예를 보자.
def add(a, b):
print("%d, %d의 합은 %d입니다." % (a, b, a+b))
>>>
결괏값이 없는 함수는 호출해도 돌려주는 값이 없기 때문에 다음과 같이 사용한다.
>>> add(6, 7)
6, 7의 합은 13입니다.
6, 7의 합은 13입니다.라는 결과값이 나왔는데 왜 결과값이 없다는 것인지 의아하게 생각할 수 있다. 이 부분이 헷갈릴 수 도 있는데 print문은 함수의 구성 요소 중 하나인 <수행할 문장>에 해당하는 부분일 뿐이다. 결과값은 오직 return 명령어로만 돌려받을 수 있다.
>>> a = add(3, 4)
>>> print(a)
None
위 입력된 구문을 보면 돌려받을 값을 a 변수에 대입하여 출력해보면 결과값으로 None이 나오며 결과값이 없다는 것을 알 수 있다. (*None이란 거짓을 나타내는 자료형이다.)
- 입력값도 결과값도 없는 함수
입력값도 결과값도 없는 함수 역시 존재한다.
>>> def hello():
... print('world')
...
>>>
입력인수를 받는 매개변수도 없고 'return문'도 없으니 입력값과 결과값도 없는 함수이다.
이러한 함수의 사용방법은 다음과 같다.
>>> hello()
world
즉 입력값도 결과값도 없는 함수는 함수 이름() 식으로 사용한다.
- 입력값이 몇 개가 될지 모를 때는 어떻게 어떻게 해야 할까?
여러 개의 입력값을 받는 함수를 만들기
>>> def add_num(*args):
... result = 0
... for i in args:
... result = result + i
... return result
...
>>>
위에서 만든 add_num 함수는 입력값이 여러 개여도 상관이 없다. *args처럼 매개 변수 앞에 '*'을 붙이면 입력값을 전부 모아서 튜플(tuple)로 만들어주기 때문이다.
예를 들면, add_num(1,2,3,4,5,6)로 사용하면 args는(1,2,3,4,5,6)이 되는 것이다. 즉 *매개변수의 형태로 사용하면 된다.
- args는 인수를 뜻하는 영어단어 arguments의 약자이다. 관례적으로 사용된다.
그럼 실제로 위의 add_num 함수를 직접 실행해 보자.
>>> result = add_num(1,2,3)
>>> print(result)
6
>>> result = add_num(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55
또한 def add_num(*args) 처럼 매개변수로 *args 만 사용할 수 있는 것은 아니다.
다음 예를 보자.
>>> def add_mul(choice, *args):
... if choice == "add":
... result = 0
... for i in args:
... result = result + i
... elif choice == "mul":
... result = 1
... for i in args:
... result = result * i
... return result
...
>>>
add_mul 함수에 *args매개변수 이외에 choice 매개변수를 추가하였다.
이 함수는 다음과 같이 사용된다.
>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15 # 매개변수에 'add'가 입력된 경우 *args의 입력되는 모든 값을 더해서 15를 돌려준다.
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120 #매개변수에 'mul'이 입력된 경우 *args에 입력되는 모든 값을 곱해서 120을 돌려준다.
- 키워드 파라미터 kwargs
이번에는 키워드 파라미터에 대해 알아보자. 키워드 파라미터를 사용할 때는 매개변수 앞에 별 두 개(**)를 붙인다.
예제를 알아보자.
>>> def print_kwargs(**kwargs):
... print(kwargs)
...
>>> print_kwargs(b=3)
{'b': 3}
>>> print_kwargs(name='foo', age=7)
{'age': 7, 'name': 'foo'}
**kwargs처럼 매개변수 이름앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결과값이
딕셔너리에 저장된다.
- 함수의 결과값은 언제나 하나이다
함수의 결과값은 언제나 하나이다. 결과값은 있거나 없어도 된다. 하지만 있을 때는 언제나 하나이다.
다음 함수를 살펴 보자.
def sub_and_mul(a,b):
return a-b, a*b
result = sub_and_mul(3,5)
print(result)
(-2, 15)
sub_and_mul 함수의 매개변수 a와 b는 return 명령어를 통해 a-b, a*b 2개의 결과값으로 돌려받는다. 그런데 이후 result는 한번만 쓰였으니 2개의 결과값이 나오지 못해서 오류가 발생해야한다. 하지만 오류가 발생하지 않는다. 그 이유는 바로 결과값이 언제나 1개라는 데 있다. a-b와 a*b는 튜플값으로 (a+b, a*b)로 돌려준다.
[return의 두가지 쓰임새]
1. return문은 첫번째 결과값을 돌려주면 함수문을 빠져나간다.
def sub_and_mul(a,b): return a-b, a*b
위의 함수를 아래와 같이 호출한다면 ??
def sub_and_mul(a,b): return a-b return a*b
result = sub_and_mul(7, 3) print(result) 4 #sub_and_mul(7, 3)의 결과값은 4 하나뿐이다. 두번째 return문인 return a*b는 실행되지 않았다.
위의 예에서 볼 수 있듯이 두번째 return문인 return a*b는 실행되지 않았다. 따라서 함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나간다는 것을 알 수 있다.
2. 1.의 특성을 이용해서 특별한 상황일 때 함수를 빠져나가고 싶으면 return을 단독으로 사용하여 함수를 즉시 빠져나갈 수 있다.>>> def say_nick(nick): ... if nick == "멍청이": ... return ... print("나의 별명은 %s 입니다." % nick) ... say_nick('야호') 나의 별명은 야호입니다. say_nick('멍청이')
"함수의 변환값은 오로지 return문에 의해서만 생성된다" 라는 것을 명심하자.
위에 구문 처럼 입력값을 멍청이로 하면 문자열을 출력하기 전 return문을 만나 함수를 즉시 빠져나간다.
- 매개변수에 초깃값 미리 설정하기
이번에는 조금 다른 형태로 함수의 인수를 전달하는 방법에 대해서 알아보자. 매개변수에 초깃값을 미리 설정해주는 경우이다.
def say_myself(name, old, man=True):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
위 함수를 보면 매개변수가 name, old, man=true 이렇게 3개다. 이것이 바로 함수의 매개변수 초기값을 설정하는 방법이다. 함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게 함수의 초기값을 미리 설정해 두면 유용하다.
say_myself("codemonkyu", 27)
나의 이름은 codemonkyu 입니다.
나이는 27살입니다.
남자입니다.
위 와 같이 함수를 사용 할 수 있다. 대신 say_myself(name, old, man = True)에서 함수의 매개변수 순서를 잘 지켜줘야 한다. 만약 say_myself(name, man = True, old)와 같이 초기값을 설정해놓은 매개변수 뒤에 초기값이 없는 매개변수를 넣는다면 SyntaxError: non-default argument follows default argument와 같은 오류 메시지가 나온다.
(*오류 메시지는 초기값을 설정해 놓은 매개변수 뒤에 초기값을 설정해 놓지 않은 매개변수는 사용할 수 없다는 뜻이다.)
- lambda
lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 한다. 보통 함수를 한줄로 간결하게 만들 때 사용한다. 우리말로는 "람다"라고 읽고 def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.
사용법은 다음과 같다.
lambda 매개변수1, 매개변수2, ... : 매개변수를 이용한 표현식
>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7
댓글