앞의 포스트를 통해 함수를 정의하고 호출하는 방법, 함수의 특성, 함수에 대한 입력과 반환 등을 알아보았다. 이제 실제로 함수를 작성하고 사용해볼 차례이다.
그에 앞서, 다음의 내용을 잊지 말아야 한다. 프로그래밍을 하는 것은 글로 문학작품-예를 들어 시-을 쓰는 것이 아니다. 프로그래밍은 언제나 목적이 분명하고, 직관적으로 작성되며, 논리와 절차가 확실해야한다.
나와 같은 초보자들은 함수를 작성하는 등 프로그래밍을 할 때 위의 요소를 정확히 지키는 것에 어려움을 느끼는 것이 당연하다고 한다.
따라서 아래의 내용을 검토하면서 함수를 작성한다면, 훨씬 수월하게 함수를 작성하고 프로그래밍을 할 수 있다고 한다.
1. Purpose of function
어떤 함수를 작성하기에 앞서 당연히 이 함수를 통해 어떤 기능을 구현하고자 하는지 명확히 해야한다. 예를들어 여러가지 연산을 한번에 수행할 수 있는 함수를 설계할 것인지, 아니면 한가지의 연산만을 수행할 수 있는 함수를 설계할 것인지를 선택하는 것이라고 생각할 수 있다. 함수의 기능의 범위를 명확하게 잡고, 명확한 목적을 설정하고 코드를 작성할 때 깔끔하게 코드를 작성할 수 있다.
2. Function name
함수의 이름은 함수의 기능과 파라메터와 리턴값의 특징을 담는 형태로 작성하는 것이 좋다. 당연히 협업을 한다면 동료 개발자들은 함수의 이름만을 통해 함수를 호출하고 사용한다. 이때 이름이 해당 함수가 수행하는 일에 대한 정보를 담고 있지 않다면 함수를 사용할 때 마다 Function Body를 찾아 어떤 일을 수행하는지 일일이 확인해야 한다. 그런 수고로움을 덜기위해 함수의 이름을 잘 설정해야 한다.
3. Parameter
함수에서 원하는 기능을 구현하기 위해 어떤 파라메터를 입력받아야 하는지 생각해보아야 한다. 사용되지 않는 파라메터는 입력받을 이유가 없다. 또, 원하는 기능을 구현하기 위해 반드시 필요한 변수는 파라메터로 받아야만 한다. 따라서, 1번 즉 함수의 목적의 연장선으로 파라메터의 개수와 형태를 생각해야만 한다.
4. Return value
반환값을 어떤 형식으로 어떤 값을 내보낼지 선택하는 것도 중요하다. 반환값이 무엇이냐에 따라 함수의 기능이 달라진다. 따라서 함수의 목적에 알맞은 값을 내보낼 수 있도록 반환값을 설정해야한다.
5. Function body
실질적으로 함수의 기능을 구현하는 부분이다. 함수의 헤더 아래에서부터 return메소드 전까지의 부분을 의미한다. 이 부분에서 파이썬의 여러 문법과 다른 함수들을 호출하는 것을 통해 원하는 기능을 구현해나가게 된다. 이 부분을 오류없이 깔끔하게 원하는 목적에 맞게 작성할 때, 함수를 잘 작성할 수 있다.
#Docstring (documentation string)
작성된 프로그래밍 코드는 얼핏보면 무엇을 위해 작성됐는지 알아볼 수 없다. 내가 작성한 코드여도 알아보기 어려울 때도 있고, 남이 작성한 코드라면 더더욱 알아보기 어려운 경우가 많다. 이는 장문의 프로그래밍을 하거나 여러명이 협업하는 과정에서 큰 장애물이 된다.
이를 해결하기 위해 파이썬에서는 Docstring이라는 기능을 지원한다. 아래의 코드블럭을 보자.
def helloworld() :
"""
hello world!를 출력하는 함수입니다.
함수의 이름은 helloworld입니다.
입력파라메터는 존재하지 않습니다.
반환값도 존재하지 않습니다.
"""
print("hello world!")
helloworld()
실행결과
hellow world!
"""표시 즉 큰따옴표 3개는 주석을 여러줄의 코드를 할애하여 작성할 수 있도록 한다.
또한 help함수를 사용하여 코드의 설명을 볼 수 있다. 아래의 코드블럭을 확인하자!
def helloworld() :
"""
hello world!를 출력하는 함수입니다.
함수의 이름은 helloworld입니다.
입력파라메터는 존재하지 않습니다.
반환값도 존재하지 않습니다.
"""
print("hello world!")
help(helloworld)
실행결과
Help on function helloworld in module __main__:
helloworld()
hello world!를 출력하는 함수입니다.
함수의 이름은 helloworld입니다.
입력파라메터는 존재하지 않습니다.
반환값도 존재하지 않습니다.
Docstring을 작성할 때는 권장되는 작성 내용이 있다.
1) Types of Parameters -> Types of Return value
파라메터로 받는 변수의 타입과 결과물로 반환하는 반환값의 타입을 명시하는 것이다. 파이썬에서는 변수의 자료형을 자동할당하기 때문에 C언어에 비해 상대적으로 덜 자료형에 신경을 써도 되지만, 함수가 복잡하게 얽힌 프로그램의 경우 자료형을 따지는 것은 필수적이다. 예를 들어 문자열을 파라메터로 받는 것을 가정하고 작성된 함수가 있다고 하자. 이 함수에 파라메터로 정수 자료형을 갖는 변수를 넣는다면 당연히 함수의 바디에서 오류가 발생할 것이다. (문자열에만 적용할 수 있는 연산을 정수 변수에 적용하려고 하면 당연히 Syntaxerror가 발생한다.)
2) Function description
함수가 작성되었다면, 그 함수가 정확히 어떤 일을 하는지 적어야한다. Function body의 코드를 하나하나 읽어가면서 어떤 함수가 어떤 일을 하는지 확인하는 것은 매우 힘든 일이다. 따라서, 해당 함수를 작성한 사람이 미리 해당 함수가 어떤 일을 수행하는지 적어놓아야 한다. 어떤 파라메터들을 받아서 어떤 작업을 거친 후, 어떤 값을 반환하는지를 적으면 된다.
3) Example calls
함수를 호출하는 예시를 적어야 한다. 앞서 언급했듯 파이썬은 오버라이트 기능이 지원된다. 따라서, 같은 이름의 함수더라도 받는 파라메터의 개수와 자료형이 다를 수 있다. 따라서 호출 예시와 반환값 예시를 함께 작성하여, 어떤 파라메터들을 넣을 수 있고 어떤 반환값이 출력되는지를 적어야 한다. 이를 통해 해당 함수를 사용하는 다른 개발자들은 그 함수를 더욱 잘 활용할 수 있게된다.
아래와 같이 작성해볼 수 있다.
def addTwoNum(N1,N2):
"""
(int,int) -> int
(float,float) -> float
(int,float) -> float
입력받은 두 수를 합한 값을 반환하는 함수이다.
>>> addTwoNum(1,2)
3
>>> addTwoNum(1.1,2.2)
3.3
>>> addTwoNum(1,2.1)
3.1
"""
return N1+N2
이제 함수를 작성할 때 고려해야 하는 부분들과 작성해야 하는 부분들을 모두 알아보았다.
결론적으로 함수를 설계하는 과정에 대해서 알아보자. 아래의 1->5를 순차적으로 적용한다면, 문제상황을 쉽게 파악하고 함수를 작성할 수 있을 것이다.
1. Examples
-어떤 함수를 원하는지
-어떤 인풋을 넣어줄지
-어떤 아웃풋을 반환할지
-함수 이름을 어떻게 설정할지
2. Type contract
-인풋 파라메터의 타입
-아웃풋 파라메터의 타입
3.Header
-함수의 헤더를 작성
4.Description
-함수의 작동과정 등을 docstring을 사용하여 표현
5.Body
-function body를 작성하여 함수를 코딩
'Development language > Python' 카테고리의 다른 글
Python-6. Boolean / 논리연산자 / 비교연산자 (0) | 2021.11.09 |
---|---|
Python-5. String-문자열 / 따옴표 / Escape Sequence / print() / input() (0) | 2021.11.08 |
Python-3. 함수의 파라메터와 반환 / 4가지의 경우. (0) | 2021.11.02 |
Python-2.함수 정의와 호출 / 객체 선언 / 지역변수 (0) | 2021.10.06 |
Python-1. 함수란 무엇인가? / Python의 대표적인 내장함수 (0) | 2021.10.06 |