이전에 배운 while문과 유사하게 for문도 반복문에 해당한다. 수행하는 일은 거의 비슷하지만, 상황에 따라 for문을 사용하는 것이 더 간편한 코드를 작성할 수 있게 하기 때문에 for을 공부해야 한다.

 

For 반복문은 반복을 해야 되는 구간을 명확히 알고 있거나, 구간을 가독성이 좋게 설정할 때 사용한다. 선언하는 부분에 범위가 간단명료하게 기재되어 있기 때문에 코드가 더 깔끔해지는 것이다. 예시를 살펴보자.

 

numbers = [1, 3, 15, 2, 5, 9, 21, 11]

for i in numbers:
    print(i)  # numbers 리스트 안의 값들을 일일이 출력

 

앞서 배운 리스트의 값들을 하나씩 처리하는 일을 for문을 사용하면 반복 문제를 간단하게 해결할 수 있다. 복잡하지 않은 범위를 따로 설정하고 싶다면 어떻게 해야 할 지도 알아보자.

 

# 리스트를 사용하지 않더라도 어떤 범위를 range를 통해 정할 수 있음.
for j in range(11):  # 0~10까지의 숫자 범위 반복
    print(j)

for j in range(1, 6):  # 1~5까지의 숫자 범위 반복
    print(j)

for j in range(1, 21, 2):  # 1~20 범위 숫자를 3단위로 반복
    print(j)

 

range()를 사용하면 시작지점, 종료지점, 증감연산을 설정할 수 있다. 주의해야할 점은 시작지점이 없다면 0에서부터 시작하며, 종료지점은 해당 숫자까지가 아니라 해당 숫자에서 끊기는 개념이다.

 

# 리스트의 인덱스와 값을 나란히 차례대로 출력해 보자.
numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]

# 인덱스와 원소 출력
for unit in numbers:
    print(numbers.index(unit), unit)

# 모범 답안
for i in range(len(numbers)):
    print(i, numbers[i])

 

리스트에서 인덱스와 해당 인덱스의 값을 나란히 출력했다. 리스트를 매개변수로 직접 가져와서 각 값의 인덱스를 직접 받는 방법을 선택했지만, 값의 중복이 있는 경우를 생각하지 못했다. 따라서, 모범 답안대로 인덱스를 반복적으로 대입하여 해당 인덱스에 있는 리스트 내부의 값을 얻는 것이 더 좋은 방법인 것을 알게 됐다.

 

# 거듭제곱 계산기
x = 2  # 2의 거듭제곱
for i in range(11):  # 0승 부터 10승 까지 반복
    print(f"{x}^{i} = {x ** i}")

 

다음은 특별할 것 없이 두 변수를 사용하여 거듭제곱을 계산하는 코드를 만들어 봤다. 현재는 변수 x가 2로 고정되어 있지만, 이 값도 변화하는 값으로 사용해야 하면 중복해서 반복문을 늘려나가면 된다.

 

# for 문을 사용한 구구단
for i in range(1, 10):
    for j in range(1, 10):
        print(f"{i} * {j} = {i * j}")

 

이전의 예시에서 언급했듯이 두 변수의 반복 구간을 정해줘서 구구단을 출력할 수 있었다.

 

# 세 변의 합이 400인 직각 삼각형에서 세 변의 곱을 구하라. (피타고라스 삼조)
for a in range(1, 400):
    for b in range(1,400):
        c = 400 - a - b
        if a ** 2 + b ** 2 == c ** 2 and a < b < c:
            print(a * b * c)

 

이번에는 변수가 세 개인 경우였지만, 너무 많은 경우의 수를 줄이기 위해 c를 다른 변수들을 사용해 나타내는 조건을 사용한 방법을 사용했다. for과 if가 같이 쓰여 조건이 세분화된 것을 알 수 있다.

 

# for 반복문으로 리스트 순서 뒤집기
numbers = [2, 3, 5, 7, 11, 13, 17, 19]

# 리스트 뒤집기
for left in range(len(numbers) // 2):
    # 인덱스 left와 대칭인 인덱스 right 계산
    right = len(numbers) - left - 1

    temp = numbers[left]
    numbers[left] = numbers[right]
    numbers[right] = temp

print("뒤집어진 리스트: " + str(numbers))

# 튜플을 사용해 뒤집기
for left in range(len(numbers) // 2):
    # 인덱스 left와 대칭인 인덱스 right 계산
    right = len(numbers) - left - 1

    # left와 right 숫자를 변경
    numbers[left], numbers[right] = numbers[right], numbers[left]

print("뒤집어진 리스트: " + str(numbers))

 

리스트를 반으로 나눠 좌측, 우측으로 대칭이 되는 인덱스끼리 자리를 교환해 주는 방식을 사용해 리스트를 뒤집었다. 하지만, 문제점은 인덱스를 하나하나 처리하면서 2번 값들이 교환되어 결국 제자리로 돌아온다는 것이 문제였다. 그래서 버림 나눗셈을 사용해 좌측의 인덱스들만 사용해 값을 뒤집어주어 문제를 해결했다.

 

피보나치수열을 풀었을 때처럼 파이썬에서 유용하게 쓸 수 있는 튜플 데이터 타입을 사용해 간편하게 값을 교환할 수 있다는 것도 기억했다. For문을 적재적소에 사용한다면 훨씬 더 간략한 코드를 짤 수 있다는 것을 배웠다.