이 문서는 function에 대한 간단한 소개를 하고 있다.
일부 자세한 내용들은 관련 URL을 추가하는 형태로 확장될 수 있음.
Function이란
재사용성과 가독성을 위해 논리적으로 코드를 나누는(or 그룹짓는) 기본적인 도구.
procedure
의 추상화로서 코드의 묶음: I/O 만 파악해도 사용가능함.- 함수 내 변수는
local variable
로, 다른 함수에 의해 영향을 받지 않음. - parameter에 호출시 주어진 arguments 를 정의된 parameters에 할당하여 입력 을 받고,
return
을 통해 출력 을 수행.
function으로 구현하면, 이후로 같은 처리가 필요할 때 해당 function을 호출하여 실행시키면 된다. (재사용성)
- 예를 들어 100라인 이상의 code를 function으로 구현(function의 구현을 function definition이라고 함)하면,
- 이후 한 줄 정도의 해당 function call (해당 함수를 실행시키는 것)을 통해 100라인 이상의 code의 수행을 처리할 수 있게 됨.
- 또한 함수에 해당하는 처리가 이루어졌다고 생각할 수 있기 때문에 코드의 가독성도 향상된다.
다음은 Function에 대한 좀더 자세하고 일반적인 내용이므로 참고할 것.
https://dsaint31.me/mkdocs_site/CE/ch05/ch05_02_01_function/
Function Definition
custom function를 만드는 것을 function definition (함수정의)라고 함.
- Function 정의는
- function header를 작성하고
- 이후 function body를 만든다.
- function header는 → def test_func (argment0, argment1) :
def
키워드로 시작하며,- 이후, function name이 이후 놓이고,
- 이후,
()
가 놓이며 해당 parenthesis 안에 호출시 받을 arguments이 할당될 parameters가 놓임. - 이들 parameter들은 comma로 구분되어짐.
- 항상 function header의 끝은 colon
:
으로 끝남.
- function body는 function header 다음 line부터 시작하며, function이 호출될 때 수행될 코드들이 놓임.
- function body들은 모두 같은 수준의 들여쓰기(indentation) 가 이루어져 한다: code block.
- function body는 최소 한 line 이상의 statement로 구성된다.
- Python은 curly bracket등으로 function body를 묶지 않고 indentation을 통해 function body를 구분함.
- function body는 흔히
return
statement로 종료됨.- 그냥
return
으로 끝나거나 아예return
도 없이 끝나면, return value가None
이 됨. return return_val
의 형식으로 끝나면return_val
가 해당 함수를 호출된 위치로 반환됨.
- 그냥
원의 반지름을 argument로 입력받아, 원의 넓이를 반환하는 function을 정의하는 다음 예를 보자.
# import necessary libraries
import math # to get pi
...
# define functions
def get_circle_area(r): # function header
# body of function
area = math.pi * r **2
return area # end of function body. return_value 반환.
# test function
a = get_circle_area(3)
print(a)
- 함수에서 다른 library 또는 module의 기능을 이용할 경우엔 function definition 전에 해당 moduel들의
import
가 되어야 함. - 위의 예에서 정의한 function name은
get_circle_area
이며, 정의 이후 해당 이름을 통해 이후 function call이 이루어짐. - parenthesis 안의
r
이 바로 parameter이며, 일종의 local variable로 생각할 수 있음. - function의 body는 4개의 space 문자로 indentation이 이루어짐.
- 해당 함수는 local variable로
area
를 가지고 있으며, 이는 입력된r
과math
module의pi
값을 이용하여 원의 넓이의 값을 가짐. - 마지막에
return area
를 통해, function body를 종료한다. - 해당 return statement를 실행하면 function의 실행이 종료되며, 해당 function의 call이 이루어진 곳으로 제어가 다시 돌아가며 동시에
area
를 함수의 반환값으로 call이 이루어진 곳이 reduction이 됨.
import
문은 $\pi$ 상수의 값과 같이 다른 이들이 이미 구현한 constant나 function들을 사용하기 위해 사용된다.
우선import
문을 통해, 필요한 것들이 구현된 module이나 library를 현재의 source code에서 사용할 수 있다
라고만 알아두고module
등을 배울 때 좀더 자세히 살펴보자.
Function Call
함수 호출이라고 불리며, Function을 실행 하는 것을 의미함.
Function의 호출은 ret_v = function_name(arg0, arg1)
과 같은 형태를 띔.
- function call에서 argument에는 각각 expression가 할당된다.
- 일반적으로는 line 순으로 실행(execution)이 이루어지지만,
- function call이 되면 해당 함수로 제어가 넘어가서 함수의 body가 실행되고,
- 해당 함수 종료 후 호출된 곳으로 제어가 돌아옴.
- 해당 함수를 호출한 부분
function_name(arg0, arg1)
이return_value
로 reduction이 이루어짐.- 즉
ret_v = return_value
로 statement가 reduction이 되고, 해당 assignment가 이루어짐.
- 즉
다음 그림이 위의 과정을 앞서 나온 get_circle_area
함수 호출의 예를 보여줌.
위의 그림에서 붉은 색의 부분은 function call 이 이루어질 때 Python에 의해 자동으로 수행되는 것들임.
- 함수 호출시 제일 먼저 이루어지는 것은 함수 이후 돌아올 귀환 address를 저장하는 것임 (이는 stack에 저장됨).
- 동시에 호출시 사용된 argument (위의 그림에서
3.0
)는 function header에 정의된 parameter에 assignment가 됨. - return address, parameters와 local varaibles 모두 stack에 저장됨.
- stack frame내에 저장되고 해당 stack frame이 stack에 push됨.
- function namespace (or function scope) 가 생성되므로 global scope의 variable과 구분된다.
- 함수의 수행이 종료 (return문이 수행)되면, stack에 push되어 있던 것들이 역순으로 pop됨.
- 귀환주소(return address)로 제어가 넘어가면서, 귀환 위치의 function call 부분이 return value로 reduction된다.
- 이로써 함수의 수행이 완전히 끝나며, 함수 실행이 시작될 때 memory에 생성되었던 parameter와 local variable들은 stack에서 pop되면서 제거되어 더 이상 접근할 수 없게됨.
Function call은 반드시 function definition 뒤에 이루어져야 함.
조금 더 scope의 개념 등을 추가한 설명은 다음을 참고 :
https://dsaint31.tistory.com/entry/Python-Function-Call-%ED%95%A8%EC%88%98%ED%98%B8%EC%B6%9C
여러가지 Function 예제
여러 개의 arguments 를 가지나, return value는 없는 경우.
def print_fn ( name, age, dep ):
print('===========================`)
print(f'name:{name}, age={age}, department={dep}')
print('===========================`)
return # 반환값이 없는 reutn문은 생략해도 똑같음.
argument 없이 호출되는 function의 경우, parenthesis안에 parameter가 없음.
def fn_wo_arg ():
print('Hello world!')
return 0
여러개의 반환값을 가지는 function
def fn_mul_ret( a, b ):
r0 = a**2
r1 = b**2
return r0, r1 # 사실은 tuple 객체 하나가 반환되는 것으로 여러개의 반환값이 있는 것으로 보일 뿐임.
rv0, rv1 = fn_mul_ret(2,4) # tuple의 unpacking이 이루어짐.
print(rv0, rv1)
tuple_rv = fn_mul_ret(2,4) # tuple로 받은 경우!
print(tuple_rv[0], tuple_rv[1])
위의 예에서 반환값이 여러개로 보이지만,
실제로는 여러 반환값들을tuple
로 묶어서 하나의tuple
객체를 반환해주는 것임.
Parameter and Argument 관련
Parameter w/ default argument
다음과 같이, 특정 parameter들에는 기본으로 할당되는 argument를 지정할 수 있음.
def ds_print(message='my default message'):
print (message)
my_print("hello") # prints 'hello'
my_print() # prints 'my default message'
- 단 default argument가 할당된 parameter들은, 기본값이 없는 parameter들의 뒤에 놓여야함.
Keyword assignment
지금까지는 positional assignment로 argument들이 parameter들에 할당이 되었으나,
parameter 명을 key로 사용하여 할당할 수도 있음. (보다 명확하지만, 타이핑을 보다 많이 쳐야해서 귀찮음)
def ds_subtract( a=0, b=0):
return a - b
ds_subtract(10, 5) # returns 5
ds_subtract(0, 5) # returns -5
ds_subtract(b=5) # same as previous
같이 보면 좋은 자료들
'Programming' 카테고리의 다른 글
[Basic] namespace, frame, and context (0) | 2023.06.11 |
---|---|
[Python] Function Call (함수호출) (0) | 2023.06.10 |
[Python] Python Interactive Shell (or Python Interactive Prompt) (0) | 2023.06.09 |
[Python] Python Script File 실행해보기 (0) | 2023.06.09 |
[Programming] Application Programming Interface (API) (0) | 2023.06.08 |