함수 정의하기 및 실행하기

함수 정의하기: def 키워드를 이용

  • 함수를 정의하려면 def 키워드를 이용한다.
  • def 함수이름(인자, ...): 형태로 정의한다.
  • 콜론(:)을 항상 사용해야 함에 주의할 것.
  • 함수의 본체(body)는 들여쓰기를 해야한다.
  • 들여쓰기는 선택이 아닌 의무사항이다.

In [1]:
def mysum(a, b):
    return a + b

함수정의의 문서화

  • 프로그래밍 코드를 저장한 파일에는 코드 이외에 코드와 관련된 주석을 적절하게 포함하고 있어야 한다. 이를 "문서화"라 한다.
  • 문서화는 코드 이상으로 중요하다. 문서화가 제대로 되어있지 않은 프로그램 코드 파일은 코드 개발 및 관리를 매우 어렵게 만든다.

  • 문서화의 기본은 함수에 주석을 다는 것이다. 함수정의에 사용되는 주석을 "docstring(문서화 문자열)"이라 부른다.

  • 함수에 주석을 달아주면 help 함수를 이용하여 해당 함수의 역할 및 사용법을 확인할 수 있다.
  • 앞서 help("abs") 명령을 실행하여 abs 함수가 절대값을 return하는 함수임을 알 수 있었음에 주의하라.

In [2]:
def mysum(a, b):
    """내가 정의한 덧셈이다.
    인자 a와 b에 각각 두 숫자를 입력받아 합을 되돌려준다.
    """
    return a + b

In [3]:
help(mysum)


Help on function mysum in module __main__:

mysum(a, b)
    내가 정의한 덧셈이다.
    인자 a와 b에 각각 두 숫자를 입력받아 합을 되돌려준다.

함수 관련 용어

함수를 호출(실행)하기 위해서는 함수이름(인자1, 인자2, ...) 형태로 사용한다. 예를 들어 mysum(2,3) 처럼 mysum 함수를 호출한다.


In [4]:
x = 2
y = 3
z = mysum(x,y)
  • mysum(x,y)에서 xymysum 함수를 호출할 때 사용되는 "인자(argument)" 들이다.
  • zmysum 함수를 두 개의 인자 x, y에 대해 호출하였을 때 "되돌려주는 값(리턴값, return value)"이다.
  • 함수를 호출할 때 사용되는 인자의 개수는 0개 이상이다.
  • 리턴값이 없는 것처럼 보이는 함수도 존재한다. 대표적으로 print 함수가 그렇다. 즉, print 함수의 정의를 확인하면 return 값이 정의되어 있지 않다.
  • 하지만 return 값이 명시되어 있지 않아도 파이썬은 None이라는 특별한 값을 리턴한다고 간주한다.

리턴값이 있는/없는 함수


In [5]:
def print42():
    print(42)
    
def return42():
    return 42

In [6]:
b = return42()

In [7]:
b


Out[7]:
42

In [8]:
a = print42()


42

In [9]:
print(a)


None
주의: IPython의 경우 리턴값이 있는 함수의 경우에만 out[] 문장이 함께 사용된다.

In [10]:
return42()


Out[10]:
42

In [11]:
print42()


42

모듈(Module)

  • 모듈은 동일한 분야에서 사용되는 함수 및 코드들을 한데로 모아놓은 파이썬 파일(확장자가 .py인 파일)이다.
  • 예를 들어 operator 모듈은 파이썬에서 기본적으로 제공하는 계산 관련 함수들의 정의들을 갖고 있는 파일이다.
  • 덧셈, 뺄셈, 나눗셈 등 기초 연산자들이 아닌 다른 함수들, 예를 들어, sin, cos, log 등 고등수학 관련 함수들은 math 라는 모듈에 정의되어 있다.

operator 모듈

  • +, -, *, /, //, ** 등은 파이썬이 기본적으로 제공하는 함수들을 대신하는 기호들이다. 각 기호들에 해당하는 진짜 함수들은 operator 모듈에 정의되어 있다.
  • 예를 들어, + 기호는 operator 모듈의 add 함수를 나타낸다.
  • 기타 기호들의 함수들에 대해서는 아래 링크를 참조하면 된다. https://docs.python.org/2/library/operator.html

  • operator 모듈에 있는 함수들의 이름을 직접 사용하려면 import operator 명령을 실행한 후에 operator.add(1,2) 형태로 실행하면 된다.

  • dir(operator) 를 실행하면 operator 모듈에 어떤 함수들이 정의되어 있는지 확인할 수 있다

In [12]:
import operator

In [13]:
help(operator.add)


Help on built-in function add in module operator:

add(...)
    add(a, b) -- Same as a + b.

dir 함수를 이용하면 operator 모듈에 정의되어 있는 함수들의 목록을 확인할 수 있다.


In [14]:
dir(operator)


Out[14]:
['__abs__',
 '__add__',
 '__and__',
 '__concat__',
 '__contains__',
 '__delitem__',
 '__delslice__',
 '__div__',
 '__doc__',
 '__eq__',
 '__file__',
 '__floordiv__',
 '__ge__',
 '__getitem__',
 '__getslice__',
 '__gt__',
 '__iadd__',
 '__iand__',
 '__iconcat__',
 '__idiv__',
 '__ifloordiv__',
 '__ilshift__',
 '__imod__',
 '__imul__',
 '__index__',
 '__inv__',
 '__invert__',
 '__ior__',
 '__ipow__',
 '__irepeat__',
 '__irshift__',
 '__isub__',
 '__itruediv__',
 '__ixor__',
 '__le__',
 '__lshift__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__name__',
 '__ne__',
 '__neg__',
 '__not__',
 '__or__',
 '__package__',
 '__pos__',
 '__pow__',
 '__repeat__',
 '__rshift__',
 '__setitem__',
 '__setslice__',
 '__sub__',
 '__truediv__',
 '__xor__',
 '_compare_digest',
 'abs',
 'add',
 'and_',
 'attrgetter',
 'concat',
 'contains',
 'countOf',
 'delitem',
 'delslice',
 'div',
 'eq',
 'floordiv',
 'ge',
 'getitem',
 'getslice',
 'gt',
 'iadd',
 'iand',
 'iconcat',
 'idiv',
 'ifloordiv',
 'ilshift',
 'imod',
 'imul',
 'index',
 'indexOf',
 'inv',
 'invert',
 'ior',
 'ipow',
 'irepeat',
 'irshift',
 'isCallable',
 'isMappingType',
 'isNumberType',
 'isSequenceType',
 'is_',
 'is_not',
 'isub',
 'itemgetter',
 'itruediv',
 'ixor',
 'le',
 'lshift',
 'lt',
 'methodcaller',
 'mod',
 'mul',
 'ne',
 'neg',
 'not_',
 'or_',
 'pos',
 'pow',
 'repeat',
 'rshift',
 'sequenceIncludes',
 'setitem',
 'setslice',
 'sub',
 'truediv',
 'truth',
 'xor']

모듈 사용하는 법

모듈을 사용하려면 해당 모듈을 import 해야 한다. 예를 들어, sin(10) 값을 구하기 위해 math 모듈을 임포트해야 하는데 임포트 방식은 크게 세 가지로 나뉜다.

  • import math 명령을 실행한 후에 math.sin(10) 등 처럼 실행하면 된다.
  • 모듈 이름을 임의로 고쳐서 임포트 할 수 있다: import math as m
  • from math import sin 명령을 실행한 후에 sin(10)을 실행하면 된다.
  • from math import * 명령을 실행한 후에 sin(10)을 실행하면 된다. 여기서 * 는 모든 함수를 의미한다.

In [15]:
import math

In [16]:
math.sin(10)


Out[16]:
-0.5440211108893699

In [17]:
import math as m

In [18]:
m.pi


Out[18]:
3.141592653589793

In [19]:
from math import sin, pi

In [20]:
sin(10)


Out[20]:
-0.5440211108893699

In [21]:
pi


Out[21]:
3.141592653589793

In [22]:
math.cos(10)


Out[22]:
-0.8390715290764524

In [23]:
from math import *

In [24]:
exp(1)


Out[24]:
2.718281828459045

math 모듈에 들어있는 함수들을 종종 확인할 필요가 있다. 강의에서 가장 많이 사용하는 모듈 중에 하나이다.


In [25]:
dir(math)


Out[25]:
['__doc__',
 '__file__',
 '__name__',
 '__package__',
 'acos',
 'acosh',
 'asin',
 'asinh',
 'atan',
 'atan2',
 'atanh',
 'ceil',
 'copysign',
 'cos',
 'cosh',
 'degrees',
 'e',
 'erf',
 'erfc',
 'exp',
 'expm1',
 'fabs',
 'factorial',
 'floor',
 'fmod',
 'frexp',
 'fsum',
 'gamma',
 'hypot',
 'isinf',
 'isnan',
 'ldexp',
 'lgamma',
 'log',
 'log10',
 'log1p',
 'modf',
 'pi',
 'pow',
 'radians',
 'sin',
 'sinh',
 'sqrt',
 'tan',
 'tanh',
 'trunc']

In [26]:
help(math.sqrt)


Help on built-in function sqrt in module math:

sqrt(...)
    sqrt(x)
    
    Return the square root of x.