본문 바로가기
[Python]/python 개념

함수

by 코드몽규 2022. 1. 23.
반응형
  • 일반적인 함수

 입력값이 있고 결괏값이 있는 함수가 일반적인 함수이다. 앞으로 여러분이 프로그래밍을 할 때 만들 함수는 대부분 다음과 비슷한 형태일 것이다.

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

 

반응형

댓글