파이썬 기초 강좌 #15 for 문 (for loop)

11 분 소요

오늘의 강좌에서는 for문에 대해서 공부하도록 하겠습니다.

파이썬의 for 문은 데이터의 컬랙션을 순차적으로 처리하기 위해서 사용되는 구문입니다. While 반복문과 비슷한 기능을 가지고 있지만 대부분의 경우에 while 반복문 보다 더 편리하게 사용되는 반복문입니다. 모든 시퀀스 타입의 오브젝트는 for 문에서 사용할 수 있습니다. For 문에서 사용 가능한 오브젝트인지 아닌지는 iter 함수를 사용하여 확인 할 수 있습니다. For문에서 사용할 수 있는 스퀀스 타입의 오브젝트로는 문자열, 리스트, 딕셔너리, 튜플, 세트, range 오브젝트가 있습니다.

For 문에서 사용 가능한 시퀀스 타입 오브젝트

  • String
  • List
  • Dictionary
  • Tuple
  • Set
  • Range

For 문에서 사용할 수 없는 오브젝트로는 시퀀스 타입이 아닌, integer, float, boolean, None, function 오브젝트 등이 있습니다.

For 문에서 사용할 수 없는 오브젝트

  • Integer
  • Float
  • Boolean
  • None
  • Function

앞에서 iter 함수를 사용하여 for문에서 사용할 수 있는 오브젝트인지 아닌지를 구분할 수 있다고 설명 드렸습니다. 어떤 오브젝트를 iter 함수의 인수로 전달하여 실행하였을때 iterator 오브젝트가 리턴되면 for문에서 사용할 수 있는 오브젝트이고, 타입 에러가 발생하면 for 문에서 사용할 수 없는 오브젝트입니다.

For 문에서 사용할 수 있는 오브젝트를 iter 함수를 사용하여 확인해 보겠습니다.

# for 문에서 사용할 수 있는 오브젝트
my_string = 'abc'
my_list = [1, 2, 3]
my_dict = {'a': 1, 'b': 2}
my_set = {'a', 'b', 'c'}
my_range = range(10)
 
print('String: {}'.format(iter(my_string)))
print('List: {}'.format(iter(my_list)))
print('Dictionary: {}'.format(iter(my_dict)))
print('Set: {}'.format(iter(my_set)))
print('Range: {}'.format(iter(my_range)))
String: <str_iterator object at 0x000001F326934BB0>
List: <list_iterator object at 0x000001F3247614F0>
Dictionary: <dict_keyiterator object at 0x000001F3274E0860>
Set: <set_iterator object at 0x000001F3274EFC00>
Range: <range_iterator object at 0x000001F326908D10>

For 문에서 사용할 수 있는 오브젝트를 iter 함수에 인수로 전달하니 모두 iterator 오브젝트를 리턴하는 것을 보았습니다.

다음은 for 문에서 사용할 수 없는 오브젝트를 확인해 보겠습니다.

For 문에서 사용할 수 없는 오브젝트도 확인해 보겠습니다.

# for 문에서 사용할 수 없는 오브젝트
my_integer = 1
my_float = 1.234
my_bool = True
my_none = None
def my_func():
pass
 
print('Integer: {}'.format(iter(my_integer)))
 
TypeError: 'int' object is not iterable

For 문에서 사용할 수 없는 오브젝트를 iter 함수에 인수로 전달하니 모두 iterable 오브젝트가 아니라는 타입에러를 발생 시켰습니다. Float, boolean, None, function 오브젝트도 직접 확인해보시기 바랍니다.

Iterable 오브젝트인 문자열을 for 문에서 실행해보겠습니다.

my_string = 'abc'
 
for letter in my_string:
print(letter)
 
a
b
c

For 문이 실행되면서 letter 라는 변수에 문자열이 하나씩 저장되는 것을 알 수 있습니다.

For 문은 내부적으로 어떻게 작동하는 걸까요? For 문이 어떻게 작동하는지를 이해하기 위해서는 먼저 iter 함수와 next 함수를 이해하셔야 합니다.

문자열을 iter 함수에 전달하여 str_Iterator 오브젝트를 만들고, str_iterator가 가지고 있는 next 함수를 사용하여 문자열을 하나씩 출력해보겠습니다.

iter_obj = iter('abc')
 
print(iter_obj)
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
print(iter_obj.__next__())
 
<str_iterator object at 0x000001F324761250>
a
b
c
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
in
5 print(iter_obj.__next__())
6 print(iter_obj.__next__())
----> 7 print(iter_obj.__next__())

a, b, c가 순차적으로 출력되다가 더 이상 출력할 문자열이 없으니 StopIteration 에러가 발생하는 것을 볼 수 있습니다. Iter 함수는 시퀀스 오브젝트를 인수로 받아 iterator 오브젝트를 리턴합니다. 이렇게 만들어진 iterator 오브젝트는 next 메소드를 가지고 있고, 이 next 메소드를 실행하면 문자열을 하나씩 순서대로 리턴합니다. 그리고 더이상 리턴할 문자열이 남아있지 않으면 StopIteration 에러를 발생시킵니다.

For 문 안에는 continue, break 2개의 키워드를 사용할 수 있습니다. Continue는 원하는 시퀀스를 건너뛰라는 명령어이고, break는 for 문을 종료하라는 명령어 입니다. 하나씩 사용해 보겠습니다.

my_list = ['one', 'two', 'three', 'skip', 'four', 'five']
 
for num in my_list:
if num == 'skip':
continue  # 리턴된 값이 'skip'과 같으면 스킵합니다.
 
    print(num)
 
    if num == 'four':
        break  # 리턴된 값이 'four'이면 for 문을 종료합니다.
 
one
two
three
four
For 문을 사용하다보면 언패킹 (unpacking) 이라는 기능을 사용해야 할 때가 있습니다. 예를 들어 아래의 리스트와 같이 리스트로 만들어진 리스트를 for 문으로 실행하면 i 변수에 리스트 오브젝트가 저장됩니다.
 
list_1 = [[1, 2], [3, 4], [5, 6]]
 
for i in list_1:
print(i)
 
[1, 2]
[3, 4]
[5, 6]

하지만 for문안에 변수를 2개 정의하면 리스트 아이템이 각 변수에 하나씩 저장되게 됩니다. 이것을 언패킹이라고 합니다.

list_1 = [[1, 2], [3, 4], [5, 6]]
 
for i, j in list_1:
print(i, j)
 
1 2
3 4
5 6

물론 아래의 코드와 같이 중첩 for 문을 사용해서 각 아이템에 접근할 수도 있지만, 아이템이 많지 않다면 언패킹을 사용하는 것이 더 편리합니다.

언패킹은 다음과 같이 아이템이 2개 이상이어도 사용할 수 있습니다.

list_2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 
for i, j, k in list_2:
print(i, j, k)
 
1 2 3
4 5 6
7 8 9

하지만 아래와 같이 언패킹할 아이템의 숫자와 변수의 숫자가 일치하지 않으면 에러가 발생하게 됩니다.

list_2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 
for i, j in list_2:
print(i, j)
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-19b25bdbc030> in <module>
2 list_2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
3
----> 4 for i, j in list_2:
5     print(i, j)
 
ValueError: too many values to unpack (expected 2)

이번에는 딕셔너리를 for문에서 사용하는 방법을 알아보겠습니다. 간단한 딕셔너리를 정의한 후 for 문 안에서 실행해보겠습니다. 어떤 값이 출력될까요?

my_dict = {
'a': 1,
'b': 2,
'c': 3
}
 
for i in my_dict:
print(i)
 
a
b
c

딕셔너리를 for문에서 실행하면 각 아이템의 value가 아닌 key가 리턴됩니다. 그래서 딕셔너리를 for 문에서 사용하시려면 다음과 같이 리턴된 key를 사용하여 value에 엑세스하셔야 합니다.

my_dict = {
'a': 1,
'b': 2,
'c': 3
}
 
for key in my_dict:
print('{}: {}'.format(key, my_dict[key]))
 
a: 1
b: 2
c: 3

다른 방법으로는 items 메소드를 사용하실 수 가 있습니다.

my_dict = {
'a': 1,
'b': 2,
'c': 3
}
 
for i in my_dict.items():
print(i)
 
('a', 1)
('b', 2)
('c', 3)

Items 메소드를 사용하시면 튜플 오브젝트로 key와 value를 리턴합니다. 이 경우에 언패킹을 사용하시면 됩니다.

my_dict = {
'a': 1,
'b': 2,
'c': 3
}
 
for k, v in my_dict.items():
print('{}: {}'.format(k, v))
 
a: 1
b: 2
c: 3

세트 또한 for 문에서 사용할 수 있습니다. 하지만 세트는 순서가 없는 오브젝트이기 때문에 for문에서도 저장된 순서와 상관없이 리턴된다는 점 꼭 기억하시기 바랍니다. 실행해 보겠습니다.

my_set = {'a', 'b', 'c'}
 
for i in my_set:
print(i)
 
c
b
a

마지막으로 range 오브젝트를 사용해보겠습니다.

Range 함수는 특정 숫자 만큼 for 문을 실행하고자 할 때 많이 사용됩니다. 예를 들어, 1 부터 10까지의 숫자를 출력하고 싶다면 다음과 같은 코드를 실행하시면 됩니다.

for i in range(1, 11):
print(i)
 
1
2
3
4
5
6
7
8
9
10

코딩 시험 문제로 반복문을 사용하여 구구단을 만들라는 문제가 아주 잘 나옵니다. For 문과 range 함수를 사용하여 구구단을 출력해보겠습니다.

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

구구단이 아주 간단히 만들어지는 것을 보셨습니다.

오늘의 강좌는 여기서 마치고 다음 강좌에서는 함수에 대해서 공부해보도록 하겠습니다.