Post List

2015년 7월 26일 일요일

Python 기초 #04 함수 (Function)

1. 함수 선언

def 함수명 (매개변수...):
    실행문장...
    ...
    
return 반환값

매개변수가 없는 경우는 빈 괄호 ( ) 안에 매개변수 없이 선언합니다.
반환값이 없는 경우는 return 문장을 사용하지 않으면 됩니다.

예를 들어서 2개의 숫자를 더하는 함수는 다음과 같이 선언, 사용하면 됩니다.

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

c = add(1,2)
print(c)

2. 함수 내부 검증

함수가 호출되어서 수행되기 전까지는 함수 내부의 실행문이 실행되지 않습니다. 
위 문장만으로 어떤 뜻인지 이해가 어려울수도 있으니 먼저 예제부터 보도록 하겠습니다.

def repeat_print():
    print_hello()
    print_hello()
   
def print_hello():
    print("Hello.")

repeat_print()

repeat_print() 문이 수행될때 까지는 repeat_print()와 print_hello() 가 선언되었다는 사실만 확인하지, 실제로 안에 Code에 대해서는 검증을 하지 않습니다.
해당 함수가 호출이 되는 시점에 비로서 내부 Code들을 수행하면서 검증합니다.
그러므로 위 문장은 정상적으로 수행됩니다.
만약 print_hello()가 repeat_print()가 호출되는 시점 이후에 선언이 되었다면,
repeat_hello()가 실행될때 print_hello()를 찾을 것으며, 해당 함수가 선언되어 있지 않으므로, 오류가 발생합니다.
Compile Time 오류가 아닌 Runtime 시에 발생합니다.

3. 가변인자

입력값이 몇개 인지 모를 경우 *인자명 으로 입력하면 가변인자가 됩니다.
해당 인자값은 모두 1개의 tuple의 입력처리 됩니다.
인자가 여럿일 경우 가변인자는 마지막에 위치해야 합니다.
그렇지 않다면 가변인자 뒤에 다른 인자로 값을 줘야할 경우 어디까지가 가변인자인지 알 방법이 없기 때문입니다.


def sum(*arg):
    sum = 0
    for n in arg:
        sum += n
    return sum;

>>> print(sum(1,2,3,4))
10

4. return 값은 하나만 가능합니다.

그럼 여러 개의 값을 return 할려면 ? tuple로 전달하면 됩니다.

def retMany(*arg):
    sum = 0
    sumSq = 0
    for n in arg:
        sum += n;
        sumSq += n * n;
    return (sum, sumSq)
 
>>> print(retMany(1,2,3,4))
(10,30)

5. default 인자

default값이 있는 인자는 인자 목록 중 마지막에 위치해야 합니다. 만약 default 인자 뒤에 default값이 없는 인자가 있다면 앞에 default인자값에 값을 전달하지 않아서 default로 처리하고 뒤에 인자에 값을 전달할 경우 어떻게 처리 해야할지 모호해지기 때문입니다.

def sumOp(n1, n2, IsSQ = False):
    sum = 0
    if IsSQ:
        sum = n1 * n1 + n2 * n2
    else:
        sum = n1 + n2
    return sum
 
>>> print(sumOp(1,2))
3
>>> print(sumOp(1,2,True))
5

연습문제 04
연습문제 02에서 시급을 계산하는 부분을 함수로 구현하세요.