본문 바로가기
코드/python

파이썬 for문

by WeZZ 2012. 1. 3.

파이썬의 특징을 가장 잘 대변해주는 것이 바로 이 for문이다. for문은 매우 유용하고 사용할 때 문장 구조가 한눈에 들어오며 이것을 잘만 쓰면 프로그래밍이 즐겁기까지 하다.


for문의 기본구조

for 문의 기본적인 구조는 다음과 같다.

for 변수 in 리스트(또는 터플, 문자열):
    <수행할 문장1>
    <수행할 문장2>
    ...

리스트의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입해서 <수행할 문장1>, <수행할 문장2>,,,를 수행한다.


예제를 통해 for 알아보기

for문은 예제를 통해서 보는 것이 가장 알기 쉽다. 예제를 따라해 보도록 하자.


예 1) 전형적인 for문

>>> test_list = ['one', 'two', 'three'] 
>>> for i in test_list: 
...     print i 
... 
one 
two 
three

['one', 'two', 'three']라는 리스트의 첫 번째 요소인 'one'이 먼저 i변수에 대입된 후 print i라는 문장을 수행한다. 다음에 'two'라는 두 번째 요소가 i변수에 대입된 후 print i문장을 수행하고 리스트의 마지막 요소까지 이것을 반복한다.


for문의 쓰임새를 알기 위해서 다음을 가정해 보자.

“총 5명의 학생이 시험을 보았는데 시험점수가 60점이 넘으면 합격이고 그렇지 않으면 불합격이다. 합격인지 불합격인지에 대한 결과를 보여준다.”


우선 5명의 학생의 시험성적을 리스트로 표현 해 보았다.

mark = [90, 25, 67, 45, 80]

1번 학생은 90점이고 5번 학생은 80점이다.


이런 점수를 차례로 검사해서 합격했는지 불합격했는지에 대한 통보를 해주는 프로그램을 만들어 보자. 역시 에디터로 만들어 보자.

# marks1.py
marks = [90, 25, 67, 45, 80] 

number = 0 
for mark in marks: 
    number = number +1 
    if mark >= 60: 
        print "%d번 학생은 합격입니다." % number 
    else: 
        print "%d번 학생은 불합격입니다." % number

각각의 학생에게 번호를 붙이기 위해서 number라는 변수를 이용하였다. 점수 리스트인 marks에서 차례로 점수를 꺼내어 mark라는 변수에 대입하고 for안의 문장들을 수행하게 된다. 우선 for문이 한번씩 수행될 때마다 number는 1씩 증가하고 mark가 60이상이면 합격 메시지를 출력하고 60을 넘지 않으면 불합격 메시지를 출력한다.


for와 continue

while문에서 알아보았던 continue가 for문에서도 역시 동일하게 적용이 된다. 즉, for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다.


위의 예제를 그대로 이용해서 60점 이상인 사람에게는 축하 메시지를 보내고 나머지 사람에게는 아무런 메시지도 전하지 않는 프로그램을 만들어 보자.

# marks2.py 
marks = [90, 25, 67, 45, 80] 

number = 0 
for mark in marks: 
    number = number +1 
    if mark < 60: continue 
    print "%d번 학생 축하합니다. 합격입니다. " % number

점수가 60점 이하인 학생일 경우에는 mark < 60이 참이 되어 continue문이 수행된다. 따라서 축하 메시지를 출력하는 부분인 print문을 수행하지 않고 for문의 첫부분으로 돌아가게 된다.


for와 range함수

for문은 range라는 숫자 리스트를 자동으로 만들어 주는 함수와 함께 사용되는 경우가 많다. 다음은 range함수의 간단한 사용법이다.

>>> a = range(10) 
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

위에서 보는 것과 같이 range(10)은 0부터 9까지의 숫자 리스트를 만들어 준다.


시작 번호와 끝 번호를 지정하려면 다음과 같이 해야 한다. 끝 번호는 포함되지 않는다.

>>> a = range(1, 11) 
>>> a 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

위처럼 시작 숫자를 정해 줄 수도 있다.


for와 range를 이용하면 1부터 10까지 더하는 것을 다음과 같이 쉽게 구현할 수 있다.

예 ) 1부터 10까지의 합

>>> sum = 0 
>>> for i in range(1, 11): 
. . .     sum = sum + i 
. . . 
>>> print sum 
55

range(1, 11)은 위에서 보았듯이 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]이라는 리스트를 만들어 준다. 따라서 위의 예에서 i변수에 리스트의 숫자들이 하나씩 차례로 대입되면서 sum = sum + i라는 문장을 수행하게 되어 sum은 최종적으로 55가 되게 된다.


또한 우리가 앞서 살펴 보았던 60점 이상이면 합격인 예제도 range함수를 이용해서 적용시킬 수도 있다. 다음을 보자.

#marks3.py 
marks = [90, 25, 67, 45, 80] 

for number in range(len(marks)): 
    if marks[number] < 60: continue 
    print "%d번 학생 축하합니다. 합격입니다." % (number+1)

len이라는 함수가 처음 나왔는데 len함수는 리스트의 요소 개수를 돌려주는 함수이다. 따라서 위에서 len(marks)는 5가 될것이고 range(len(marks))는 range(5)가 될 것이다. 따라서 number변수에는 차례로 0부터 4까지의 숫자가 대입될 것이고 makrs[number]는 차례대로 90, 25, 67, 45, 80이라는 값을 갖게 될 것이다.


다양한 for문의 사용

>>> a = [(1,2), (3,4), (5,6)] 
>>> for (first, last) in a: 
. . .     print first + last 
. . . 
3 
7 
11

위의 예는 a리스트의 요소 값이 터플이기 때문에 각각의 요소들이 자동으로 (first, last)라는 변수에 대입되게 된다.


이것은 이미 살펴보았던 터플을 이용한 변수 값 대입방법과 매우 비슷한 경우이다.

>>> (first, last) = (1, 2)


for와 range를 이용한 구구단

for와 range함수를 이용하면 단 4줄만으로 구구단을 출력해 볼 수가 있다.

>>> for i in range(2,10): 
...     for j in range(1, 10): 
...         print i*j, 
...     print '\n' 
... 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81

위의 예를 보면 for가 두 번 사용되었다. range(2, 10)은 [2, 3, 4, 5, 6, 7, 8, 9]가 되고 각각의 숫자가 차례로 i에 대입된다. i가 처음 2일 때 for 문을 만나게 된다. range(1, 10)은 [1, 2, 3, 4, 5, 6, 7, 8, 9]가 되고 각각의 숫자는 j에 대입되고 그 다음 문장인 print i*j를 수행한다. 따라서 i가 2일 때 2*1, 2*2, 2*3, , , ,2*9 까지 차례로 수행되며 그 값을 출력하게 된다. 그 다음에는 i가 3일 때 역시 2일 때와 마찬가지로 수행될 것이고 i가 9일 때까지 계속 반복되게 된다.

위에서 print i*j, 처럼 print i*j뒤에 콤마(',')를 넣어준 이유는 해당 결과값을 출력할 때 다음 줄로 넘어가지 않고 그 줄에 계속해서 출력하기 위한 것이다. 이것은 잘 사용되지는 않지만 콤마 연산자라는 것이다. 그 다음의 print '\n'은 2단, 3단, , 등을 구분하기 위해서 두 번째 for문이 끝나면 결과 값을 다음 줄부터 출력하게 해주는 문장이다.


지금껏 우리는 프로그램의 흐름을 제어하는 if, while, for등에 대해서 알아보았다. 독자는 while과 for를 보면서 두 가지가 아주 흡사하다는 느낌을 받았을 것이다. 실제로 for문을 쓰는 부분을 while로 바꿀 수 있는 경우가 많고 while문을 쓴 부분을 for문으로 바꾸어서 사용할 수 있는 경우가 많다. 선택은 독자의 자유이다.