5. 함수 5.1 지역변수

C급 개발자와 함께하는 파이썬

5. 함수

이제까지 배운것은 파이썬에 필요한 문법적인 부분들을 배웠습니다. 이번장에서 공부할 함수는 이전에 만들어 놓은 프로그램을 재사용하기 위해서 묶어 놓아 사용하고 싶을때 재사용하는 것입니다.


파이썬에서 프로그래머가 가장많이 사용하는 구성도구는 함수이다. 다른 언어에서처럼 함수는 큰 프로그램을 작고 단순한 조각으로 나누어 준다. 함수를 사용하면 가독성이 높아지고 코드를 더 이해하기 쉬워진다. 또한 재사용이나 리팩토링도 가능해진다.


파이썬에서 제공하는 함수는 개발을 좀더 편리하게 할수 있게 도와준다. 일부는 다른 프로그래밍 언어에서 제공하는 기능과 비슷하지만 파이썬에만 있는 기능도 제공하고 있다.


앞에서 우리는 반복적인으로 발생하는 명령문에 대해서 while문으로 구성한적이 있다 이와 같이 함수도 반복적으로 나타날것들을 만들어 놓아서 재사용할수 있게 하는것이다.


함수를 이용해서 계산기를 만들어보도록 하자.


계산기에 필요한 기능은 무엇이 있는가 가장 쉬운 4칙 연산이 있을것입니다.


  1. 둘중에 큰수를 되돌려주는 함수를 만든다

  2. 둘중에 작은수를 되돌려 주는 함수를 만들다.


함수는 def 로 시작한다.

def function(argument) :

    return result

function <- 함수이름

argument <- 함수에 전달할 매개변수

return result <- 결과 값을 되돌려 준다. 리턴한다라고 이야기한다.




위의 코드는 두개의 수중에 최대값을 리턴하는 함수입니다.  결과값은 아래와 같이 나타납니다.



100과 125중에 큰수는 125를 출력하는 함수입니다.

다음에는 최소값을 리턴하는 함수를 만들어 보겠습니다. 방법은 max를 만드는 방법과 동일하고 여러분이 만들어서 실행해보시기 바랍니다.


그런데 두개의 숫자를 비교하는데 이미 있는 숫자를 비교하는건 의미 없다.. 키보드로 입력받아서 두개의 수에서 큰수를 출력해보자.



위의 코드는 python3 exam019.py 33 40과 같이 입력하면 큰수를 찾아서 출력하는 프로그램입니다. 만약 최초에 파라미터로 넘기지 않은경우는 첫번째 수를 입력하세요, 두번째 수를 입력하세요 메시지를 출력하고 숫자를 받아서 큰수를 출력하도록 하였습니다.


결과는 아래와 같이 출력됩니다.



5.1 지역변수

여러분의 정의한 함수 안에서 변수를 선언하고 사용할 경우, 함수 밖에 있는 이름의 변수들과 함수 안에 있는 변수들과는 서로 연관이 없습니다. 이러한 변수들을 함수의 지역(local)변수라고 하며, 그 범위를 변수의 스코프(scope)라고 부릅니다. 모든 변수들은 변수가 정의되는 시점에서의 블록을 스코프로 가지게 됩니다.


아래 프로그램에서 x = 50으로 할당 되었습니다.

바로 아래에서 출력한 결과는 50이었습니다. 이 변수를 func라는 함수에 매개변수로 넘겨주었습니다. 넘겨받은 함수에서 최초의 값은 50을 출력합니다. 이후 x = 20을 할당하고 출력하였습니다. 출력된 값은 20입니다.


마지막으로 함수를 빠져나온후에 x의 값을 출력하였습니다. 그런데 함수에서 20을 할당하였는데 50이 출력되는것을 확인할수 있습니다. 전역변수인 x 는 func의 함수에 매개변수로 전달되어 func내에서 지역변수로 사용되어진 것입니다. 그래서 값을 변경하여도 원래의 전역변수에서 값이 변경되지 않고 출력된 것입니다.



입력된 코드 소스입니다.



위 코드를 실행하면 위의 실행화면과 같이 원래의 50이 출력되는 것을 확인하였습니다.


그러면 func( x )에서 x를 매개변수로 전달하지 않고 사용하는 경우는 어떻게 되는지 확인해 보도록 하겠습니다.



우선 전역변수x에 50을 할당하였습니다.

func함수에서 x가 전역변수라를것을 알리기 위해 global x 로 정의 하였습니다.





출력결과를 보면 아래와 같이 전역변수값은 함수안에서 변경되어 함수 밖으로 나와서 변경된 값이 유지 되는 것을 확인할수 있습니다. 이러한 방법은 프로그래밍을 할때 프로그래머가 프로그래밍을 하기 편리하게도 하지만 소스를 아주 복잡하고 수정하기 어렵게 만들어 버리기도 합니다. 이러한 전역변수는 양날의 칼로 될수있으면 사용하지 않는것이 좋습니다.




이번에는 파이썬 함수를 이용하여 팩토리얼 값을 가져오는 함수를 만들어 보도록 하겠습니다.

위키백과에서는 팩토리얼을 다음과 같이 정의하고 있습니다. “수학에서, 자연수의 계승(階乘, 문화어: 차례곱, 영어: factorial 팩토리얼[*])은 1부터 그 수까지의 모든 자연수의 곱이다. 기호는 !이며, 팩토리얼, 줄여서 팩이라고 읽는다.”

팩토리얼 함수의 기능은 다음과 같습니다.

  1. 팩토리얼 함수에 정수를 파라미터로 넘긴다

  2. 팩토리얼 함수에 들어온 값이 정상적인 값인지 체크한다.

    1. 정수가 아닌경우 “정수를 입력하세요.” 메시지를 출력하고 0을 리턴한다.

    2. 0이거나 양수가 아닌경우 “0이 아닌 양수를 입력하세요.” 메시지를 출력하고 0을 리턴한다.

    3. 100이상의 수가 들어오는 경우 “100이하의 숫자를 입력하세요.” 메시지를 출력하고 0을 리턴한다.


위와같은 기능을 가지는 함수를 어떻게 만드는지 고민해 보기 바랍니다. 프로그래밍은 올바른 정답을 찾아가는 과정입니다. 정답이라는것이 한개 이기도 하고 여러개 이기도 하고 없기도 합니다. 이러한 문제를 풀면서 올바른 방향으로 나아가는지 생각해보고 자신이 가지고 있는 생각을 다른사람들과 나누면서 어떠한 방법이 옳은것인가 고민해보기 바랍니다.



함수의 기능 프로그램의 기능이 정해지면 해당 기능에 따라 프로그래밍을 하면된다. 복잡하지 않은경우는 해당 내용을 주석으로 적어놓고 프로그래밍을 하면 좀더 수월하게 작업할수가 있습니다.


여기서 보면 처음보는 try : except : 구문이 있습니다. 이것은 오류를 처리하기 위한 방법으로 이후 예외 처리 부분에서 자세히 다루게 될 것입니다.


천리길도 한걸음부터 라는 말이 있습니다. 우리가 나중에 작성하게될 프로그램은 대단히 어렵고 많은 양의 코드를 다루게 될 것이다. 하지만 그러한 코드도 아주 작은 코드부터 시작하였으며 작은 부분을 제대로 이해하지 못하는 경우는 커다란 프로그램을 만들수 없습니다.


위의 코드 부분에서 잘못설계된 점을 찾아보고 그 이유를 생각해 보는 시간을 가지도록 하겠습니다.

명확하게 잘못된 부분을 찾으면 다음과 같습니다. 범용적으로 사용하는 함수는 매개변수를 받아서 업무를 처리하고 처리된 정보를 리턴하거나 정보만 처리하고 오류가 있는경우 오류를 발생시키는 것이 좋습니다. 그런데 위의 프로그램은 함수내에서 매개변수를 가져오는 형태로 되어있어 이부분을 수정해서 처리해 보도록 하겠습니다.





아래는 수정된 팩토리얼 함수 있습니다.


함수를 제작할때는 고려해야할 사항이 많습니다. 범용적으로 사용해야하기 때문에 종속적이지 않도록 하는것이 중요합니다.


댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.