이번 시간에는 for in문에 많이 써먹는 range에 대해 알아보겠습니다. range는 공식 문서에 따르면 sequence 입니다. 그리고 이터레이터를 제공하는, 불변 객체입니다.

 


그래서 어떻게 써야 하는지 알아봐야 겠습니다. 예제 5개를 보도록 하겠습니다.

 

 먼저 1번째 예제입니다. range(5)만 있습니다. 이것은 끝만 있습니다. 문서에 따르면 stop만 있습니다. 그리고 start가 없는데요. 이 경우에는 시작이 0이다라는 것이 생략되어 있습니다. default가 0인 셈입니다. 그리고 스텝 수 default 값은 1입니다. 이에 대한 설명은 밑에서 이야기 하겠습니다.

 

 

 실행 결과는 0, 1, 2, 3, 4가 나옵니다. 끝 원소인 5가 포함되지 않았다는 것이 중요합니다. 그리고 1씩 증가했다는 사실도 중요한데요. 이는 스텝과 관련이 있습니다. 보통, 저는 n회 반복할 때, for i in range(n) 이런 식으로 많이 씁니다. 혹은 테스트 케이스가 T개일 때, for tc in range(T) 이렇게 쓰거나요. 생각보다 많이 쓰니 알아두면 좋을 듯 싶습니다.

 

 

 그런데, start를 명시하는 경우가 있습니다. 예를 들어, 예제 2의 경우에는, start가 1임을 명시했습니다. end는 똑같이 5입니다. 이 경우에는 1부터 2, 3, 4까지 돈다는 의미입니다. 실행 결과를 보겠습니다.

 

 

 1, 2, 3, 4 순으로 출력됨을 알 수 있습니다.

 

 

 3개의 인자를 주는 경우도 있는데요. 마지막 인자는 step 수를 의미합니다. 위 코드는 1번 for 루프를 돌 때 마다 스텝이 2만큼 증가하는데요. 아래 코드의 결과를 보고 이야기 하는 게 빠르겠네요.

 

 

 1, 3 순으로 출력이 되는데요. 처음에 1에서 시작하였습니다. 그리고 루프가 하나 돌면, 기존에는 2가 되었습니다. default step이 1이기 때문입니다. 그래서 1+1의 값인 2가 다음 루프를 수행할 때 나왔습니다. 그런데, 3번째 예제는 스텝이 2였습니다. 그러므로, 첫 번째 루프에서 1이였던 것이, 2번째 루프를 돌면서, 1+2인 3이 되어 버린 것입니다. 실제로, 이건 에라스토스 테네스의 체를 구현할 때 많이 써먹을 수 있기도 합니다.

 

 

 3번째 줄은 2부터 sz까지 for loop를 돕니다. 여기서 f[i]가 1인 경우에 continue를 하는데요. 소수가 아닌 경우에는 굳이, 더 볼 필요가 없기 때문입니다. i가 소수인 경우에, i가 아닌 2*i부터, 3*i, 4*i, ... 를 지우게 되는데요. step이 i입니다. 시작하는 수는 2*i이고요. sz+1보다 작을 때 까지 돌면 되므로, end에 sz+1을 넣습니다. 6번째 줄을 보면 됩니다.

 

 그러면, 소수가 아닌 것들은 1로 채워질 겁니다.

 

 

 소수인 것들만 출력하려면 2부터 보았을 때, f[i]가 0인 것만 출력하면 됩니다. 스텝 수를 주는 것도 생각보다 많이 쓰니, 알아두면 좋습니다.

 


 반대로 음수인 경우에는 어떨까요? 이 경우에는 거꾸로 가게 됩니다. 위의 경우는, 5부터 출발하는데, 0은 포함하지 않습니다.

 

 

 실행 결과를 보면, 5에서 출발했습니다. 그리고 1씩 감소하면서 4, 3, 2, 1 이렇게 내려가는데요. 0은 출력되지 않았음을 알 수 있습니다. 이는 0이 end 값이기 때문입니다.

 

 

 -1보다 절대값이 큰 음수면 어떨까요? 이 경우에는 2씩 감소합니다.

 

 

 5에서 출발해서 2씩 감소하면 5, 3, 1, -1 이렇게 갈 겁니다. 여기서, 끝 값인 0보다 큰 경우는 5, 3, 1입니다. 따라서, 5, 3, 1만 출력됩니다. 음수인 경우에는 거꾸로 가는구나. 정도만 아셔도 슬라이싱을 보다 수월하게 이해하실 듯 싶습니다.