ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬의 함수
    Python/study 2013. 12. 18. 02:32

    ※ 주의사항

    아래 공격 코드는 연구 목적으로 작성된 것이며, 허가 받지 않은 공간에서는 테스트를 절대 금지합니다.

    악의 적인 목적으로 이용할 시 발생할 수 있는 법적 책임은 자신한테 있습니다. 이는 해당 글을 열람할 때 동의하였다는 것을 의미합니다.

    해당 문서의 저작권은 해당 저자에게 모두 있습니다. 다른 용도로 사용할 시 법적 조치가 가해질 수 있습니다.

     


    상세 분석


    이번에는 파이썬의 함수에 대하여 알아보도록 하겠습니다.


    사실 뭐 그렇게 장황하게 설명할 것도 없습니다. 선언 방법과 사용방법이 아주 단순하기 때문입니다.



    함수는 위와 같은 방법으로 정의합니다. 함수를 선언하겠다는 의미의 def 와 함수명, 함수에 사용할 인자, 함수의 몸체로 구성됩니다. 아주 간단하죠? 바로 예제를 보도록 하겠습니다.



    위의 예제는 두개의 인자를 가지고 덧셈을 하고난 결과를 반환하는 함수를 선언한 것입니다. 사용방법은 C언어에서 함수를 사용하는 방법과 동일합니다. 설명하기도 뭐하네요..


    정리 42) def adder(a,b): : 함수를 선언하는 방법은 def 함수명(사용할 인자): 그리고 몸체를 작성하는 것입니다.


    그런데 기존에 C언어에서는 함수의 결과로 반환될 리턴값을 하나만 지정할 수 있었습니다. 물론 구조체를 사용하는 등의 우회적인 방법으로 두개 이상의 값을 반환할수도 있지만, 공식적으로 return문을 사용할때는 한개의 값만 줄수 있다는 한계가 있었습니다. 그러나 파이썬에서는 C언어에서 구조체를 사용하여 여러 값을 반환한 것보다 훨씬 간단하게 여러 값을 반환할 수가 있습니다. 어떻게 할까요? 다음 예제를 보도록 하겠습니다.


     

    (quotient, remainder)와 같은 형태를 이전에 본적이 있지 않습니까? 바로 튜플입니다. 튜플은 하나의 객체로 그 안에 여러개의 값을 가질 수가 있습니다. 이전에 설명할때에도 C언어의 구조체에 빗대어 설명을 하였습니다. "그럼 결국 구조체가 아니냐?" 라고 할 수도 있습니다. 하지만, 구조체보다는 훨씬 간단하게 사용할 수 있습니다. 

     

    위의 예제를 보면 아시겠지만, 나누기 연산에서 몫을 나타내는 공간인 quotient와 나머지를 나타내는 remainder라는 각각의 공간은 서로 연관되지 않은 별개의 공간입니다. 하지만 함수의 끝에서 결과를 반환할때 튜플 객체를 생성하고 그 인자로 quotient와 remainder라고 명시된 공간을 넣어주었습니다. 즉, 별개인 공간들을 리턴할 때에 튜플이라는 객체 하나로 묶어준 것입니다.

     

    그러므로 결국 반환되는 값은 튜플 객체 하나이지만, 그 안에는 여러가지 값들이 들어갈 수 있는 것입니다. 함수의 바로 아래에서 실제 함수를 사용하는 것을 보면, 동시에 q와 r이라는 명시된 공간에 튜플에 들어있는 값을 순차적으로 저장하였습니다. 이처럼 튜플을 이용해 반환한 다수의 값들을 저장하는 것 또한 아주 간단합니다.


    정리 43) return (quotient, remainder) : 튜플을 이용하면 다수의 결과값을 반환할 수 있습니다.


    다음은 함수를 선언할 때, 특정 인자값에 기본값을 설정하는 방법입니다.



    위의 예제는 앞의 예제와 비슷합니다. 하지만 다른 부분이 하나 있습니다. 어떤 것인지 혹시 눈치 채셨습니까?

    바로 함수를 선언할때 사용할 인자를 작성하면서 특정 인자에 값을 저장하였습니다. 이 부분이 바로 기본값을 설정하는 부분입니다. 기본값은 함수를 사용하면서 특정 인자에 대한 값이 같은 값이 자주 쓰이는 경우에 사용할 수 있습니다. 


    위와 같이 함수를 사용할 때 기본값이 설정된 인자를 생략하면 자동으로 해당 인자의 값이 기본값으로 주어집니다. 쉽게 말해서 사용자가 "이 값은 기본값이니까 생략할께~" 하면 파이썬에서 알아서 값을 넣어주는 것입니다. 기본값을 사용하면 함수의 사용이 더욱 유연하고 편해집니다.


    정리 44) def divider(a, b=7): : 함수를 선언할 때 인자에 값을 지정해주면, 기본값으로 설정되어 함수 사용시 해당 인자를 생략하면 기본값으로 설정된 값이 자동으로 인자로 주어집니다.


    마지막으로 함수 외부에 존재하는 명시된 공간을 함수내에서 호출하여 사용하는 방법에 대하여 알아보겠습니다.


    기본적으로 함수를 선언하면서, 함수의 내부에서 생성되거나 값이 입력되는 명시된 공간들은 C언어에서의 지역변수의 개념과 같습니다. 즉, 함수의 내부에서만 정의되어 사용을 하다가 함수가 종료되고 반환되면 사라지는 것입니다.


    그렇다면 함수를 만들때에는 반드시 함수안에서 생성된 공간에 대해서만 값을 저장하고 수정할 수 있을까요?

    결론부터 말하면 그렇지 않습니다. 이번에 소개할 global문을 사용하면 함수 외부에 있는 전역변수를 불러와 사용할 수 있습니다. 다음 예제를 보도록 하겠습니다.



    위의 예제에서는 sub_add()라는 함수를 선언하고 사용하였습니다. 

    해당 함수는 먼저 a와 b라는 두 값을 인자로 받습니다. 그리고 그 값들을 더하여 함수 내부에서 생성된 공간인 c에 저장을 합니다. 이어 함수 외부에서 생성된 공간 sum을 global문을 이용하여 함수 내부로 호출합니다. (이 부분에서 함수 외부에서 생성된 공간을 함수 내부로 가져오는 것입니다.) 


    이어서, c에 저장된 값을 함수 외부 공간인 sum에 더합니다. 마지막으로 c의 값을 반환하고 함수는 종료됩니다. 

    이때, 함수 내부에서 생성된 공간 a,b,c는 사라집니다. 하지만 sum이라는 공간은 함수 외부에서 선언된 공간이기 때문에 함수 종료 여부에 관계없이 계속 존재합니다.

     

    위 그림에서 함수를 선언한 다음 부분을 보면 3과 5라는 인자를 주어 함수 sub_add()를 실행하였습니다. 그 결과를 sub_sum 이라는 공간에 저장하도록 하였구요. 함수 내부의 동작에 따르면 3과 5가 더해진 8이라는 값이 반환되고 함수 외부공간인 sum의 값에 더해졌을 것입니다. 예상대로라면 sub_sum과 sum에 각각 8이라는 값이 저장되어 있을 것입니다.


    바로 다음 명령으로 sub_sum의 값과 sum의 값을 출력해보았습니다. 예상대로 8이라는 값이 각각의 공간에 저장되어 있는 것을 확인할 수 있습니다. 이어서 해당 함수를 한번 더 사용해보았습니다. 이번에는 반환되는 값을 따로 다른 공간에 저장하지는 않았습니다. 인자로 4와 2를 주었으므로 연산 결과는 6일 것이고 해당 값은 함수 외부 공간인 sum의 값에 더해졌을 것입니다. 


    함수를 사용하고나서 sum의 값을 한번 더 출력해본 결과 값이 14로 이전의 함수 사용에서 더해진 8이라는 값에 방금 함수 사용의 결과인 6이라는 값이 더해졌다는 것을 확인할 수 있습니다. global문을 이용하여 함수 외부에 있는 공간을 함수 내부로 호출할 수 있다는 것이 확실해진 것입니다.


    정리 45) global문 : global 문을 사용하면 함수 외부에 명시된 공간을 함수 내부에서 접근할 수 있습니다.

     

    정리모음

    정리 42) def adder(a,b): : 함수를 선언하는 방법은 def 함수명(사용할 인자): 그리고 몸체를 작성하는 것입니다.
    정리 43) return (quotient, remainder) : 튜플을 이용하면 다수의 결과값을 반환할 수 있습니다.

    정리 44) def divider(a, b=7): : 함수를 선언할 때 인자에 값을 지정해주면, 기본값으로 설정되어 함수 사용시 해당 인자를 생략하면 기본값으로 설정된 값이 자동으로 인자로 주어집니다.

    정리 45) global문 : global 문을 사용하면 함수 외부에 명시된 공간을 함수 내부에서 접근할 수 있습니다.

     

     

    참고 URL 및 도서

    - 파이썬 완벽 가이드, 데이비드 M. 비즐리 저, 2012년, 인사이트 펴냄

    'Python > study' 카테고리의 다른 글

    파이썬의 예외처리  (0) 2013.12.18
    파이썬의 객체와 클래스  (0) 2013.12.18
    파이썬의 코루틴  (2) 2013.12.18
    파이썬의 제네레이터(추가)  (0) 2013.12.18
    파이썬의 제네레이터와 이더레이터  (8) 2013.12.18
    파이썬의 반복문  (0) 2013.12.18
    파이썬의 파일 입출력  (0) 2013.12.18
    파이썬의 조건문  (0) 2013.12.18
    파이썬의 자료형 - 사전  (0) 2013.12.18
    파이썬의 자료형 - 집합  (0) 2013.12.18
Designed by Tistory.