Media Log

1. 반복문(Loop)


오늘은 반복문(Loop)이라는 것에 대해 알아보도록 하겠습니다. 반복문, 쉽게 생각하면 이름 그대로 반복에 사용되는 녀석입니다. 파이썬에서 지원하는 반복문에는 조건문이 참인가 거짓인가에 따라 반복을 진행하는 while문이라는 것이 존재하고, 리스트나 튜플같은 순서형 자료의 아이템을 하나씩 가져오면서 반복을 수행하는 for문이 존재합니다. 이 두가지에 대해서 간단히 알아볼 계획인데, 이런 반복문을 통해서 비슷한 작업을 수없이도 반복하는걸 이 반복문을 통해서 간단히 해결할 수 있습니다. 먼저 while문에 대해서 먼저 알아보도록 하겠습니다.


2. while문


앞에서 소개한대로 while문은 조건식을 가지는 녀석입니다. 조건식이 참이라면 while문 내부에 있는 블록의 문장을 실행하고, 거짓이면 반복을 멈추고 빠져나옵니다. 우선은 while문의 형태를 먼저 보도록 합시다.

while 조건식:
	문장

위를 보시면 while 다음에 조건식이 오며, 조건식 뒤에는 콜론(:)이 따라붙는다는 것을 알 수 있습니다. 우선은 while문의 간단한 예제를 보도록 합시다.

>>> i = 1
>>> while i <= 10:
	print(i, "번 출력되었습니다.")
	i += 1

1 번 출력되었습니다.
2 번 출력되었습니다.
3 번 출력되었습니다.
4 번 출력되었습니다.
5 번 출력되었습니다.
6 번 출력되었습니다.
7 번 출력되었습니다.
8 번 출력되었습니다.
9 번 출력되었습니다.
10 번 출력되었습니다.

위의 예제를 보시면 조건식에 'i <= 10'이 왔음을 보실 수가 있습니다. 이는 변수 i의 값이 10보다 작거나 같은 경우에 참이 성립되며, 10보다 큰 경우는 거짓에 해당합니다. 그리고 'i += 1'과 같은 코드는 i의 값을 1만큼 증가시키는 'i = i + 1'를 축약한 코드로, 반복문을 빠져나오도록 하기 위해 작성된 코드입니다. 만약에 while문의 조건식이 처음부터 거짓이면 내부 블록에 있는 문장이 단 한번이라도 실행되지 않습니다. 왜냐하면, while문의 실행 순서는 '조건식을 검사 -> 내부 블록에 있는 문장을 실행 -> 조건식을 검사 -> ...'이러한 순서를 따르기 때문입니다.

위의 while문을 순서도로 나타내면 위와 같을 것입니다. i가 10보다 커지는 순간 거짓으로 넘어가서 반복문을 빠져나와 버립니다. 이해가 되셨나요? 만약에 'i = i + 1'과 같은 구문이 없다면, 조건식은 항상 참으로 성립하게 되어 반복문을 빠져나올수 없을 것입니다. 이렇게 되면 무한 루프에 빠지게 되는데, 무한 루프란 말 그대로 무한히 반복한다는 것입니다. 이런 상황을 피하기 위해서 i의 값을 증가시켜 주는 것입니다.


2-1. break문


이번에는 break문의 설명을 위해 위의 예제를 약간 수정해보도록 하겠습니다.

>>> i = 1
>>> while i <= 10:
	if i == 7:
		break
	print(i, "번 출력되었습니다.")
	i += 1

1 번 출력되었습니다.
2 번 출력되었습니다.
3 번 출력되었습니다.
4 번 출력되었습니다.
5 번 출력되었습니다.
6 번 출력되었습니다.

저기 사용된 break문이 어떤 녀석이냐면, 이 문법을 통해 반복문은 조건식이 거짓이여야 반복을 멈추고 빠져나오는데 우리가 직접 반복문을 강제로 탈출하게 할 수 있습니다. 위 예제의 경우는 i가 10보다 커져야 반복을 빠져나오지만, 저기서는 i가 7일 경우에 break문을 만나 바로 반복문을 빠져나오게 됩니다. 간단하죠?


2-2. continue문


이번에는 continue문의 설명을 위해 위의 예제를 다시 한번 수정해보도록 하겠습니다.

>>> i = 0
>>> while i <= 10:
	i += 1
	if i % 2 == 1: continue
	print(i, "번 출력되었습니다.")

2 번 출력되었습니다.
4 번 출력되었습니다.
6 번 출력되었습니다.
8 번 출력되었습니다.
10 번 출력되었습니다.

예제에 사용된 continue문을 만나면, continue문 아래의 문장은 실행하지 않고 반복문의 시작 지점으로 되돌아갑니다. 즉, 반복문의 조건을 검사하는 부분으로 다시 되돌아간다는 말입니다. 직접 코드를 따라가보면, i의 값이 처음에 0이고 반복문 내에서 i가 1이 증가하고 i를 2로 나누어 나머지가 1인지 검사를 하는 코드가 존재합니다. 만약 i를 2로 나눈 뒤의 나머지가 1이면 이것은 홀수라는 의미가 되며, 홀수는 continue문을 만나게 됩니다.


출력된 결과를 보시면 알겠지만, 홀수가 제외되어서 출력되었음을 확인하실 수 있습니다. 홀수는 continue문을 만나 시작 지점으로 되돌아가고 i의 값이 증가하기 때문에 그렇습니다. 반대로 짝수라면 continue문을 만나지 않고, 그 아래의 문장을 계속 수행해나가는 모습을 보실 수 있습니다.


3. for문


마지막으로 for문에 대해서 알아보도록 하겠습니다. 이 for문은 처음에 소개했던대로 튜플, 리스트, 사전, 문자열 등과 같은 순서형 자료가 올 수 있습니다. 우선은 for문의 형태를 보고나서 다시 for문에 대해 알아보도록 하겠습니다.

for 변수 in 순서형 자료:
	문장

이 for문은 순서형 자료(리스트, 튜플 등)의 요소를 하나하나씩 가져와서 변수에 넣습니다. 우선 리스트를 가지고 for문을 이용한 예제를 보도록 하겠습니다.

>>> lst = [1, 3, 5, 7, 9]
>>> for i in lst:
	print(i)
	
1
3
5
7
9

위 예제를 보시면, 리스트 lst의 요소를 하나하나씩 가져와 변수 i에 넣어서 i의 값을 출력하고 있음을 보실 수 있습니다. 그리고 또한 for문에도 역시 break문과 continue문을 사용하실 수 있습니다.

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> for i in lst:
	if i % 2 == 1: continue
	if i == 6: break
	print(i, "번 출력되었습니다.")

2 번 출력되었습니다.
4 번 출력되었습니다.

위 예제의 for문 내부 블록을 보시면, i를 2로 나눈 뒤의 나머지가 1인 경우에 시작 지점으로 돌아가고 i가 6과 같으면 반복문을 탈출하게끔 작성해 두었습니다. 1, 3, 5는 첫번째 조건문에 의해 시작 지점으로 돌아가 출력이 되지 않은것이며, 6부터는 두번째 조건문을 만나 반복문을 탈출하여 이후의 문장이 수행되지 않는 것입니다.


3-1. range 함수


여기서 range 함수를 for문에 이용할 수 있는데, range 함수는 숫자의 범위를 가지는 range 객체를 돌려보내며 이를 통하여 for문 내에서 위치를 가지고 요소를 가져오거나 변경할 수 있습니다. 한번 보도록 합시다.

>>> for i in range(10):
	print(i, end=" ")

0 1 2 3 4 5 6 7 8 9 

위 예제에서는 range(10)이 0에서부터 9까지의 범위를 지니는 range 객체를 만들어내며, 이 객체를 가지고 순차적으로 접근하여 값이 i에 담긴 뒤, 저장된 i의 값을 print문으로 출력하는 것입니다. 이를 리스트에서 응용하게 되면 아래의 예제와 같이 사용할 수 있을 것입니다.

>>> lst = [1, 2, 3, 4, 5]
>>> for i in range(len(lst)):
	if i % 2 == 0:
		lst[i] *= 2
	else:
		lst[i] *= -2
	print(lst[i], end=" ")

2 -4 6 -8 10 

위의 예제를 보시면, len 함수를 통해 리스트 lst의 요소 수를 구하고 이 요소 수를 통해 range 함수를 호출하여 요소 수 만큼 반복하게 됩니다. for문의 내부 블록을 보시면 i를 2로 나눈 나머지가 0인 경우, 즉 짝수인 경우에는 i번째 요소의 값에 2를 곱한 값을 저장하고, 홀수인 경우에는 i번째 요소의 값에 -2를 곱한 값을 저장합니다. 결과를 보시면 "2 -4 6 -8 10"과 같은 결과를 보실 수 있습니다. 위의 예제에서는 0~4의 범위를 지닌 range 객체를 만들어 낸것이라고 보면 됩니다. 이해가 잘 되지 않는다면 위 예제를 응용하여 한가지 예를 더 만들어보시면 range 함수가 어떤 녀석인지 이해를 하실 수 있을것 같습니다.


3-2. 반복문의 중첩


반복문의 중첩이란, 반복문 내에 반복문이 들어가는 것으로써 for문 내에 while문이 들어갈수도 있으며, while문 내에 while문이 들어갈 수 있는 등 여러 개의 반복문이 중첩되어 사용될 수 있습니다. 예를 들면, 반복문 중첩을 통해 구구단을 모두 출력할 수 있습니다.

>>> while i <= 9:
	j = 1
	while j <= 9:
		print(i, " * ", j, " = ", i * j)
		j += 1
	i += 1

2  *  1  =  2
2  *  2  =  4
...
9  *  8  =  72
9  *  9  =  81

위처럼 while문을 사용할 수 있으나, 아래처럼 for문을 사용할 수도 있습니다.

>>> for i in range(2, 10):
	for j in range(1, 10):
		print(i, " * ", j, " = ", i * j)

2  *  1  =  2
2  *  2  =  4
...
9  *  8  =  72
9  *  9  =  81

참고로 이렇게 두번만 중첩되는게 아니라 여러번 중첩될 수 있다는 사실을 기억해두시기 바랍니다.

저작자 표시 비영리 변경 금지
신고
  1. 이전 댓글 더보기
  2. M at 2014.02.07 06:52 신고 [edit/del]

    처음에 i=0을 대입하지 않아서 좀 헤맷네요. 감사합니다

    Reply
  3. M at 2014.02.07 07:10 신고 [edit/del]

    >>> lst=[1,2,3,4,5]
    >>> for i in range(len(lst)):
    if i % 2 == 0:
    lst[i] *= 2
    else:
    lst[i] *= -2
    print(lst[i], end="")


    -4-8

    왜 이럴까요?

    Reply
  4. 왕간 at 2014.02.17 16:14 신고 [edit/del]

    3-2. 반복문의 중첩 while문 에서 어려움이 있어 질문드립니다.

    while i <= 9:
    j = 1
    while j <= 9:
    print(i, " * ", j, " = ", i * j)
    j += 1
    i += 1

    문에서 i가 1이면 <=9 가 참이되어 j 가 1로 초기화되고
    그 다음 while 문에서 1*1 을 출력하고 j 에 1을 더해 2로 만들고
    그 다음으로 i 에 1을 더해 i 을 2를 만든다 까지는 이해가 되는데

    i 가 2로 설정되면 어쨋든 <=9 조건을 만족시키니 그 밑에
    j = 1 이라는 조건을 실행시키지 않나요? 그러면 2엿던 j 가 1로 다시 초기화 되야되는거 아닌가요?

    이부분에서 헷갈려서 질문드려봅니다. 필력이 낮아 자세히 설명드리기가 힘드네요 ㅠ

    Reply
  5. 왕간 at 2014.02.17 17:02 신고 [edit/del]

    답변 안해주셔도 될것같습니다 ㅎ ^^

    구구단의 형식을 이해하지 못하여 생긴 잘못이네요

    언제나 블로그 잘보고 매일매일 강좌 꾸준히 듣고있습니다.

    감사합니다

    Reply
  6. 아스 at 2014.02.21 09:57 신고 [edit/del]

    먼저 강의 잘보고 있습니다. 감사드립니다.
    제가 for문을 사용했는데 정상적으로 반복이 되긴 합니다만, for문이 다 끝나고 나서 메시지를 띄우게 하고 싶거든요

    제가 사용한게 for x in range(len(self.listx)) 이 문 입니다. self.listx는 리스트변수고요.

    혹시 for문이 끝났을때 생기는 어떤 이벤트 같은게 있는지요. 아님 반복이 완료되었다는 것을 캐치할수 있는 방법이 있는지 궁금합니다.


    Reply
  7. BlogIcon blackeric at 2014.03.23 22:45 신고 [edit/del]

    궁금한게 있는데 제가 이해가 안되서;;
    if i==2:
    에서 왜 =이 2개가 붙는지

    Reply
    • BlogIcon EXYNOA at 2014.03.27 20:19 신고 [edit/del]

      파이썬 개발자가 좌항과 우항의 값을 서로 비교할때 '=='란 기호를 쓰자고 사전에 약속한 것이나 다름이 없습니다. ==는 파이썬에서 비교 연산자의 기능을 지닙니다. 연산자 편을 다시 봐주세요.

  8. at 2014.06.01 20:34 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.06.01 23:55 신고 [edit/del]

      >>> lst = [1, 2, 3, 4]
      >>> for i in range(len(lst)):
      if i % 2 == 1:
      lst[i] *= 2
      else:
      lst[i] *= -2
      print(lst[i], end="")

      rage -> range로 고쳤습니다. 한번 실행해보세요.

  9. qweq at 2014.07.05 16:24 신고 [edit/del]

    >>> lst = [1,2,3,4,5]
    >>> for i in range(len(lst)):
    if i % 2 == 0:
    lst[i] *= 2
    else:
    lst[i] *= -2
    print(lst[i], end=" ")

    SyntaxError: invalid syntax

    이거 머가 잘못된걸까요 ..
    결과가 안나오고 에러가 나오네요

    Reply
  10. pds at 2014.07.29 02:31 신고 [edit/del]

    반복문에서
    >>> lst = [1, 2, 3, 4, 5]
    >>> for i in range(len(lst)):
        if i % 2 == 0:
            lst[i] *= 2
        else:
            lst[i] *= -2
        print(lst[i], end=" ")
    하고 결과갑을 보면 위에 있듯이..
    5개의 값이 안나오고..
    2개의 값만 나오는데..뭐가 문제인지요..
    분명 똑같이 기입을 했는데 말이죠..ㅠㅠ

    Reply
  11. ESC at 2014.07.31 11:09 신고 [edit/del]

    for문이나 while문을 이용해서 리스트 안에 i값을 저장 할떄에는 어떻게 해야 하나요?
    예를 들어

    i = 0
    lst = []
    for i in range(10):
    lst = i
    >>> lst
    4
    이게 아니라
    >>> lst
    [0, 1, 2, 3, 4]
    이렇게 하려면 어떻게 해야 하나요?





    Reply
  12. at 2014.08.30 06:45 [edit/del]

    비밀댓글입니다

    Reply
  13. 문경호 at 2014.10.18 17:39 신고 [edit/del]

    +=과 <=, == 은 각각 무슨 뜻인가요

    Reply
  14. 허재영 at 2014.11.25 10:16 신고 [edit/del]

    항상 머리에 쏙쏙들어오는 강의에 매번 감탄하고
    감사하게 생각하며 잘 보고 배우고 있습니다.

    3-1 range 함수 두번째 예제 에서
    짝수에는 "2"를, 홀수에는 "-2"를 곱해준다면
    결과값이 -2, 4, -6, 8, -10 이 나와야되는게 맞지않나요?

    제가 이해를 잘 못하는건지...

    아, 그리고 마지막 부분에서
    print(lst[i], end=" ") 여기서 "=" 부분이 오류가 나네요
    뭔가 잘못된건지 짚어주시면 정말 감사하겠습니다..

    Reply
    • Osami at 2014.12.02 21:15 신고 [edit/del]

      >>>len(lst) 해 보시면 5 라고 나올겁니다.
      즉 1,2,3,4,5 숫자 값을 말하는 것 같아요
      그래서 1부터 대입해서 나머지를 구했을 때 -2를 곱하게 되어 첫 자리가 -2 4 ~~이런식으로 값이 출력되는 것 같습니다.. 어디까지나 제 추측

      그리고 마지막 부분 end 부분 오류는 end=0 으로 초기화 한번 해보고 다시 시도해보세요 저는 그렇게 수행했습니다 ㅎㅎ 도움이 되셨으면 좋겠네요

  15. 영혼별 at 2014.12.22 15:39 신고 [edit/del]

    양질의 강의 잘 보고 있습니다:)

    강의 보다가 궁금한게 생겼는데요,

    "*=" 연산자가 정확히 궁금해서 리스트를 가지고 따로 계산해봤더니,

    lst=[1,2,3,4,5]
    lst[i] *= 2
    print(lst)
    [1,2,3,4,10]

    이런 식으로 맨 마지막 값에만 2가 곱해져서 나옵니다.

    원래 이런 기능을 하는 연산자인지, 아니면 제가 이해 못하는 부분이 있는건지 모르겠네요ㅜㅜ

    Reply
    • BlogIcon EXYNOA at 2014.12.22 17:52 신고 [edit/del]

      안녕하세요 ^ㅡ^* 영혼별님이 올려주신 코드는 변수 i의 값이 4이기 때문에 최종적으로 lst[4]의 값이 2배되어 저장되는것 같습니다!

      정상적인 코드는 아래와 같습니다.
      >>> lst = [1, 2, 3, 4, 5]
      >>> for i in range(len(lst)):
      lst[i] *= 2
      >>> print(lst)
      [2, 8, 6, 16, 20]

  16. 열공 at 2015.02.13 15:21 신고 [edit/del]

    range() 함수에 대해서 궁금한 점이 있어서 올립니다.

    처음 range함수에 대해서 예제가 나왔을 때 range(10)을 반복문으로 출력 했을 때 0 ~ 9까지 총 10개가 출력 되었는데요

    중첩문 썼을 때는 range(2, 10)이라고 할 때는 어떻게 2부터 시작을 하는 것인가요?? range의 범위 계산이 정확히 어떤 기준으로 되어있는 건가요??

    Reply
    • 형준파파 at 2015.02.20 00:31 신고 [edit/del]

      저도 파이썬을 공부하는 입장이라 자세히는 말씀 드릴수 없지만
      range함수의 문법을 보면,
      range(i, j,[보폭]) 함수는 i에서 j-1까지의 값을 가지는 정수 범위를 표현하는 객체를 생성한다. 초기값이 생략되면 초기값으로 0이 사용된다.
      즉, 이 말을 다시 살펴보시면,
      현재 액시노아님의 본문 예제에 쓰인 range(10)의 엄밀한 표현은
      range(0, 10, 1)이라는 거 아닐까 합니다.
      이해 되셨는지... :)
      예를 들어보면 for i in range(10) 나 for i in range(0, 10, 1)이나 결과값은 같다는 거죠.

  17. ㅂㄷㅈㅂㄷ at 2015.06.03 16:07 신고 [edit/del]

    저기 질문하나할게요
    예로 들어
    a = 1
    while a <= 10:
    print(a)
    i = i + 1
    이나
    a =1
    while a <= 10:
    print(a)
    i += 1
    차이가 멀까여 답은같은대

    Reply
  18. ㅂㄷㅈㅂㄷ at 2015.06.03 16:12 신고 [edit/del]

    아그러고 또 0은 짝수가 아니여서 포함되지 않나여

    Reply
    • ㅎㄴㅇㅎㅁㄴ at 2015.06.12 15:05 신고 [edit/del]

      0은 짝수라고 약속해져 있습니다

    • 슬픈단잠 at 2015.06.23 14:52 신고 [edit/del]

      0은 짝수도 홀수도 아닙니다. ㅎㄴㅇㅎㅁㄴ님.
      0이 짝수라고 약속이 되어 있다기 보다는...

      짝수를 판단할 때에 주로... 2로 나눈 나머지 값이 0인지 보도록만 해두었기에 0이 짝수로 판단될 뿐이지.

      0이 짝수라는 약속은 어디에도 없습니다. 정말 제대로 할 거라면..

      if( n % 2 == 0 && n != 0 )

      과 같이 처리를 해야 합니다.

    • dsfㄱ at 2016.05.31 20:12 신고 [edit/del]

      0은 짝수로 결론이 났습니다

  19. swyshy at 2017.01.15 16:45 신고 [edit/del]

    프로그램 입력시에 줄바꾸기는 어떻게 하나요? 엔터는 입력완료라 사용할수도 없고.. 그리고 위에 예제로 쓰신 while 구문 그대로 따라서 쳐봤는데 오류가 뜹니다....

    Reply
  20. M at 2017.02.21 17:49 신고 [edit/del]

    3-1 Range 함수 내용을 그대로 쳐보았습니다. 왜 결과가 다를까요?

    >>> for i in range(10):
    ... print(i, end=" ")
    File "<stdin>", line 2
    print(i, end=" ")
    ^
    SyntaxError: invalid syntax
    >>>

    Reply
  21. at 2017.07.16 18:02 [edit/del]

    비밀댓글입니다

    Reply

submit

티스토리 툴바