함수

함수의 활용에 대해 좀 더 자세히 살펴본다.

  • 함수의 부작용(side effect)
  • returnprint의 활용법

함수의 부작용(side effect)

리스트 관련 메소드인 pop() 함수의 경우 특정값을 리턴하는 것과 더불어 리턴하는 값을 해당 리스트에서 삭제하는 부가 기능을 수행한다. 즉 메모리 상태가 변경된다. 이와같이 함수가 값을 리턴하는 것 이외에 메모리 상태를 변경한다면 이를 함수의 부작용이라 부른다.

예제:

In [25]: L = [1, 2, 3]
In [26]: L.pop()
Out[26]: 3
In [27]: L
Out[27]: [1, 2]

즉, pop() 메소드를 호출할 때 마다 메모리에 저장된 L의 값 또한 변한다. 파이썬튜토어를 이용하면 아래와 같다.


In [1]:
%load_ext tutormagic

In [2]:
%%tutor
L = [1, 2, 3]
a = L.pop()
L


sum 함수 구현하기

파이썬에 기본적으로 내장된 함수들이 여럿 있다. 지금까지 살펴본 내장함수로 abs, dir, float, format, help, id, int, len, min, max, range, type 등이 있다. 보다 자세한 내용은 아래 사이트를 참조하면 된다.

https://docs.python.org/2/library/functions.html

이번엔 sum 이라는 내장함수를 살펴보고자 한다. sum 함수는 리스트 또는 튜플 자료형을 입력받으면 각 항목들의 값의 합을 리턴해준다. 대신에 숫자들로만 구성된 시퀀스에 대해서만 작동한다.

In [25]: sum([1, 2, 3])
Out[25]: 6

In [3]:
sum((1, 2, 3))


Out[3]:
6

sum 내장함수와 동일한 값을 리턴하는 함수를 두 가지 방식으로 직접 구현해보도록 하자.

아래 정의에서 sum1 함수는 부작용이 없도록 구현한 반면에 sum2 함수는 부작용이 있도록 구현하였다. 두 함수의 차이점을 파이썬튜토어를 이용하여 확인할 수 있다.


In [4]:
%%tutor

def sum1(xs):
    s = 0
    for i in xs:
        s = s + i
    return s

a = sum1([1,2,3])



In [5]:
%%tutor

def sum2(xs):
    s = 0
    for i in range(len(xs)):
        s = s + xs.pop()
    return s

a = sum2([1,2,3])


부작용 사용 여부

함수를 정의할 때 부작용이 있도록 코딩할지 여부를 판단해야 하지만, 부작용이 필요한 이유가 명확하지 않다면 부작용이 없도록 함수를 코딩해야 한다. 하지만 부작용이 필요한 경우가 존재한다. 리스트의 pop() 메소드가 대표적인 경우이다.

내장함수 활용

특정 기능을 수행하는 함수를 작성하기 전에 동일한 기능을 수행하는 내장함수가 이미 존재하는지 확인하는 것이 좋다. sum 함수의 경우 많이 사용되기에 이미 구현되어있음.

returnprint의 활용법

파이썬의 모든 함수는 리턴값을 갖고 있다. 함수를 정의할 때 return값을 명시하지 않아도 자동으로 return None을 추가해서 처리한다. print 함수가 대표적으로 None을 리턴값으로 갖고 있는 함수이다.

리턴값이 None이면 재활용을 할 수 없다. print 함수가 대표적이다. 함수를 정의할 때 가능하면 print 문은 사용하지 않도록 한다. 어차피 재활용되지 않는 결과만 보여주기 때문이다.

하지만 디버깅 등 위해 일부러 코드 중간중간에 print문을 사용하곤 한다. 기능이 제대로 작동하는지 확인하기 위한 용도로 사용한다.