함수


파이썬에서 사용자 정의 함수는 def라는 키워드로 시작한다. 값을 반환하려면 return 키워드를 사용하면 된다는 점은 다른 프로그래밍 언어들과 마찬가지이다.

def myFunc0():
    return '안녕'




파이썬의 함수는 사용하기 전에 정의되어 있어야 한다. 따라서, 다음의 코드는 잘못된 코딩이다.

myFunc1()
  
def myFunc1():
    print( '나는야 함수라네~' )




일단 함수의 이름만 선언 해두고 함수의 바디 부분은 아직 구현하지 않았다면 어떻겠는가. 다른 프로그래밍 언어에서는 void myFunc(){ } 처럼 블록 안에 아무것도 안쓰면 그만이다. 그러나, 브레이스{} 통한 블록 구조를 배제해버린 파이썬의 경우에는 구문 해석 과정에서 오류가 발생한다. 그래서, 파이썬에는 pass라는 키워드가 등장하게 되었다. 즉, pass는 '아무 것도 안함'이라는 의미이다. pass 키워드는 if-else 구문에서도 처리할 것이 없을 때에 종종 사용된다.

def myFunc2():
    pass
 


기본적으로, 파이썬에서 함수의 매개변수는 다른 프로그래밍언어들에서와 유사하다. 즉, 함수 이름 뒤에 괄호 사이에 매개변수를 나열해 주면 된다.

def myFunc3(param1):
    print( '나는야 함수라네~' , param1)

def myFunc4(param1, param2):
    print( '나는야 함수라네~' , param1, param2)


함수의 매개변수가 생략된 경우에 사용될 기본값을 지정해줄 수도 있다. 다음과 같은 함수의 경우 myFunc5(1) 또는 myFunc5(1,5)라고 호출할 수 있고, 두번째 매개변수가 생략된 경우 param2는 3이 된다. 
주의해야 할 것은, 기본값을 가진 매개변수는 항상 뒤쪽에 써야 한다는 것이다. 논리적으로 생각해 보면 당연하다, 안그러면 파이썬 인터프리터가 헷갈릴테니까.

def myFunc5(param1, param2= 3):
    print( '나는야 함수라네~' , param1, param2)
 


임의의 갯수를 갖는 매개변수도 있다. *는 C언어의 포인터가 아니다, 두려워하지 말자. 매개변수명 앞에 *를 붙이면 되는데, 이 매개변수는 튜플로 전달된다. 임의 갯수의 매개변수가 항상 뒤쪽에 와야 한다는 점에 주의하기 바란다.

def myFunc6(param1, param2, *args):
    for i in args:
        print(i)
    print(param1) # 0
    print(param2) # 1
    print(type(args), args) # <class 'tuple'> (2, 3, 4)
   
myFunc6(0, 1, 2, 3, 4)
 


딕셔너리 타입의 임의 매개변수도 가능한데, 이때는 매개변수명 앞에 **를 붙여준다. 위의 경우와 마찬가지로, 임의 갯수의 매개변수가 항상 뒤쪽에 와야 한다
    
def myFunc7(**kwargs):
    for i in kwargs:
        print(i, '=', kwargs[i])
    print(type(kwargs), kwargs) # <class 'dict'> {'three': 3, 'two': 2, 'one': 1}
     
myFunc7(one= 1, two=2 , three=3)

    
def myFunc8(param1, param2, *args, **kwargs):
    pass
 



아래의 소스코드는 range() 함수와 비슷한 역할을 수행한다. 다만, range() 함수는 끝 값을 포함하지 않는 반면, 이 함수는 끝 값도 포함하도록 작성되었다.

#!/usr/bin/python3
# 레인지 함수와 유사하지만, 끝 값도 포함한다.
# by Elex (http://python.elex.pe.kr/)


def main():
    for i in iRange(0 , 10, 2):
        print(i, end=' ')
   
def iRange(*args):
    # 매개변수의 갯수 따라 start, stop, step 변수에 값을 할당한다.
    lengthOfArgs = len(args) # 매개변수의 길이
    if lengthOfArgs < 1 :
        raise TypeError('매개변수가 하나도 없네')
    elif lengthOfArgs == 1: # 매개변수가 하나인 경우엔,
        start = 0
        stop = args[ 0]
        step = 1
    elif lengthOfArgs == 2: # 매개변수가 둘인 때에는,
        (start, stop) = args
        step = 1
    elif lengthOfArgs == 3: # 매개변수가 셋인 경우에는,
        (start, stop, step) = args
    else:
        raise TypeError('매개변수가 {}개라니. 너무 많네'.format(lengthOfArgs))
   
    # 값을 증감시키면서 하나씩 반환한다.
    i = start
    while i <= stop:
        yield i
        i += step
   
if __name__ == "__main__": main()

yield 키워드는 return과 유사하다. 즉, 값을 반환한다. 하지만, 함수가 종결되지는 않고 계속 진행된다는 차이점이 있다.
raise 키워드는 예외를 발생시키는 역할을 한다. 개인적으로는 예외를 발생(raise)시키는 것보다는 던지는(throw) 것이 더 어감이 좋아 보이긴하다만...

댓글

이 블로그의 인기 게시물

Project Euler - 3

메인 스크립트

예외 처리