/ PYTHON

Python - Python 함수 사용하기

Python

함수 사용하기



파이썬은 함수라는 기능을 제공해 특정 용도의 코드를 한 곳에 모아 사용할 수 있다. 필요한 함수를 작성해 놓고 필요할 때 불러서 사용하게 되어있다. 지금까지 사용한 print, input등도 모두 파이썬에서 미리 만들어둔 함수이다.

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

1. Hello, world! 출력 함수 만들기



함수는 def에 함수를 지정하고 ()와 :을 붙인 뒤 다음 줄에 사용하고자 하는 코드를 작성한다. 함수의 이름 짓는 방법은 변수와 같고 이때 코드를 반드시 들여쓰기를 해야한다.(def = define)


def 함수이름():
     코드

함수 만들기



‘Hello, world!’를 출력하는 함수를 만들어보자.


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

함수 호출하기



위에서 만든 함수를 이름과 ()를 적어 호출할 수 있다. 이렇게 함수를 사용하는 방법을 “함수를 호출(call)한다”라고 부른다.


hello()
Hello, world!

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



이번에는 소스 파일에서 함수를 만들고 호출해보자. 다음 내용을 IDLE의 소스 코드 편집창에서 입력한 뒤 실행해 보자. F5를 눌러 실행하면 hello함수가 호출되어 ‘Hello, world!’가 출력된다.


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

'Hello, world!'

함수의 실행 순서



hello 함수는 다음과 같은 순서로 실행된다.

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

함수 작성과 함수 호출 순서



함수를 만들고 호출할 때 주의할 점이 있는데, 바로 함수를 만들기 전에 함수를 먼저 호출하면 안된다는 것이다. 즉, 다음과 같이 함수를 먼저 호출한 뒤 함수를 만들순 없다. 함수를 먼저 호출하게 되면 정의가 되지 않았다는 에러가 발생한다.


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 

빈 함수 만들기



내용이 없는 빈 함수를 만들 때는 코드 부분에 pass를 넣어준다. 나중에 다른 사람이 만든 파이썬 소스 코드를 보다 보면 pass를 자주 접할 수 있다. pass는 아무 일을 하지 않아도 함수의 틀을 유지할 필요가 있을 때 사용한다.


def somedef():
    pass


2. 덧셈 함수 만들기



hello 함수는 동작이 고정되어 있었다. 이번에는 함수에 값을 넣어서 실행환경에 따라 동작을 바꾸어 보자. 함수에서 값을 받으려면 ()안에 변수 이름을 지정해주면 된다. 특히 이 변수를 매개변수(parameter)라고 부른다.


def 함수이름(매개변수1, 매개변수2):
    코드

이제 두 수를 더하는 함수를 만들어 보자. 매개변수 a와 b를 지정하고, 그다음 줄에서 print로 a와b의 합을 출력한다.


def add(a, b):
    print(a + b)

함수 add에 10 과 20을 넣어 출력해 보자. 여기서 함수를 호출할 때 넣는 값을 인수(argument)라고 부른다. 즉, add(10, 20)에서 10과 20이 인수이다.


add(10, 20):

# 출력
30

함수 독스트링 사용하기



파이썬에서 함수의 :(콜론)바로 다음 줄에 “”” “”“(큰따옴표 세개)로 문자열을 입력하면 함수에 대한 설명을 넣을 수 있다. 이런 방식의 문자열을 독스트링 (문서화 문자열, documentation strings, docstrings)이라고 한다. 단 독스트링 윗줄에 다른 코드가 오면 안된다.


def 함수이름(매개변수):
    """독스트링"""
    코드
 
def 함수이름(매개변수):
    """
    여러 줄로 된 
    독스트링
    """
    코드

독스트링은 ‘ ‘(작은따옴표), “ “(큰따옴표), ‘’’ ‘’‘(작은따옴표 세 개)로 만들어도 되지만, 파이썬 코딩 스타일 가이드(PEP 8)에서는 “”” “”“(큰따옴표 세 개)를 권장한다.


def add(a, b):
    """이 함수는 a와 b를 더한 뒤 결과를 반환하는 함수입니다."""
    return a + b
 
x = add(10, 20)       # 함수를 호출해도 독스트링은 출력되지 않음
print(x)
 
print(add.__doc__)    # 함수의 __doc__로 독스트링 출력

# 실행 결과
30
 함수는 a와 b를 더한  결과를 반환하는 함수입니다.

독스트링은 함수의 사용 방법만 기록할 뿐 add(10, 20)으로 함수를 호출해도 출력되지 않는다. 독스트링을 출력하려면 print(add.doc)와 같이 함수의 __doc__을 출력하면 된다. 다음과 같이 help에 함수를 넣으면 함수의 이름, 매개변수, 독스트링을 도움말 형태로 출력해준다.


help(add) # 입력
(출력)
Help on function add in module __main__:
 
add(a, b)
     함수는 a와 b를 더한  결과를 반환하는 함수입니다.


3. 함수의 결과를 반환하기



앞에서 만든 add함수는 두 수를 더해서 바로 출력했다. return을 사용하면 값을 함수 바깥으로 반환한다.


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

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


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

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


x = add(10, 20)
x
30

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


print(add(10, 20))
30

매개변수는 없고 반환값만 있는 함수



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


def one():
     return 1

x = one()
x
1

return으로 함수 중간에서 빠져나오기



return은 값을 반환하는 기능뿐만 아니라 함수 중간에서 바로 빠져나오는 기능도 있다. 다음은 매개변수 a가 10이면 함수를 그냥 빠져나온다. not_ten 함수에 5를 넣으면 print로 ‘5입니다.’를 출력하지만, 10을 넣으면 return으로 함수 중간에서 바로 빠져나오므로 그 아래에 있는 print는 실행하지 않는다. 따라서 아무것도 출력되지 않는다.


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

not_ten(5)
#5입니다
not_ten(10)
#

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


4. 함수에서 값을 여러 개 반환하기



지금까지 함수의 결과를 변수에 저장할 때 값을 한 개만 저장했다. 이번에는 함수에서 값을 여러 개 반환하는 방법을 알아보자. 값을 여러 개 반환할 때는 다음과 같이 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의 값을 출력해보면 10과 20을 더한 값인 30이 나오고, y의 값을 출력해보면 10에서 20을 뺀 값인 -10이 나온다. 이처럼 return은 값을 여러 개 반환할 수 있다.


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

이렇게 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


5. 함수의 호출 과정 알아보기



함수 여러 개를 만든 뒤에 각 함수의 호출 과정을 스택 다이어그램(stack diagram)으로 알아보자. 스택은 접시 쌓기와 같은데 접시를 차곡차곡 꺼낼 때는 위쪽부터 차례대로 꺼내는 방식이다. 파이썬에서는 접시 쌓기와 방향이 반대인데, 함수가 아래쪽 방향으로 추가되고 함수가 끝나면 위쪽 방향으로 사라집니다. 다음은 덧셈 함수 add와 곱셈 함수 mul이 있고, add 함수 안에서 mul 함수를 호출하는 방식으로 만들어져 있다.


def mul(a, b): #1
    c = a * b #2
    return c #3
 
def add(a, b): #5
    c = a + b #6
    print(c) #7
    d = mul(a, b) #8
    print(d) #9
 
x = 10 #11
y = 20 #12
add(x, y) #13

#실행 결과

30
200

파이썬 스크립트를 실행하면 줄 1부터 12까지 실행 하면서 전역프레임 에는 함수 mul,add 변수 x, y가 들어간다(함수 mul, add는 생성만 되었을 뿐 호출이 되지 않은 상태이다).

global frame parameter
mul mul(a, b)
add add(a, b)
x 10
y 20

프레임이란 메모리에서 함수와 함수에 속한 변수가 저장되는 독립적인 공간이다. 특히 전역 프레임은 파이썬 스크립트 전체에서 접근할 수 있어서 전역 프레임이라 부른다.
이제 함수 add를 호출한 뒤 안으로 들어가서 줄 7 print(c)까지 실행하면 다음과 같은 모양이 된다. 즉, 함수 add의 스택 프레임이 만들어지고 매개변수 a와 b 그리고 c가 들어간다.

global frame parameter
mul mul(a, b)
add add(a, b)
x 10
y 20
add  
a 10
b 20
c 30

여기서 함수 mul을 호출한 뒤 안으로 들어가서 줄 3return c 까지 실행하면 함수 mul의 스택 프레임이 만들어지고 매개변수 a와 b그리고 변수 c가 들어간다.

global frame parameter
mul mul(a, b)
add add(a, b)
x 10
y 20
add  
a 10
b 20
c 30
mul  
a 10
b 20
c 200

이제 줄 9 print(d)까지 실행해서 함수 mul을 끝내고 함수 add로 되돌아 간다. 이렇게 하면 mul에서 반환한 반환값 200이 변수 d에 저장되며 add의 스택 프레임에 들어간다. 물론 mul은 끝났으므로 스택 프레임도 사라진다.

global frame parameter
mul mul(a, b)
add add(a, b)
x 10
y 20
add  
a 10
b 20
c 30
d 200

그다음 줄 13 add(x, y)까지 실행해서 함수 add를 끝낸다. 이렇게 하면 add의 스택 프레임도 사라진다.

global frame parameter
mul mul(a, b)
add add(a, b)
x 10
y 20

위 과정처럼 함수는 스택(stack)방식으로 호출된다. 즉, 함수를 호출하면 스택의 아래쪽 방향으로 함수가 추가되고 함수가 끝나면 위쪽 방향으로 사라진다. 특히 프레임은 스택 안에 이썽서 각 프레임을 스택 프레임이라고 부른다. 참고로 전역 프레임은 스크립트 파일의 실행이 끝나면 사라진다.


예제



표준 입력으로 숫자 두 개가 입력됩니다. 다음 소스 코드를 완성하여 두 숫자의 덧셈, 뺄셈, 곱셈, 나눗셈의 결과가 출력되게 만드세요. 이때 나눗셈의 결과는 실수라야 합니다.


x, y = map(int, input().split())

________________
________________

a, s, m, d = calc(x, y)
print('덧셈: {0}, 뺄셈: {1}, 곱셈: {2}, 나눗셈: {3}'.format(a, s, m, d))
#입력

10 20

#표준출력
덧셈: 30, 뺄셈: -10, 곱셈: 200, 나눗셈: 0.5

#입력

40 8

#표준출력
덧셈: 48, 뺄셈: 32, 곱셈: 320, 나눗셈: 5.0


def calc(x,y):
    return x+y, x-y, x*y, float(x/y)