16.2 for와 range 응용하기

'10.1 리스트 만들기'에서 range에 시작하는 숫자와 끝나는 숫자를 지정하거나, 증가폭을 지정하는 방법을 배웠죠? 이번에는 range의 다양한 기능을 활용하여 for 반복문을 사용해보겠습니다.

16.2.1  시작하는 숫자와 끝나는 숫자 지정하기

range에 횟수만 지정하면 숫자가 0부터 시작하지만, 다음과 같이 시작하는 숫자와 끝나는 숫자를 지정해서 반복할 수도 있습니다.

  • for 변수 in range(시작, 끝):
>>> for i in range(5, 12):    # 5부터 11까지 반복
...     print('Hello, world!', i)
...
Hello, world! 5
Hello, world! 6
Hello, world! 7
Hello, world! 8
Hello, world! 9
Hello, world! 10
Hello, world! 11

5부터 11까지 출력되었죠? for i in range(5, 12):와 같이 지정하면 5부터 11까지 5, 6, 7, 8, 9, 10, 11이 나오고 7번 반복합니다. 즉, 마지막 숫자는 range의 끝나는 숫자보다 1이 작습니다(끝나는 숫자는 생성된 숫자에 포함되지 않음).

16.2.2  증가폭 사용하기

range는 증가폭을 지정해서 해당 값만큼 숫자를 증가시킬 수 있죠? 이번에는 0부터 9까지의 숫자 중에서 짝수만 출력해보겠습니다.

  • for 변수 in range(시작, 끝, 증가폭):
>>> for i in range(0, 10, 2):    # 0부터 8까지 2씩 증가
...     print('Hello, world!', i)
...
Hello, world! 0
Hello, world! 2
Hello, world! 4
Hello, world! 6
Hello, world! 8

for i in range(0, 10, 2):와 같이 range에 0, 10, 2를 넣으면 0부터 8까지 2씩 증가합니다. 따라서 숫자는 0, 2, 4, 6, 8이 나오고 5번 반복하죠. 여기서는 증가폭이 2이므로 8 다음에는 10이 나와야 하지만, range에 끝나는 숫자를 10으로 지정했으므로 10은 포함되지 않고 8에서 멈춥니다.

16.2.3  숫자를 감소시키기

forrange는 숫자가 증가하면서 반복했습니다. 그럼 숫자를 감소시킬 수는 없을까요?

>>> for i in range(10, 0):    # range(10, 0)은 동작하지 않음
...     print('Hello, world!', i)
...

range(10, 0)과 같이 시작하는 숫자를 큰 숫자로 지정하고 끝나는 숫자를 작은 숫자로 지정하면 숫자가 감소할 것 같은데, 실행을 해보면 아무것도 출력되지 않습니다. 왜냐하면 range는 숫자가 증가하는 기본 값이 양수 1이기 때문입니다.

'10.1 리스트 만들기'에서 range에 증가폭을 음수로 지정하면 숫자가 감소한다고 했죠? 다음과 같이 증가폭을 음수로 지정해서 반복해봅니다.

>>> for i in range(10, 0, -1):    # 10에서 1까지 1씩 감소
...     print('Hello, world!', i)
...
Hello, world! 10
Hello, world! 9
Hello, world! 8
... (생략)
Hello, world! 2
Hello, world! 1

range(10, 0, -1)은 10부터 1까지 -1씩 증가하는 숫자를 생성합니다. 따라서 10부터 1까지 1씩 감소하면서 반복합니다. 특히 range의 끝나는 숫자 0은 생성되는 숫자에 포함되지 않으므로 1까지만 감소합니다. range는 그냥 증가, 감소에 상관없이 끝나는 숫자는 생성되는 숫자에 포함되지 않는다는 점만 기억하면 됩니다.

증가폭을 음수로 지정하는 방법 말고도 reversed를 사용하면 숫자의 순서를 반대로 뒤집을 수 있습니다.

  • for 변수 in reversed(range(횟수))
  • for 변수 in reversed(range(시작, 끝))
  • for 변수 in reversed(range(시작, 끝, 증가폭))
>>> for i in reversed(range(10)):    # range에 reversed를 사용하여 숫자의 순서를 반대로 뒤집음
...     print('Hello, world!', i)    # 9부터 0까지 10번 반복
...
Hello, world! 9
Hello, world! 8
Hello, world! 7
... (생략)
Hello, world! 1
Hello, world! 0

range(10)으로 0부터 9까지 숫자를 생성한 뒤 reversed를 사용하여 숫자의 순서를 반대로 뒤집었습니다. 따라서 9부터 0까지 10번 반복합니다.

참고 | 반복문의 변수 i를 변경할 수 있을까?

다음과 같이 forrange로 반복하면서 변수 i를 변경하면 어떻게 될까요?

>>> for i in range(10):
...     print(i, end=' ')
...     i = 10 
...
0 1 2 3 4 5 6 7 8 9

반복할 코드에서 변수 i에 10을 할당하여 10이 출력될 것 같은데, 0부터 9까지 출력되었습니다. 왜냐하면 변수 i는 반복할 때마다 다음 값으로 덮어써지기 때문에 값을 할당해도 변수에 영향을 주지 못합니다.

16.2.4  입력한 횟수대로 반복하기

이번에는 입력한 횟수대로 반복을 해보겠습니다. 다음 내용을 IDLE의 소스 코드 편집 창에 입력하세요.

for_range_input.py

count = int(input('반복할 횟수를 입력하세요: '))
 
for i in range(count):
    print('Hello, world!', i)

소스 코드를 실행하면 '반복할 횟수를 입력하세요: '가 출력됩니다. 여기서 3을 입력하고 엔터 키를 누르세요.

실행 결과

반복할 횟수를 입력하세요: 3 (입력)
Hello, world! 0
Hello, world! 1
Hello, world! 2

3을 입력했으므로 'Hello, world!'가 3번 출력됩니다.

먼저 input으로 입력 값을 받아서 count 변수에 저장합니다(이때 반드시 int를 사용하여 input에서 나온 문자열을 정수로 변환해줍니다). 그리고 반복문에서는 for i in range(count):와 같이 rangecount를 넣어주면 입력받은 숫자만큼 반복됩니다.