ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬의 제네레이터(추가)
    Python/study 2013. 12. 18. 02:47

    ※ 주의사항

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

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

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

     

    이번에는 앞에서 보여드리지 못한 파이썬의 제네레이터(생성기) 응용 예제를 소개하도록 하겠습니다.


    어떤 예제를 들까 고민하다가 마침 적당한 소재가 생겨서 사용하기로 하였습니다. 그 소재는 얼마전 동아리원의 소개로 알게된 사이트인 pythonchallenge.com 이라는 사이트에 나온 문제 중 하나입니다. 사이트에 대한 설명은 하지 않도록 하고 바로 예제를 만들기 위한 소재를 보도록 하겠습니다.



    그 소재는 바로 위의 그림에 나타난 특수문자들입니다. 총 97545 개의 문자들이 나열되어 있습니다. 그리고 그 안에는 무엇인지도 모르고 몇 개나 있을지도 모르는 알파벳이 포함되어있습니다. 우리는 이제 저 수많은 특수문자들 사이에 숨어있는 알파벳을 찾아내도록 할 것입니다. Ctrl + F를 하면 안되냐구요? 그럼 뭐하러 이거 쓰고 있겠습니까 ㅎㅎ 당연히 파이썬을 이용해서 찾아보도록 할 것입니다. 그것도 우리가 배운 생성기를 사용해서 말입니다. 

     

    바로 다음 그림이 생성기를 이용해 작성한 소스코드입니다. 


     

    위의 소스코드는 크게 생성기를 선언하는 부분과 사용하는 부분으로 나뉩니다. 먼저 생성기에 대하여 설명하도록 하겠습니다.


    def grep(lines):


    생성기의 이름은 grep입니다. 파라미터로 lines라는 공간을 받는데, 이 파라미터는 앞서 보았던 문자들이 저장되어있는 텍스트 파일과 연결된 파일 객체가 들어가게 됩니다. 즉, lines라는 공간은 위에서 보았던 모든 문자들이 저장된 파일이라고 생각하면됩니다.


    for line in lines:


    생성기 내부에 첫 번째로 등장하는 for문은 파일로부터 한 라인만큼의 문자들을 추출해냅니다. lines에 해당하는 파일로부터 추출해낸 문자 한 라인은 line이라는 이름의 공간에 저장됩니다. 첫 번째 for문이 반복할 때마다 텍스트 파일에 저장된 문자들이 한줄씩 추출되는 것입니다. 


    for c in line:

    characters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']


    두 번째로 등장하는 for문은 추출한 한 라인만큼의 문자들이 저장된 line으로부터 순차적으로 한 문자씩을 추출해냅니다. 추출된 문자는 c라는 공간에 저장이됩니다. 해당 for문 내에서는 c 라는 공간에 저장한 하나의 문자를 characters라는 리스트에 있는 알파벳과 비교를 합니다. 


    if c in characters:

    yield c


    c라는 공간으로 추출해낸 문자가 특수문자가 아닌 알파벳에 해당된다면, if 문의 조건에 부합하게되고 이어서 if 문 내에있는 yield문에 의해 생성기는 작업을 일시정지하고 해당 문자를 리턴합니다. 만약 추출한 문자가 알파벳이 아닌 특수문자라면 다음 문자를 추출합니다.여기까지가 생성기가 하는 일입니다. 생성기가 선언된 아래쪽에는 생성기가 동작할 수 있도록 for문을 이용하여 작성한 명령입니다. 


    f = open("strings.txt", "r")


    먼저 생성기에 파라미터로 줄 파일객체를 생성합니다. 여기서 strings.txt라는 파일은 맨 처음에 보았던 문자들이 저장되어있는 텍스트 파일입니다. 이때 'r' 옵션을 주어 읽기모드로 파일 객체를 생성하였습니다. 


    list = []


    for c in grep(f):

    list.append(c)


    이어서 생성기에서 반환되는 문자들을 저장하기위해서 비어있는 리스트를 만듭니다. 그리고 for문을 이용하여 생성기를 동작합니다. 생성기에서 알파벳이 추출되어 반환될 때마다 해당 for문에서 정의된 c라는 공간에 저장되고 리스트에 반환된 값을 추가합니다. 결과적으로 리스트에는 strings.txt 파일에서 추출된 알파벳들이 순차적으로 저장이됩니다.


    print " ".join(list)


    마지막으로 strings.txt 파일로부터 추출된 문자들이 순차적으로 저장된 리스트를 문자열 형태로 출력합니다.


     

    위의 그림은 해당 소스코드를 저장한 스크립트를 실행한 결과입니다. 맨 처음에 보았던 문자들 중에서 알파벳에 해당하는 문자들을 추출하여 출력한 결과 "equality"라는 문자열이 만들어졌습니다.

     

    이렇게 생성기를 이용하여 텍스트 파일로부터 원하는 문자들을 추출해내는 예제를 살펴보았습니다.

     

     

    참고 URL 및 도서

    http://www.pythonchallenge.com/pc/def/ocr.html

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

    파이썬의 모듈  (0) 2013.12.18
    파이썬의 예외처리  (0) 2013.12.18
    파이썬의 객체와 클래스  (0) 2013.12.18
    파이썬의 코루틴  (2) 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.