ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬의 반복문
    Python/study 2013. 12. 18. 02:20

    ※ 주의사항

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

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

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

     


    상세 분석


    이번에는 파이썬에서 반복문에 대한 내용을 알아보도록 하겠습니다.


    주로 for문과 range() 함수에 대해서 알아볼 것입니다. 파이썬의 문법이 대부분 그렇지만 for문은 사용해본 결과 특히 더 직관적으로 문법이 구성되어있습니다. C언어에서의 for문은 초기값, 조건, 증가값을 명시해주고, 이 요소들은 일반적으로 정수형을 사용해서 나타내었습니다. 


    파이썬에서도 정수형을 사용합니다. 하지만 그 방법이 조금 다릅니다. 다음 예제를 보도록 하겠습니다.



    정수 1 부터 10까지를 범위로 주어 2의 거듭제곱을 계산한 내용입니다. 그럼 문법을 살펴보도록 하겠습니다.

    파이썬에서는 초기값, 조건, 증가값을 이용해서 반복문을 사용하기도 합니다만 일단 그것은 뒤에서 보도록 하고 기본적으로 다음과 같은 형태를 가집니다.



    위 그림에서 볼 수 있듯이, 명시된 요소들의 묶음으로 부터 순차적으로 요소를 하나씩 추출해내 공간에 저장합니다. for문이 시작되면 요소1을 추출해내고 for문의 몸체에 속하는 명령들을 수행합니다. 명령 수행이 끝나면 다음 요소를 추출해내고 또 몸체의 명령을 수행합니다. 이런 방식으로 반복이 이루어지며, 더이상 추출할 요소가 없는 경우 반복문이 종료됩니다.


    말이 어렵지만 위의 예제를 조금씩 변형해서 몇번만 응용해보면 저절로 문법이 머릿속에서 이해가 될 것입니다. 한가지 더하자면 요소들의 묶음은 꼭 연속된 숫자를 나열한 필요는 없다는 것입니다. 예를 들어 [1,2,35,5,70,9,10,14] 와 같이 규칙적이지 않은 숫자들을 요소로 넘겨주어도 된다는 것입니다.


    정리 39) for문의 사용 : 파이썬의 for문에서는 요소의 묶음을 나타내고 그 요소들을 추출하며 명령을 반복합니다.


    다음 예제를 보도록 하겠습니다.



    똑같이 범위는 1부터 10까지입니다. 그리고 연산 결과도 마찬가지로 앞의 예제와 같습니다. 하지만 이번에는 묶음을 통해 요소들을 나타내지 않고 range()함수를 사용하였습니다. 위의 예제에서는 해당 함수의 인자로 초기값과 마지막값을 입력해주었습니다. 


    그런데 한가지 주의할 점이 있습니다.


     

    대괄호를 사용하여 요소들의 묶음을 직접 나타낼 때와는 다르게 range() 함수에 주어진 범위에서 마지막값은 숫자들의 묶음에서 제외가 됩니다. 저는 처음 사용할 때 이부분을 자주 잊어버려 똑같은 내용을 다시 반복하고 그랬습니다.

     

    이번에는 range() 함수의 사용 예를 살펴보도록 하겠습니다.


     

    네 가지 방법을 이용하여 range() 함수를 사용해보았습니다. 해당 함수의 인자는 최소 1개부터 최대 3개까지 입력할 수 있습니다. 위의 예제를 보면서 한 가지 알아두어야할 것이 있습니다. 바로 range() 함수를 사용한 결과입니다. 각각의 range() 함수를 사용한 결과를 저장한 공간들인 a, b, c, d의 내용을 출력해보면 모두 리스트의 형태를 띄고 있습니다.



    range() 함수의 인자는 순서대로 초기값, 마지막값, 증가값이 들어갑니다. 여기서 회색으로 처리된 초기값과 증가값은 생략될 수 있습니다. 다만 여기서 초기값만 생략하고 마지막값과 증가값만을 인자로 주면, 파이썬에서는 두 개의 인자를 초기값과 마지막값으로 인식하고 처리하기 때문에 원하는 결과를 볼 수 없습니다. 


    정리 40) range( (초기값), 마지막값, (증가값) ) : range() 함수에서 초기값, 증가값은 생략될 수 있고, 초기값부터 마지막값-1까지가 리스트에 저장됩니다.


    초기값을 생략하는 경우에는 초기값이 0으로 자동 설정됩니다. 그리고 증가값이 생략된 경우에는 자동으로 1씩 증가하는 것으로 설정됩니다. 그럼 이제 각 라인의 명령을 살펴보도록 하겠습니다.


    첫번재 라인에서는 a라는 공간에 저장할 리스트를 만드는 range() 함수에 인자가 1과 10으로 두개가 입력되었습니다. 이러한 경우에는 리스트에 초기값 1부터 마지막값-1 인 9까지의 숫자가 1씩 증가되면서 리스트에 저장됩니다.


    두번째 라인에서는 인자를 7이라는 숫자 하나만 주었습니다. 이것은 초기값과 증가값이 생략된 형태입니다. 따라서 공간 b에는 0부터 7-1인 6까지의 숫자가 1씩 증가되면서 리스트에 저장됩니다.

     

    세번째 라인에서는 인자를 0, -10, -1로 주었습니다. 각각 초기값 0, 마지막값 -10, 증가값 -1로 0부터 -9까지 1씩 숫자가 감소하면서 리스트에 저장됩니다.


    네번째 라인에서는 인자를 0, 10, 2로 주었습니다. 각각 초기값 0, 마지막값 10, 증가값 2로 0부터 2씩 증가하며 8까지 숫자가 리스트에 저장됩니다. 8 에서 증가값 2를 더한 숫자는 마지막값 10으로 리스트에는 마지막값-1 까지의 숫자가 들어갈 수 있기 때문에 10은 제외가 됩니다.


    각각에 대한 결과는 위의 그림에서 확인할 수 있습니다.


    그런데 ! range() 함수에는 한가지 문제점이 있습니다. 바로 그 결과라 리스트로 반환된다는 것입니다. 이것이 왜 문제가 될까요? 다음 예제를 보도록 하겠습니다.



    range() 함수를 이용하여 0부터 10000000000 이라는 큰 숫자까지의 요소가 담긴 묶음을 생성하려고 해보았습니다. 그 결과는 메모리 오류였습니다. range() 함수의 경우는 모든 요소를 하나의 리스트에 저장하기 때문에 큰 숫자범위를 사용하면 메모리를 초과하여 생성할 수가 없습니다. 


    이에 대한 방안으로 사용하는 함수가 xrange() 함수입니다. 해당 함수의 사용방법은 range() 함수와 같습니다. 하지만 한가지 큰 차이점이 있습니다. 바로 함수의 결과로 리스트가 아닌 객체를 전달한다는 것입니다.


     

    설명을 위해 그림을 그려보았습니다. 결과를 리스트로 반환하는 것과 객체로 반환하는 것은 아주 큰 차이점이 있습니다.

    range() 함수의 경우, 0부터 커다란 숫자를 마지막값으로 주었을 때 그 사이에 들어갈 많은 값들을 모두 리스트에 바로 저장합니다. 따라서 메모리 오류가 발생하여 생성조차 하지 못하는 것입니다. 


    반면에 결과를 객체로 반환하는 xrange() 함수의 경우에는 초기값, 마지막값, 증가값에 대한 정보만을 저장합니다. 따라서 메모리 오류가 발생하지 않고 객체가 정상적으로 생성됩니다. 그러면 그 사이에 값들은 어떻게 될까요? xrange() 함수를 이용하여 객체를 만들면 처음부터 리스트에 모든 값을 저장하는 range() 함수와는 다르게 해당 값이 필요할 때만 값을 생성합니다. 

    따라서 range() 함수를 이용했을 때와는 다르게 그렇게 큰 메모리 공간을 필요로하지 않는다는 것입니다.


    정리 41) xrange() 함수 : 사용법은 range()함수와 같지만, 리스트가 아닌 객체를 반환하며 요소를 필요로 할때만 값을 생성한다.


     

    위와 같이 range() 함수로는 생성에 실패한 큰 범위의 숫자를 주었을 때 xrange 객체가 생성되었고 특정 값을 찾을 수도 있습니다.


    이제 다시 for문으로 돌아와보도록 하겠습니다. 파이썬의 for문에서는 문자열을 가지고도 반복을 할 수 있습니다.

    이해가 안되시죠? 바로 예제를 보도록 하겠습니다.



    파이썬의 for문은 앞서 설명한 것처럼 기본적으로 요소들이 들어있는 묶음에서 값을 하나씩 추출하면서 반복을 수행합니다. 그리고 그 요소들이 숫자이든 문자이든 문자열이든 상관하지 않고 충실히 요소들을 하나씩 추출하는 기능을 합니다. 따라서 위의 예제와 같이 문자열에서 순차적으로 하나씩 문자를 추출하여 반복을 수행할 수도 있는 것입니다.


     

    또는 위와 같이 리스트나 사전, 그리고 파일로부터 요소들을 하나씩 추출하여 반복을 할 수도 있습니다. 다만, 파일의 경우에는 요소를 추출하는 단위가 한 라인입니다.


    이로써 파이썬에서의 반복문 for문을 사용하는 방법과 관련된 함수인 range() 함수, xrange() 함수에 대하여 알아보았습니다.


    정리모음

    정리 39) for문의 사용 : 파이썬의 for문에서는 요소의 묶음을 나타내고 그 요소들을 추출하며 명령을 반복합니다.
    정리 40) range( (초기값), 마지막값, (증가값) ) : range() 함수에서 초기값, 증가값은 생략될 수 있고, 초기값부터 마지막값-1까지가 리스트에 저장됩니다.
    정리 41) xrange() 함수 : 사용법은 range()함수와 같지만, 리스트가 아닌 객체를 반환하며 요소를 필요로 할때만 값을 생성한다.

    참고 URL 및 도서

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


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

    파이썬의 객체와 클래스  (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
    파이썬의 자료형 - 튜플  (0) 2013.12.18
Designed by Tistory.