ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 파이썬 입문 5(반복문, 함수, 생성기)
    CSE/Python 2015. 12. 18. 13:27

    1. 파이썬 입문

     1-1. 반복과 루프

      가장 널리 사용되는 루프 관련 구조물은 for문입니다. for문은 항목들의 모임에 대해 반복 수행하는데 사용됩니다. 반복은 파이썬에서 가장 풍부한 기능을 제공하는 기능 중 하나입니다. 가장 널리 사용되는 반복의 형태는 간단히 문자열, 리스트, 튜플같은 순서열의 모든 구성 요소에 대해 루프를 도는 것입니다. 다음은 한 예입니다.


    1
    2
    3
    for n in [123456789]:
        print "2 to the %d power is %d" % (n, 2**n)
     
    cs




      앞의 예에서, 변수 n에는 각 반복마다 리스트 [1,2,3,4,...,9]에 있는 다음 항목이 할당됩니다. 정수 범위에 대해 루프를 도는 일은 상당히 잦으므로 다음과 같이 간단히 작성할 수 있습니다.



    1
    2
    3
    for n in range(110):
        print "2 to the %d power is %d" % (n, 2**n)
     
    cs





      range(i, j[, 폭]) 함수는 i에서 j - 1 까지의 값을 가지는 정수 범위를 표현하는 객체를 생성합니다. 초기 값이 생략되면 초기 값으로 0이 사용됩니다. 추가로 세 번째 인수로 폭을 지정할 수 있습니다.



    1
    2
    3
    4
    5
    = range(5# a = 0, 1, 2, 3, 4
    = range(18# b = 1, 2,3, 4, 5, 6, 7
    = range(0143# c = 0, 3, 6, 9, 12
    = range(81-1# d = 8, 7, 6, 5, 4, 3, 2
     
    cs


     


      for 문은 정수 순서열뿐 아니라 문자열, 리스트, 사전, 파일 등 많은 종류의 객체들에 대해 반복 수행하는데 사용될 수 있습니다. 다음은 각 종류의 객체를 출력하는 예제입니다.





     * forExam.py


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    = "Hello Python"
     
    for c in a:
        print c
     
    = ["Jack""Sofie""Jolie""Park"]
     
    for name in b:
        print name
     
    = { 'Samsung'500.10'Apple'950.95'LG'10.0 }
     
    for key in c:
        print key, c[key]
     
     
    cs




     



      for문에 값들의 순서열을 제공하는 반복자 객체나 생성기 함수를 직접 만들 수 있기 때문에 for 루프는 파이썬에서 제공하는 가장 강력한 언어 기능 중 하나입니다.





     1-2. 함수

      다음 예처럼 함수는 def문을 사용해 생성합니다.


    1
    2
    3
    4
    def remainder(a,b):
        q = a // b  # //는 끝 수를 버리는 나누기
        r = a - q * b
        return r
    cs





      함수를 호출하려면 result = remainder(37, 15)처럼 함수 이름을 쓰고 이어서 인수들을 괄호로 둘러싸주면 됩니다. 함수는 단일 인자 뿐아니라 튜플을 사용해 여러 값을 반환할 수도 있습니다.


      함수 인수에 기본 값을 할당하려면 대입문을 사용하면 됩니다.



    1
    2
    def connect(hostname, port, timeout=300):
        # Function body
    cs




      함수 정의에 기본 값을 주어지면 이어지는 함수 호출에서 해당 값을 생략할 수 있습니다. 생략된 값은 기본 값을 가지게 됩니다.



    1
    2
    connect('palpit.tistory.com'8080)
     
    cs




      함수 안에 변수가 생성되거나 값이 대입되면 이 변수의 유효 범위는 지역 범위를 갖습니다.즉, 변수는 함수 몸체 안에서만 정의되고 함수가 반환되면 변수는 사라집니다. 함수 안에서 전역 변수의 값을 수정하려면 다음과 같이 global 문을 사용하면 됩니다.


    1
    2
    3
    4
    5
    6
    count = 0
    ...
     
    def sumCalc():
        global count
        count += 1
    cs






     1-3. 생성기(Generator)

      함수는 단일 값을 반환하는 대신, yield 문을 사용해 일련의 결과를 생성할 수도 있습니다. 다음은 한 예를 보여줍니다:


    1
    2
    3
    4
    5
    def countdown(n):
        print "Counting down"
        while n > 0:
            yield n
            n -= 1
    cs




      yield를 사용하는 함수를 생성기라고 부릅니다. 생성기 함수를 호출하면, next() 메서드(파이썬 3에서는 __next__())를 반복적으로 호출할 때 일련의 결과를 반호나하는 객체가 생성됩니다. 다음은 한 예입니다.









      next()호출하면 생성기 함수는 다음 yield 문에 도달할 때까지 실행됩니다. 이때, yield에 전달된 값이 next()에 의해 반환되고 생성기 함수는 실행이 잠시 중단됩니다.


      보통 앞에서 본 것처럼 next()를 직접 호출하는 일이 거의 없습니다. 대신 다음과 같이 for 루프를 연결시켜 사용합니다.



    1
    2
    for i in countdown(5):
        print i, 
    cs



     생성기는 처리 파이프라인, 스트림, 데이터 흐름에 기반한 프로그램을 작성할 때 강력한 위력을 발휘합니다. 예를 들어, 다음 생성기 함수는 로그 파일을 검토하는데 흔히 사용되는 유닉스의 tail -f 명령의 동작을 흉내냅니다. 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import time
    def tail(f):
        f.seek(02)
        while True:
            line = f.readline()
            if not line:
                time.sleep(0.1)
                continue
            yield line
     
    cs






      다음은 일련의 라인에서 특정 부분 문자열을 찾는 생성기입니다.



    1
    2
    3
    def grep(lines, searchtext):
        for line in lines:    
            if searchtext in line: yield line
    cs




      두 생성기를 연결시켜 간단한 처리 파이프라인 생성하는 예입니다.



    1
    2
    3
    4
    5
    6
    7
    8
     
    # 유닉스 "tail -f | grep python" 의 파이썬 구현
     
    wwwlog = tail(open("access-log"))
    pylines = grep(wwwlog, "python")
     
    for line in pylines:
        print line,
    cs





      생성기와 관련해서 알아두어야 할 것은 생성기는 보통 리스트나 파일 같은 다른 반복자 객체와 함께 섞일 수 있다는 점입니다. 특히, for item in s 같은 문장에서 s는 아이템 리스트, 파일의 줄들, 생성기 함수 결과 똔느 반복을 지원하는 어떤 객체든 될 수 있습니다. s에 어떤 객체든 올 수 있기 때문에 확장성 있는 프로그램 작성이 가능합니다. 



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



    댓글

Designed by Tistory.