기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

[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' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...