함수
관련내용
- 함수의 정의
- 전역변수와 지역변수
- 함수: 인수의 전달
- 가변인수
- 발생자(generator)
- 주요한 내장함수들
- 재귀함수(Recursive Function)
- 람다함수(Lambda Function)
- Python의 함수는 1급(First Class)객체
- 1급 객체와 변수의 영역
- 클로저(Closure)
- 데코레이터(Decorator, 장식자)
함수의 정의
- 함수의 정의
- 전역변수와 지역변수
- 함수: 인수의 전달
- 가변인수
- 발생자(generator)
- 주요한 내장함수들
- 재귀함수(Recursive Function)
- 람다함수(Lambda Function)
- Python의 함수는 1급(First Class)객체
- 1급 객체와 변수의 영역
- 클로저(Closure)
- 데코레이터(Decorator, 장식자)
함수의 정의
함수는 특정한 결과를 생성하기 위한 코드들의 그룹입니다. 예를 들어 다음 코드에서 나타낸 것과 같이 내장함수인 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 예외가 발생
- "에러메시지"는 옵션으로 존재하면 반환
댓글
댓글 쓰기