반응형

스크립트의 일부분을 잘라내어 언제든지 사용할 수 있도록 하는 "함수", 이것을 잘 다루면 긴 프로그램을 구조적으로 조립이 가능하다. 그 기본을 설명한다.


함수란?

스크립트라고 하는 것은, 같은 처리를 여러번 반복하는 경우가 많다. 그 때마다 일일이 같은 스크립트를 여러번 쓰는 것은 매우 귀찮다. 이러한 "정해진 처리"를 언제 어디서나 호출할 수 있도록 하는 것이 "함수"이다.

예를 들어, 아래에 올린 예제(1)과 같은 예를 생각해 보자. 변수에 이름을 넣어 "Hello, OO. How are you?"라고 출력하는 스크립트이다. 이것은 유사한 텍스트를 출력하기 위해, 유사한 print 문을 여러번 작성을 하였다. 어쩐지 너무 바보 같지 않은가?

예제 (1)

a = "Taro" 
b = "Hanako" 
c = "Ichiro" 
   
print("Hello, " + a + ". How are you?") 
print("Hello, " + b + ". How are you?") 
print("Hello, " + c + ". How are you?")

이러한 때 "함수"가 도움이 된다. 예제(2) 함수를 사용하여 다시 작성한 것이다. 첫째로, 정해진 형태로 출력하는 함수를 먼저 준비해두면, 그 후로는 "showMsg("Taro ")"라고 하면 언제든지 호출 할 수 있다. 호출을 하는 것만으로 지정된 형태의 메시지가 표시될 것이다.

예제(2)

def showMsg(str): 
    print("Hello, " + str + ". How are you?") 
   
showMsg("Taro") 
showMsg("Hanako") 
showMsg("Ichiro") 

여기에서는 짧은 메시지를 표시 할 뿐이지만만, 좀 더 복잡한 처리가 되면 "한번 스크립트를 작성해 놓으면, 그것은 언제든지 호출하여 실행할 수 있다"라는 것은 매우 편리하다라는 것을 알 수있을 것이다.

print도 함수?

이 함수라는 것은 이미 실은 여러분은 사용하고 있었다. 값을 출력하는 "print"이다. Python은 기본적으로 많은 기능을 사용할 수 있게 되어 있다. 대부분은 "함수"로 준비되어 있는 것이다.



함수의 정의

이제 이 함수는 어떻게 만드는지, 설명하겠다. 함수는 다음과 같은 형태로 정의한다.

함수의 정의 (1)

def 함수 이름(인수1, 인수 2, ...):
    ...... 수행 할 작업 ......

함수 정의의 기본은 "def 함수 이름"이다. 이전에 샘플(2)는 "def showMsg ~"라고 되어 있기 때문에, showMsg라는 함수가 만들어진 것이다.

그리고 함수 이름 뒤에 ():을 붙이고 그 이후로는 줄 바꿈하고 들여 쓰기를 하여, 수행할 처리를 작성한다.

(): 안에는 '인수'라는 것을 추가할 수 있다. 인수는 함수를 호출할 때에 어떤 값을 받아서 전달하는데 사용한다. 예를 들어 샘플(2)에서

def showMsg(str) :

이렇게 되어 있었다. 이는 ()안에 있는 "str"라는 인수가 포함되어 있다는 것이다.

이것은 "이 함수를 호출 할 때, 어떤 값을 함께 쓰기 때문에, 그것을 str이라는 변수에 넣어 전달한다"라는 의미이다. 샘플에서 호출하는 부분을 살펴 보자.

showMsg( "Taro")

자, 이런 식으로 함수 이름 뒤에 ()를 붙이고, "Taro"라는 값이 작성되어 있는 걸까? 이 "Taro"가 showMsg 함수의 "str" 변수에 전달된다.

실행중인 처리를 보면, 이렇게 되어 있다.

print("Hello, " + str + ". How are you?") 

전달된 변수로 str을 사용하여 메시지를 print하고 있는 것을 알 수 있다.

인수는 하나뿐 아니라 얼마든지 추가할 수 있다. 이 경우 각각의 변수를 쉼표로 구분하여 작성한다.

def showMsg(a, b, c): 

이런 식이다. 인수가 없는 경우에도 ()은 붙이지 않으면 안된다.

함수를 이용하는데 있어서 최소한 기억하지 않으면 안 것은 우선 이것뿐이다. 의외로 간단하지 않는가?


반환 값

함수는 함수 이름과 인수가 제대로 알면 정의 할 수 있다. 사실은 함수 정의 부분에 나타나지 않는 또 하나의 중요한 요소가 있다. 그것은 "반환 값"이다.

반환 값은 함수를 실행한 후, 어떤 값을 호출한 곳에 돌려주는 역할을 한다. 이 반환 값은 "return"이라는 것을 사용하여 설정한다.

함수의 정의 (2)

 def 함수 이름(인수 1, 인수 2, ...):
     ...... 수행 할 작업 ......
     return

이와 같이 처리 한 후, 마지막에 "return 값"으로 인해 값을 반환하고, 호출 곳에 값이 전달된다.

실제로 반환 값을 사용해 보자. 이전에 샘플을 반환 값을 반환하는 형태로 고치면 아래와 같다.

def showMsg(str): 
    return "Hello," + str + ".How are you?"
   
res = showMsg("Taro") 
print(res) 
res = showMsg("Hanako") 
print(res) 

여기에서는 showMsg 함수에서 return을 사용하여 텍스트를 반환한다. 이 함수를 호출하는 부분을 보면,

res = showMsg("Taro")

이렇게 되어있는 것을 확인할 수 있다. showMsg의 결과를 변수 res에 대입하고, 이것으로 반환 값이 res에 할당되게 된다. 그러고 나서는 이 res를 사용하여 결과를 표시하고 있다.



키워드 인수

함수를 구성하는 요소 중에 의외로 다기능 것이 "인수"이다. 이것은 일반적으로 값을 전달 외에 여러가지 옵션을 가지고 있다.

먼저 "키워드 인수"라는 것이 있다. 이것은 인수에 키워드(이름)을 붙여 사용할 수 있도록 하는 기능이다. 무슨 말인가 하면, 아래와 같은 것이다.

함수의 정의 (3)

 def 함수(키1=초기값1, 키2=초기값2, ...):

키와 초기 값을 지정하는 것이다. 그러면 키를 사용하여 인수를 지정할 수 있다. 보통 인수는 순서가 정해져 있지만, 키를 사용하여 순서에 관계없이 값을 작성할 수 있다.

또한, 초기 값을 설정할 수 있기 때문에 값을 생략할 수 있다 (생략하면 기본값이 사용된다). 보통 인수는 반드시 값을 전달하지 않으면 안되지만, 키워드 인수로 하게 되면 옵션 다루는 (없어도 OK) 인수를 만들 수 있다.

그럼 실제 사용 예를 살펴 보자.

def showMsg(name, header='Hello', footer='How are you?'): 
    print(header + "," + name + ". " + footer) 
   
showMsg("Taro") 
showMsg("철수", '안녕', '건강하니?') 
showMsg("영희", footer='잘지내니?', header='야') 

여기에는 세가지 인수의 지정을 해서 showMsg를 호출한다. showMsg("Taro")와 같이, 첫번째 인수에 이름을 지정하는 것만으로도 제대로 동작하고, 두번째와 세번째는 초기값으로 동작한다.

또한 키워드는 붙여도 붙이지 않아도 동작한다. 다만, 키워드를 붙이지 않는 경우는 인수가 정의된 순서대로 지정해야 한다. 키워드를 붙여 인수를 작성할 경우는 어떤 순서라도 상관없다.

여기에서는 키워드가 없는 인수와 있는 인수가 혼재하고 있지만, 이러한 경우에는 반드시 "키워드가 없는 인수"를 먼저 정의하고 키워드 인수는 다음에 정의해야 한다. 키워드 인수 후에 키워드가 없는 인수를 지정하면 문법 오류이다.



가변 인자

인수에 대해 또 다른 설명을 하고 싶은 것이 "가변 인자"라는 것이다. 가변 인자라는 것은 "길이 (인수의 수)가 가변 인수"이다. 즉, "몇 개의 인수를 붙여도 된다"라는 특별한 인수이다.

"인수가 몇개 있어도 된다? 그것을 어떻게 정의하는 걸까?"라고 이상하게 생각 하겠지만, 가능하다. "정의 할 수 있지만 어떻게 값을 받을 거야?"라고 생각 하겠지만, 받을 수 있다.

가변 인자라는 것은 알기 쉽게 말하자면, "많은 인수를 컨테이너에 모와서 받을 인수"이다. 즉, "목록을 인수로 설정한 것"이라고 말할 수 있다. 다만, 목록을 인수에 쓰는 번거로움 때문에, (목록에 보관해 두는 값을) 하나씩 인수에 넣으면 자동으로 그것들을 한꺼번에 넘겨주게 되어 있다.

이 가변 인자는 다음과 같이 정의한다.

함수의 정의 (4)

def 함수(*인수):

인수 정의하는 변수 이름 앞에 별표 (*)를 붙이면, 그 인수가 가변 인자로 설정된다. 이 인수에는 여러 인수로 정의한 값이 n개로 모와서 전달된다. 그 후로는 거기로 부터 필요한 값을 꺼내는 처리만 하면 된다.

그럼 이것도 간단한 예제를 살펴 보자.

def calc(*num): 
    total = 0
    for n in num: 
        total += int(n) 
    print('합계:' + str(total)) 
    print('평균:' + str(total // len(num))) 
   
calc(123, 456, 789, 246, 357, 910) 

여기에서는 calc(* num)와 같이 함수를 정의하고 있다. 이것으로 num이라는 변수에 입력된 모든 인수를 컨테이너에 모와서 전달된다. 그 후에는 이 num을 for문으로 반복해 나가면 된다.

반응형

'Python' 카테고리의 다른 글

[Python] 클래스 사용  (0) 2017.12.22
[Python] 함수(function)  (0) 2017.12.22
[Python] 리스트, 튜플, 레인지, 세트, 사전  (0) 2017.12.22
[Python] 구문(statement)  (0) 2017.12.22
[Python] 우선 값과 계산의 기본  (0) 2017.12.22
[Python] Python 개발 환경  (0) 2017.12.22

+ Recent posts