ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 파이썬 입문 6(코루틴, 객체, 예외)
    CSE/Python 2015. 12. 18. 14:11

    1. 파이썬 입문

     1-1. 코루틴(Coroutine)

      보통 함수는 입력으로 주어진 인수에 대해서 한 번만 실행됩니다. 하지만, 일련의 입력을 처리하도록 함수를 작성할 수도 있습니다. 이런 종류의 함수를 코루틴이라고 하고, 아래 예처럼 yield문을 표현식 형태로 사용해 생성할 수 있습니다.



    1
    2
    3
    4
    5
    6
    def print_matches(matchtext):
        print "Looking for", matchtext
        while True:
            line = (yield)
            if matchtext in line:
                print line
    cs



      이 함수를 사용하려면 먼저 호출을 한 번해서 첫 번째(yield)까지 진행하고 다음부터 send()로 데이터를 보내기 시작하면 됩니다. 


     






      코루틴은 send()로 값이 도착할 때까지 멈춰 있습니다. send()가 호출되면, 코루틴 안에서 (yield) 포현식에 의해 값이 반환되고 바로 다음 문장에 의해 처리됩니다. 이러한 처리는 다음 (yield) 표현식을 만날 때까지 계소되고, 그 순간 멈춘 함수가 다시 멈춥니다.





     1-2. 객체와 클래스

      프로그램 안의 모든 값은 객체입니다. 객체(Object)는 내부 데이터와 내부 데이터와 연관된 연산을 수행하는 메서드로 구성됩니다. 앞서 이미 문자열과 리스트 같은 내장 타입을 다루면서 객체와 메서드를 사용해봤습니다.


      dir() 함수는 객체가 제공하는 메서드들을 나열합니다. 이 함수는 대화식으로 이것저것 실험해보는데 유용하게 쓰입니다.







      객체를 살펴볼때 append()나 insert() 같은 익숙한 메서드들을 보게 될 것입니다. 이 밖에도 항상 이중 밑줄로 시작하고 끝나는 특수한 메서드들이 있습니다. 이 메서드들은 언어상에서 제공하는 다양한 연산자를 구현합니다. 다음 예에서 __add__() 메서드는 + 연산자를 구현합니다.







      class문은 새로운 객체 타입을 정의하며, 객체지향 프로그램을 작성하는데 쓰입니다. 예를 들어, 다음 클래스는 push(), pop(), length() 연산자를 갖는 간단한 스택을 정의합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Stack(object):
        def __init__(self):
            self.stack = []
        def push(self, object):
            self.stack.append(object)
        def pop(self):
            return self.stack.pop()
        def length(self):
            return len(self.stack)
     
    cs





      클래스는 다음과 같이 사용합니다.







      앞의 예에서 스택을 구현하기 위해 완전히 새로운 객체를 생성했습니다. 하지만, 스택은 내장 리스트 객체와 거의 동일합니다. 따라서, 다음과 같이 list에서 상속 받고 메서드를 하나 추가해서 스택을 구현할 수도 있습니다.



    1
    2
    3
    class Stack(list):
        def push(self, object):
            self.append(object)
    cs





      보통 클래스 안에서 정의된 모든 메서드는 클래스의 인스턴스에만 적용됩니다. 하지만, C++이나 Java 에서의 정적 메서드같은 다른 종류의 메서드로 정의할 수 있습니다.



    1
    2
    3
    4
    5
    6
    7
    class EventHandler(object):
        @staticmethod
        def dispatcherThread():
            while (1):
                ...
     
    EventHandler.dispatcherThread()
    cs






     1-3. 예외

      프로그램에서 에러가 발생하면 예외(Excepion)가 발생하고 다음과 같이 역추적 메시지가 나타납니다.



    1
    2
    3
    Traceback (most recent call last):
     File "foo.py", line 12in <module>
    IOError: [Errno 2] No such file or directory: 'file.txt'
    cs


      


      역추적 메시지는 발생된 에러의 종류와 위치를 표시합니다. 보통 에러는 프로그램을 종료시킵니다. 하지만, 다음과 같이 try와 except 문으로 예외를 잡아서 처리할 수도 있습니다.



    1
    2
    3
    4
    try:
        f = open("file.txt""r")
    except IOError as e:
        print e
    cs




      IOError가 발생하면, 에러의 원인에 대한 내용이 e에 담기고 except 블록으로 제어가 넘어갑니다. 또다른 예외가 발생하면 에워싼 코드 블록으로 제어가 넘어갑니다. 아무런 에러도 발생하지 않으면 except 블록에 있는 코드는 무시됩니다. 예외가 처리되면 최종 except 블록 바로 뒤이어 나오는 문장부터 프로그램 실행이 다시 시작됩니다. 






     1-4. 모듈(Module)

      프로그램 크기가 커지면 손쉬운 관리를 위해 프로그램을 여러 파일로 나누고 싶어질 것입니다. 파이썬에서는 정의들을 파일에 넣어 다른 프로그램이나 스크립트에 임포트(import) 할 수 있는 모듈 형태로 사용할 수 있습니다. 모듈을 생성하려면 관련 문장과 정의들을 모듈과 동일한 이름을 가지는 파일에 넣으면 됩니다(파일 확장자는 py여야 합니다). 




    1
    2
    3
    4
    5
    6
    # file: div.py
    def divide(a, b):
        q = a / b
        r = a - q * b
        return (q, r)
     
    cs





      이 모듈을 다른 프로그램에서 사용하려면 import 문을 사용하면 됩니다.



    1
    2
    import div
    a, b = div.divide(230529)
    cs



      import 문은 새로운 네임스페이스를 생성하고 .py 파일 안에 있는 모든 문장을 이 네임스페이스 안에서 실행합니다. 해당 네임스페이스 안에 있는 내용에 접근하려면 앞의 예의 div.divide() 처럼 간단히 모듈의 이름을 앞에 붙여주면 됩니다.


      모듈을 다른 이름으로 임포트하고 싶다면 다음과 같이 import 문에 선택적인 as 한정어를 써주면 됩니다.


    1
    2
    3
    import div as dd
    a, b = dd.divide(230529)
     
    cs




      특정 정의를 현재 네임스페이스에 임포트하려면 from 문을 사용하면 됩니다.


    1
    2
    from div import divide
    a, b = divide(230529)
    cs


     





    * 이 강좌는 '파이썬 완벽 가이드' 서적을 참고로 작성했습니다.




    댓글

Designed by Tistory.