새소식

인기 검색어

개인공부/Python

함수 사용하기

  • -

Unit 29. 함수 사용하기

프로그래밍을 하다 보면 들어가는 값만 바뀔 뿐 같은 코드가 계속 반복되는 경우가 많습니다. 특히 같은 코드를 반복해서 작성하면 코드도 길어지고 중간에 실수할 가능성이 높아집니다.

파이썬은 함수(function)라는 기능을 제공하는데 특정 용도의 코드를 한 곳에 모아 놓은 것을 뜻합니다. 그래서 함수는 처음 한 번만 작성해 놓으면 나중에 필요할 때 계속 불러 쓸 수 있습니다. 예를 들어 지금까지 사용했던 print, input 등도 모두 파이썬에서 미리 만들어 둔 함수입니다.

즉, 함수를 사용하면 이런 점이 좋습니다.

  • 코드의 용도를 구분할 수 있다.
  • 코드를 재사용할 수 있다.
  • 실수를 줄일 수 있다.

함수는 다양한 사용 방법이 있으므로 이제부터 각 유닛에서 함수의 사용법을 자세히 알아보겠습니다.

29.1 Hello, world! 출력 함수 만들기

함수는 def에 함수 이름을 지정하고 ( )(괄호)와 :(콜론)을 붙인 뒤 다음 줄에 원하는 코드를 작성합니다(함수의 이름을 짓는 방법은 변수와 같습니다). 이때 코드는 반드시 들여쓰기를 해야 합니다(들여쓰기 규칙은 if, for, while과 같습니다).

def 함수이름():
     코드

여기서 def는 정의하다(define)에서 따온 키워드입니다.

29.1.1  함수 만들기

그럼 'Hello, world!'를 출력하는 함수를 만들어보겠습니다.

>>> def hello():
...      print('Hello, world!')
... 

함수 이름은 hello로 지정하고, 그다음 줄에서 print 'Hello, world!' 문자열을 출력하도록 만들었습니다.

29.1.2  함수 호출하기

함수를 만들었으니 사용을 해봐야겠죠? 함수를 만든 부분 아래에서 hello()와 같이 함수 이름과 ()를 적어주면 함수를 사용할 수 있습니다.

  • 함수()
>>> hello()
Hello, world!

이렇게 함수를 사용하는 방법을 "함수를 호출(call)한다"라고 부릅니다.

29.1.3  소스 파일에서 함수를 만들고 호출하기

이번에는 소스 파일에서 함수를 만들고 호출해보겠습니다. 다음 내용을 IDLE의 소스 코드 편집 창에 입력한 뒤 실행해보세요.

function.py

def hello():
    print('Hello, world!')
 
hello()
Hello, world!
에러

SyntaxError: invalid syntax: 함수의 형식이 맞지 않아서 발생하는 구문 에러입니다. ( )(괄호)의 짝이 맞는지, :(콜론)을 빠뜨리지 않았는지 확인해주세요.

함수 호출이 되지 않음: 함수를 호출할 때 ( )(괄호)를 빠뜨리지 않았는지 확인해주세요. 그냥 hello처럼 괄호를 붙이지 않으면 함수가 호출되지 않습니다.

실행을 하면 hello 함수가 만들어진 뒤 호출되어서 'Hello, world!' 문자열이 출력됩니다.

29.1.4  함수의 실행 순서

이제 파이썬 스크립트에서 함수의 실행 순서를 알아보겠습니다. hello 함수는 다음과 같은 순서로 실행됩니다.

  1. 파이썬 스크립트 최초 실행
  2. hello 함수 호출
  3. hello 함수 실행
  4. print 함수 실행 및 'Hello, world!' 출력
  5. hello 함수 종료
  6. 파이썬 스크립트 종료

 그림 29-1 파이썬 스크립트에서 hello 함수의 실행 순서

29.1.5  함수 작성과 함수 호출 순서

함수를 만들고 호출할 때 주의할 점이 있는데, 바로 함수를 만들기 전에 함수를 먼저 호출하면 안 된다는 점입니다. 즉, 다음과 같이 함수를 먼저 호출한 뒤 함수를 만들 수는 없습니다.

hello()         # hello 함수를 만들기 전에 함수를 먼저 호출
 
def hello():    # hello 함수를 만듦
    print('Hello, world!')

 

실행 결과

Traceback (most recent call last):
  File "C:\project\function.py", line 1, in <module>
    hello()    # hello 함수를 만들기 전에 함수를 먼저 호출
NameError: name 'hello' is not defined 

함수를 먼저 호출하면 함수가 정의(define)되지 않았다는 에러가 발생합니다. 왜냐하면 파이썬 코드는 위에서 아래로 순차적으로 실행되기 때문입니다. 반드시 함수를 먼저 만든 뒤에 함수를 호출해야 합니다.

참고 | 빈 함수 만들기

내용이 없는 빈 함수를 만들 때는 코드 부분에 pass를 넣어줍니다.

def hello():
    pass

나중에 다른 사람이 만든 파이썬 소스 코드를 보다 보면 pass를 자주 접할 수 있습니다. pass는 아무 일을 하지 않아도 함수의 틀을 유지할 필요가 있을 때 사용합니다.

 

다음과 같이 함수 안에서 return을 사용하면 값을 함수 바깥으로 반환합니다(return에 값을 지정하지 않으면 None을 반환).

def 함수이름(매개변수):
    return 반환값

그럼 두 수를 더해서 반환하는 add 함수를 만들어보겠습니다. 함수 add에 매개변수에 a b를 지정하고 그다음 줄에서 return으로 a b를 더한 값을 반환하도록 만듭니다.

>>> def add(a, b):
...     return a + b
...

이제 add 함수에 10과 20을 넣고 결과를 x에 저장합니다. 그리고 x의 값을 출력해봅니다.

>>> x = add(10, 20)
>>> x
30

x의 값을 출력해보면 10과 20을 더한 값인 30이 나옵니다. 이처럼 return을 사용하면 값을 함수 바깥으로 반환할 수 있고, 함수에서 나온 값을 변수에 저장할 수 있습니다.

즉, return으로 반환하는 값은 반환값이라고 하며 함수를 호출해준 바깥에 결과를 알려주기 위해 사용합니다.

add 함수의 호출 과정을 그림으로 표현하면 다음과 같은 모양이 됩니다.

 그림 29-3 함수의 반환값을 변수에 저장

반환값은 변수에 저장하지 않고 바로 다른 함수에 넣을 수도 있습니다. 다음은 print에서 바로 add를 호출하여 결과를 출력합니다.

>>> print(add(10, 20))
30
참고 | 매개변수는 없고 반환값만 있는 함수

함수를 만들 때 매개변수는 없지만 값만 반환하는 함수를 만들 수도 있습니다. 다음은 매개변수 없이 1만 반환합니다.

>>> def one():
...     return 1
...
>>> x = one()
>>> x
1
참고 | return으로 함수 중간에서 빠져나오기

return은 값을 반환하는 기능뿐만 아니라 함수 중간에서 바로 빠져나오는 기능도 있습니다. 다음은 매개변수 a가 10이면 함수를 그냥 빠져나옵니다.

>>> def not_ten(a):
...     if a == 10:
...         return
...     print(a, '입니다.', sep='')
...
>>> not_ten(5)
5입니다.
>>> not_ten(10)
>>> 

not_ten 함수에 5를 넣으면 print '5입니다.'를 출력하지만, 10을 넣으면 return으로 함수 중간에서 바로 빠져나오므로 그 아래에 있는 print는 실행하지 않습니다. 따라서 아무것도 출력되지 않습니다.

이처럼 return은 함수 중간에서 빠져나올 때 자주 사용합니다. 보통은 if와 조합해서 특정 조건일 때 함수 중간에서 빠져나옵니다.

 

지금까지 함수의 결과를 변수에 저장할 때 값을 한 개만 저장했습니다. 이번에는 함수에서 값을 여러 개 반환하는 방법을 알아보겠습니다.

함수에서 값을 여러 개 반환할 때는 다음과 같이 return에 값이나 변수를 ,(콤마)로 구분해서 지정하면 됩니다.

def 함수이름(매개변수):
    return 반환값1, 반환값2

그럼 두 수를 더한 값과 뺀 값을 반환하는 함수를 만들어보겠습니다. 다음과 같이 return으로 a b를 더한 값과 a에서 b를 뺀 값을 반환하도록 만듭니다.

>>> def add_sub(a, b):
...     return a + b, a - b
...

이제 add_sub 함수에 10과 20을 넣고 결과를 x y에 저장합니다. 그리고 x y의 값을 출력해봅니다.

>>> x, y = add_sub(10, 20)
>>> x
30
>>> y
-10

x의 값을 출력해보면 10과 20을 더한 값인 30이 나오고, y의 값을 출력해보면 10에서 20을 뺀 값인 -10이 나옵니다. 이처럼 return은 값을 여러 개 반환할 수 있습니다.

add_sub 함수의 호출 과정을 그림으로 표현하면 다음과 같은 모양이 됩니다.

 그림 29-4 반환값 여러 개를 변수 여러 개에 저장

이렇게 return으로 값을 여러 개 반환하면 실제로는 튜플이 반환됩니다. 다음과 같이 add_sub의 결과를 변수 한 개에 저장해서 출력해보면 튜플이 반환되는 것을 볼 수 있습니다.

>>> x = add_sub(10, 20)
>>> x
(30, -10)

즉, 튜플이 변수 여러 개에 할당되는 특성을 이용한 것입니다(언패킹).

>>> x, y = (30, -10)
>>> x
30
>>> y
-10
참고 | 값 여러 개를 직접 반환하기

함수에서 값 여러 개를 직접 반환할 때는 다음과 같이 return에 튜플을 지정해주면 됩니다.

def one_two():
    return (1, 2)

사실 파이썬에서는 괄호 없이 값을 콤마로 구분하면 튜플이 되죠? 즉, 튜플 1, 2는 튜플 (1, 2)와 같습니다.

>>> 1, 2
(1, 2)

따라서 return 1, 2 return (1, 2)와 의미가 같습니다.

def one_two():
    return 1, 2    # return (1, 2)와 같음

물론 return에서 리스트를 직접 반환해도 됩니다. 이때도 반환값을 변수 여러 개에 저장할 수 있습니다.

>>> def one_two():
...     return [1, 2]
...
>>> x, y = one_two()
>>> print(x, y)
1 2

'개인공부 > Python' 카테고리의 다른 글

클래스 상속 사용하기  (0) 2022.08.01
람다 표현식으로 함수 만들기  (0) 2022.07.29
파일 사용하기  (0) 2022.07.28
세트  (0) 2022.07.28
python 심사문제 UNIT(25 ~ 35)  (0) 2022.07.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.