파이썬(Python) 기초 - for문

170825

이번 시간에는 for문에 대해 알아보자.


for문

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

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

리스트나 튜플, 문자열의 첫 번째 요소부터 마지막 요소까지 차례로 변수에 대입되어 아래 문장들이 수행되는 것이다. 아래도 마찬가지.

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

위 문장처럼 a 리스트의 요소값이 튜플이기 때문에 각각 요소들이 자동으로 (first, last)라는 변수에 대입된다. 튜플을 이용한 변수값 대입 방법과 비슷한 경우다.

for문의 응용에 대해 살펴보자. “총 5명의 학생이 시험을 보았는데 시험 점수가 60점이 넘으면 합격이고 그렇지 않으면 불합격이다. 합격인지 불합격인지 결과를 보여라.” 이 문장을 사용해서 리스트로 표현해 보자.

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)

위 프로그램을 실행하면 mark가 60 이상일 때 합격 메시지를 출력하고, 60을 넘지 않을 때 불합격 메시지를 출력한다.

while문에서 사용했던 continue를 for문에서도 사용할 수 있다. 즉, for문 안의 문장을 수행하는 도중에 continue문을 만나면 for문의 처음으로 돌아가게 된다. 위 프로그램에 continue문을 넣어서 다시 작성해 보자.

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라는 함수와 함께 사용된다.

>>> a = range(10)
>>> a
range(0, 10)

range(10)은 0부터 10 미안의 숫자를 포함하는 range 객체를 만들어 준다. 시작과 끝 숫자를 지정하려면 range(시작 숫자, 끝 숫자) 형태를 사용하는데, 이 때 끝 숫자는 포함되지 않는다.

>>> a = range(1, 11)
>>> a
range(1, 11)

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

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

range(1, 11)은 숫자 1부터 10까지(1 이상 11 미만)의 숫자를 데이터로 갖는 객체다. 위의 예를 보면 i 변수에 리스트의 숫자들이 1부터 10까지 하나씩 차례로 대입되면서 sum = sum + i라는 문장을 반복적으로 수행하고 sum은 최종적으로 55가 된다.

사실, 앞서 작성한 프로그램도 range 함수를 이용해서 바꿀 수 있다.

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

여기서 len이라는 함수는 리스트 내 요소의 개수를 돌려주는 함수다. range(len(marks))는 range(5)와 같고, number 변수에는 차례로 0부터 4까지의 숫자가 대입된다.

구구단도 for와 range로 구현할 수 있다.

>>> for i in range(2,10):
...     for j in range(1, 10):
...         print(i*j, end=" ")
...     print('')
...
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

입력 인수 end를 넣은 이유는 해당 결과값을 출력할 때 다음 줄로 넘어가지 않고, 그 줄에 계속해서 출력하기 위해 사용한다. 그 다음에 이어지는 print( )는 2단, 3단 등을 구분하기 위해 두 번째 for문이 끝나면 결과값을 다음 줄부터 출력하게 해 준다.

리스트 안에 for문을 포함하는 리스트 내포(List Comprehension)를 이용하면 좀 더 편리하게 작성할 수 있다.

>>> a = [1, 2, 3, 4]
>>> result = []
>>> for num in a:
...     result.append(num*3)
...
>>> print(result)
[3, 6, 9, 12]

위 예제는 a라는 리스트의 각 항목에 3을 곱한 결과를 result라는 리스트에 담는 예제다. 그러면 아래와 같이 작성할 수 있다.

>>> result = [num * 3 for num in a]
>>> print(result)
[3, 6, 9, 12]

만약에 짝수에만 3을 곱하여 담고 싶다면 다음과 같이 “if 조건”을 사용할 수 있다.

>>> result = [num * 3 for num in a if num % 2 == 0]
>>> print(result)
[6, 12]

리스트 내포의 문법은 다음과 같다. “if 조건” 부분은 앞의 예쩨에서 볼 수 있듯이 생략할 수 있다.

[표현식 for 항목1 in 반복가능객체1 if 조건1
        for 항목2 in 반복가능객체2 if 조건2
        ...
        for 항목n in 반복가능객체n if 조건n]

예를 들면, 구구단의 모든 결과를 리스트에 담고 싶을 때 리스트 내포를 이용하여 구현할 수 있다.

>>> result = [x*y for x in range(2, 10)
                  for y in range(1, 10)]
>>> print(result)
[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]

실제로 프로그램의 흐름을 제어할 때 쓰는 if문, while문, for문은 서로 바꾸어서 사용 가능하다. for문을 사용한 부분을 while문으로, while문을 for문으로 바꿀 수 있다.