for 의 사용법과 목록, 그리고 range
while과 같이 작업을 반복하는데 for을 자주 씁니다. while은 if와 같이 그 다음에 오는 True/False 결과를 내는 부분을 잘 이해해야 하는 반면, for를 사용하려면 목록을 만드는 것을 잘 알아야합니다. 영어로 list라고 부르는 목록은 ‘뭔가를 일정한 순서로 적은 것’을 의미합니다. 파이썬에서 목록을 만들려면 다음과 같은 간단한 규칙을 따라야합니다.
전제 목록을 대괄호 [와 ]로 묶어야 합니다.
대괄호 안에 뭔가를 순서대로 적을때 각각의 사이에 쉼표 ,를 써야합니다.
예를 들어 숫자 1, 2, 3으로 목록을 만들려면
[1, 2, 3]
이라고 쓰면 됩니다. 보기 좋게 하기위해 쉼표 다음에 공백을 넣었습니다.
텍스트 목록도 만들 수 있습니다. 각각의 텍스트는 작은 따옴표나 큰 따옴표로 묶어야합니다. 예를 들면
['physics', 'chemistry', 'mathematics']
또는
["apple", "grapes", "banana"]
와 같이 쓸 수 있습니다.
숫자와 텍스트를 섞어서 목록을 만들 수도 있습니다.
["James", 3.14, 125, "홍길동"]
이렇게 만든 목록을 for를 사용할 때 씁니다. 쓰는 형식은 다음과 같습니다.
for n in [1,2,3,4,5] : print(n)
for 다음에는 변수(저장장소), in, 목록을 공백과 함께 차례로 쓰고 :를 쳐주면 됩니다.
다음 줄 부터 들여쓴 줄을 목록에 있는 값들의 갯수만큼 반복해 실행합니다. 반복해서 실행할때마다 미리 변수 n에는 목록안에 있는 값이 순서대로 저장됩니다. 위의 코드를 jupyter notebook에 쓰고 Shit-Enter를 쳐서 실행하면 다음과 같은 결과를 출력합니다.
1 2 3 4 5
아래의 코드처럼 숫자와 텍스트가 섞여 있는 목록을 사용해도 됩니다.
for n in ['apple', 'peach', 3, '짜장면', '짬뽕'] : print(n)
위의 코드를 실행하면 결과는 아래와 같이 나옵니다.
apple peach 3 짜장면 짬뽕
목록에 숫자가 일정한 순서와 간격으로 있는 경우라면, 일일히 모든 값 하나 하나를 입력해 목록을 만들 필요가 없습니다. range라는 좋은 함수가 있기 때문입니다.
[1, 2, 3] 은 range(1, 4)로 쓸 수 있습니다. 먼저 아래와 같이 jupyter notebook에 쓴 다음 Shift-Enter를 눌러보죠.
range(1,4)
python 2.x버전에서는 range 함수가 만드는 목록을 출력하지만, python 3.x에서는 range(1,4)을 그대로 출력합니다. python 3.x 에서는 range함수는 for를 사용할때가 되서야 실제 목록을 만들기 때문입니다. 바로 목록을 만들려면, 아래와 같이 쓰고 Shift-Enter를 누르면 됩니다.
list(range(1,4))
그러면 다음과 같은 목록을 출력합니다.
[1, 2, 3]
시작하는 숫자는 1로 서로 같은 것 같은데, 두번째에 쓴 숫자는 왜 3이 아니고 4를 썼냐고 질문할 수 있습니다. range 라는 함수의 규칙이 원래 그렇습니다. 3대신 3보다 하나 더 큰 4를 씁니다. 상황에 따라 더 작은 숫자를 써야하기도 해서 규칙이 좀 헷갈릴 수 있습니다.
이왕 하는김에 좀 더 구체적으로 range 함수를 사용하는 방법을 알아보겠습니다.
range 안에 원래는 3개의 숫자를 씁니다. range(1,4,1)이라고 쓰면 1부터 시작해서 1씩 더해가면서 4에 못미칠때까지 목록을 만듭니다. 따라서 [1, 2, 3]이란 목록이 만들어집니다. 만약에 range(0,10, 3)이라고 쓰면,0부터 시작해서 3씩 더해가면서 10에 못미칠때까지 목록을 만듭니다. [0, 3, 6, 9]라는 목록을 만듭니다.
세번째 숫자에 0보다 작은 수가 올 수도 있습니다. range(5, 0, -1)라고 쓰면, [5, 4, 3, 2, 1]라는 목록을 만듭니다. 1이 맨 마지막인 이유는 5에서 -1만큼 줄여나가다가 0에 미치기 전까지만 목록을 만들기때문입니다. 헷갈리기 쉬운 부분입니다.
만약에 range안에 숫자가 2개만 있다면, 생략된 세번째 숫자가 1이다고 가정합니다. 따라서 range(0, 5)는 range(0, 5, 1)과 같아서, [0, 1, 2, 3, 4]라는 목록을 만듭니다.
만약에 range안에 숫자가 1개만 있다면, 3개의 숫자를 쓸때를 기준으로 보면 그 수자는 두번째 자리에 있어야 할 숫자입니다. 그리고 첫번째에 있는 숫자는 0이라고 가정한거고, 세번쨰 숫자는 1이라고 가정한겁니다. 만약에 range(5)라고 쓰면 range(0, 5, 1)과 같다고 보면 됩니다.
그러면 다음 네가지 코드를 치면 어떤값을 출력할지 미리 생각해보고 jupyter notebook에서 확인해 보시기 바랍니다. 다 맞췄으면 잘 이해하신 거고, 그렇지 못하면 이 글을 한번 더 읽어 보면 되겠습니다.
for n in range(2, 6, 1) : print(n)
for n in range(8, 2, -2) : print(n)
for n in range(3, 7) : print(n)
for n in range(4) : print(n)