기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

[python] 함수(Function): 함수의 정의

함수

관련내용

함수의 정의

함수는 특정한 결과를 생성하기 위한 코드들의 그룹입니다. 예를 들어 다음 코드에서 나타낸 것과 같이 내장함수인 int()는 인수로 부동소수(실수)를 전달받으면 소수점 이하의 값들을 배제한 정수를 생성합니다.

x=3.21
int(x)
3

위 결과는 다음과 같이 다른 함수 또는 메소드를 사용하는 일단의 코드들로 구성하여 나타낼 수 있습니다.

y=str(x).split(".")
y
['3', '21']
print(y[0])
3

파이썬은 다양한 패키지나 모듈에서 제공하는 함수와 코아 파이썬에서 제공하는 내장함수(built-in function)로 구분합니다. 또한 사용자는 파이썬에서 제공하는 함수들과 코드들을 사용하여 함수(사용자 정의함수, user-defined function)를 작성하여 사용할 수 있습니다.

함수의 구조는 식 1과 같으며 키워드 def로 시작합니다.

def 함수이름(인수): #header 부분
    """docstring"""
    본 문
(식 1)

식 1에서 나타낸 것과 같이 함수는 키워드 def로 시작하며 다음으로 함수이름과 괄호내에 본문에 전달할 인수(들)을 입력할 부분을 위치시킵니다. 이 부분은 함수의 header부분이 되며 메인 문과 같은 역할을 합니다. 다시말하면, 이 선언 이후에 작성되는 코드들(본문)은 메인문이 호출될 때만 작동됩니다. 메인문은 콜론(:)으로 끝나고 본문은 개행후 4칸 들쓰기로 작성됩니다. 함수 작성과정에서 실제 실행에 영향을 주지 않는 간략한 설명인 주석을 세개의 따옴표 내에 작성할 수 있습니다. 이 주석을 docstring이라하며 header 아래의 어디에나 위치할 수 있으나 필수적인 부분은 아닙니다. 그러나 함수를 사용하는 다른 사용자들이나 추후에 그 함수의 점검에 있어 유익한 도움이 됩니다.

다음은 두 객체의 각 요소의 덧셈을 실행하는 사용자 정의 함수입니다.

def Tot(x, y): # ①
   """이 함수는 리스트등 두 콜렉션 객체의 
   각 원소의 합을 계산합니다."""
   re=[] # ②
   for i in range(len(x)): # ③
      re.append(x[i]+y[i]) # ④
   return re # ⑤
  • ①: 함수 이름을 입력하는 헤드 부분으로 끝 부분에 콜론(:)을 입력하였습니다. 파이썬에서 콜론은 코드 블럭을 이끄는 main 문임을 의미합니다. 즉, 콜론과 줄바꿈 후에 (4칸)들여쓰기 한 모든 부분은 main문 내부에서만 동작하는 블럭(block)이 됩니다. 이 함수에서 ② ~ ⑤ 까지가 블럭의 내부에 해당합니다.
  • ②: 함수의 결과를 저장할 객체를 생성합니다.
  • ③: for 문의 시작으로 콜론이 문장의 끝에 위치합니다. 즉, 함수 내부에 새로운 블럭이 시작됩니다.
  • ④: 이 부분은 for 문 이하에 개행 후 들여쓰기 한 부분으로 이 문의 시작과 함께 실행되는 부분입니다.
  • ⑤: for 문 블럭 밖에서 실행되는 코드이며 함수의 결과를 반환하는 return 문 입니다. 함수에서 return 문의 실행은 함수의 종결을 의미합니다.
  • return(x)
    • 함수의 내의 코드들의 실행 결과인 x를 저장
    • 함수의 종결
    • 저장된 결과는 새로운 객체로 재사용 할 수 있음

함수에 전달하는 매개변수는 다른 함수들을 포함하여 모든 자료형의 객체가 가능합니다. 다음은 위 함수 Tot를 실행한 것입니다.

a=[2, 1, 5]
b=[3, 2, 7]
Tot(a, b)
[5, 3, 12]

함수 내에서 생성되는 변수는 함수 내부에서만 작동합니다. 즉, 함수 외부에서 그 변수를 사용할 수 없습니다. 또한 함수의 종료와 함께 내부 변수 역시 소멸됩니다(전역변수와 지역변수).

다음 함수 averageIn()은 이터러블 객체의 평균을 계산하는 사용자 정의함수로 함수 내부에 변수 tot를 정의하였으며 for 문을 사용하였습니다. 변수 tot의 작동 영역은 함수 내부로 한정됩니다. 즉, tot는 이 함수 내부에서만 작동하는 지역변수입니다.

def averageIn(x):
  tot=0  # ①
  for i in x:  # ②
    tot += i
  return(tot/len(x))  # ③, ④

이 함수의 실행과정은 다음과 같습니다.

  • ① 변수 tot의 초기값을 0으로 선언합니다.
  • for 문을 사용하여 인수로 전달되는 이터러블 객체 x의 요소 처음부터 마지막까지의 모든 수를 더합니다.
  • ③ 그 총합을 len(x)을 사용하여 산출된 객체의 길이로 나누어 줍니다.
  • ④ 결과를 return() 문으로 반환합니다.

위 코드의 len()은 문자열, 리스트 등 컬렉션 객체의 길이를 반환하는 내장함수입니다.

a=range(1, 11)
averageIn(a)
5.5

함수가 실행되지 않은 영역에서 함수 내에서 정의된 지역변수를 호출하면 파이썬은 인식하지 못합니다.

tot
...NameError: name 'tot' is not defined

함수 역시 객체이므로 이름과 그 내용은 별개의 공간에 저장되며 함수를 호출하면 이름과 그 내용이 되는 코드들이 연결됩니다(객체 참조). 그러므로 일반 객체와 같이 필요시 호출할 수 있고 수정할 수 있으며 다른 함수의 인수로 전달할 수 있습니다. 또한 다른 함수의 본문의 코드들로 사용될 수 있습니다. 결과적으로 함수를 사용하여 큰 프로그램을 작은 단위로 그룹화하여 사용할 수 있으므로 프로그램의 보완과 수정 등 프로그램 관리에도 유리합니다.

다음은 미리 작성된 여러함수를 사용하여 새로운 함수를 생성한 것입니다.

def addS(x, y):
    return(x+y)

def subS(x, y):
    return(x-y)

def mulS(x, y):
    return(x*y)

def divS(x,y):
    if y != 0:
        return(x/y)
    else:
        raise ZeroDivisionError("y must not be zero.")
def mathOperS(x, y):
    add=addS(x, y)
    sub=subS(x, y)
    mul=mulS(x, y)
    div=divS(x, y)
    return([add, sub, mul, div])
mathOperS(5, 7)
[12, -2, 35, 0.7142857142857143]
mathOperS(7, 0)
ZeroDivisionError: y must not be zero.

위 함수 divS()의 else 문에 작성된 raise문을 파이썬 자체에서 지정된 에러(예외)의 종류를 발생하는 내장함수입니다.

  • raise 예외종류[("에러메시지")]
    • 지정한 예외의 종류를 발생시키는 내장함수
    • 지정한 예외의 종류가 없으면 실행중 에러인 RuntimeError 예외가 발생
    • "에러메시지"는 옵션으로 존재하면 반환

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b