파이썬 | 함수 사용하기

CHOI·2021년 11월 24일
0

Python

목록 보기
22/33
post-thumbnail

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

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

즉, 함수를 사용하면 이러한 점이 좋다.

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

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

def 함수이름():
     코드

함수의 기본형은 위와 같다. (def 는 define 에사 따온 키워드이다)

함수 만들기

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

hello()

출력 결과

Hello, world!

이렇게 간단하게 함수를 만들 수 있다 먼저 def 를 통해 함수를 정의하고 hello() 와 같이 정의한 함수의 이름을 사용하여 호출하면 해당 함수의 기능이 수행되게 된다.

함수 실행 순서

파이썬 스크립트에서 함수의 실행 순서를 알아보자, hello 함수는 다음과 같은 순서로 실행된다.

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

Untitled

파일 작성과 함수 호출 순서

함수를 만들고 호출할 때 주의할 점은 함수를 만들고 나서 호출해야 된다는 것이다, 즉, 다음과 같이 함수를 만들기 전에 호출을 하면 안된다.

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

왜냐하면 파이썬 코드는 위에서 아래로 순차적으로 진행되기 때문이다. 반드시 함수를 먼저 만든 다음에 호출해야한다.

% 빈 함수 만들기

def hello():
    pass

% 함수 독스트링 사용하기

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

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

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

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

실행 결과

30
이 함수는 a와 b를 더한 뒤 결과를 반환하는 함수입니다.

독스트링은 함수에 대한 설명을 기록할 뿐 함수를 호출했을 떄 출력되지 않는다. 독스트링을 출력하려면 print(add.__doc__) 와 같이 함수의 __doc__ 을 출력하면 된다.

또한 다음과 같이 help 에 함수를 넣으면 함수에 대한 설명이 나온다.

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

독스트링을 잘 작성해두면 본인 뿐만 아니라 다른 사람이 사용할 때 더 편리하게 사용할 수 있다.

2. 함수의 반환

기본적인 함수의 반환은 기존에 잘 알고 있는 내용이여서 생략했다.

함수에서 값을 여러 개 반환

def add_sub(a, b):
	return a + b, a - b
x, y = add_sub(10, 20)
print(x)
print(y)

실행 결과

30
-10

add_sub 함수는 매개 변수 두 개를 받고 두 수를 더한 값과 뺀 값 두 개를 리턴한다. 그리고 그 리턴 값들이 각각 xy 에 저장된다.

Untitled

이렇게 return 으로 값이 여러 개 반환 되면 실제로는 튜플이 반환된 것이다. add_sub 함수의 반환 값을 하나의 변수에 저장하면 튜플인 것을 확인할 수 있다.

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

즉 튜플이 여러 개의 할당되는 특성을 이용한 것이다(언패킹).

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

3. 함수의 호출 과정

지금까지는 함수를 만드는 방법을 알아보았다. 이번에는 함수 여러개를 만든 뒤에 각 함수의 호출 과정을 스택 다이어그램(stack diagram)으로 알아보자. 스택은 접시 쌓기와 같은데 접시를 차곡차곡 쌓고 꺼낼 때는 위에서 부터 차례대로 꺼내는 방식이다(중간에서 부터 꺼낼 수 없다). 파이썬에서는 접시 쌓기와 뱡향이 반대이다. 함수가 아래쪽에서 추가되고 함수가 끝나면 위쪽 방향으로 사라진다.

다음 함수에서 add 함수는 mul 함수를 호출하는 방식이다.

def mul(a, b):
    c = a * b
    return c
 
def add(a, b):
    c = a + b
    print(c)
    d = mul(a, b)
    print(d)
 
x = 10
y = 20
add(x, y)

실행 결과

30
200

Untitled

소스 코드를 알아보기 쉽게 번호를 붙였다. 먼저 파이썬 스크립트가 실행되면 1번 줄부터 실행하게 된다. 그리고 12번 줄까지 진행되면 전역 프레임(global frame)에는 함수 mul, add , 변수 x, y 가 들어간다.(함수들은 생성만 되었을 뿐 아직 호출되지 않은 상태이다).

프레임이란 메모리에서 함수와 함수에 속한 변수가 저장되는 독립적인 공간이다. 특히 전역 프레임은 파이썬 스크립트 전체에서 접근할 수 있어서 전역 프레임이라고 부른다.

이제 13 번 줄에서 add 함수가 호출된 뒤 안에 들어가서 7 번 줄까지 실행되면 다음과 같은 모양이 된다.

Untitled

함수 add 의 스택 프레임이 만들어지고 매개변수 a, b 가 들어가고 변수 c 가 들어간다.

Untitled

그 다음 줄 8에서 mul 함수를 호출한 뒤 안으로 들어가서 함수 mul 의 스택 프레임이 만들어지고 매개변수 a, b 가 들어가고 변수 c 가 들어간다

Untitled

이제 9 번 줄까지 진행되어 mul 함수가 끝나고 다시 add 함수로 돌아온다 아롷개 하면 mul 함수의 반환값이 변수 d 에 저장되며 함수 add 스택 프레임에 들어가게 된다. 물론 mul 이 끝났으므로 함수 mul 스택 프레임도 사라진다.

Untitled

그리고 13줄 까지 실행되어 add 함수를 끝내게 된다. 이렇게 되면 add 의 스택 프레임도 사라지게 된다.

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

profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글