Python 10. 제어문 - 반복문(while문, for문)
안녕하세요!
이번에는 제어문 중 여러 반복문이 있습니다. 오늘은 반복문 중 while문,for문을 소개하려고 합니다.
1부터 100일 때까지 조건식을 실행시키고 싶을 때 매번 코드를 다 치기 번거로울 때 while문, for문을 사용하여 코드를 간결하고 가독성이 쉽게 코드 작성을 할 수 있습니다.
한 번 알아보겠습니다!
1. 반복문
반복문은 동일한 작업을 여러 번 실행하기 위해 사용되는 제어 구조입니다. 주로 for 문과 while 문이 사용되며, 각각의 반복문은 다른 상황에 적합한 방식으로 사용됩니다.
2. while문
while 문은 특정 조건이 참인 동안 반복적으로 코드 블록을 실행하는 제어 구조입니다. while 문은 주어진 조건이 참인 동안 반복적으로 코드를 실행하며, 조건이 거짓이 되면 반복을 멈춥니다.
```
while 조건:
조건이 참인 동안 실행될 코드:
```
조건은 평가 결과가 참(True) 또는 거짓(False)이 될 수 있는 표현식입니다. 조건이 참일 때 코드 블록이 실행되며, 코드 블록이 실행된 후에 다시 조건을 검사합니다. 조건이 여전히 참이라면 코드 블록을 다시 실행하고, 이 과정을 조건이 거짓이 될 때까지 반복합니다.
while문을 작성할 때에는 몇 가지 주의 사항이 있습니다.
- 무한 루프: 만약 while 문의 조건이 항상 참이라면 코드가 무한 루프에 빠질 수 있습니다. 프로그램이 의도대로 종료되지 않는 상황을 방지하기 위해 조건을 제대로 설정해야 합니다.
- 조건 변경: while 문 내에서 조건을 변경해야 루프가 종료되는 경우도 있습니다. 그렇지 않으면 무한 루프에 빠질 수 있습니다.
- 끝 조건: 반복이 더 이상 필요하지 않을 때 while 문을 종료하는 조건을 명확하게 설정해야 합니다.
적절한 초기화: 반복 변수나 조건을 사용하기 전에 적절하게 초기화해야 합니다.
우리는 1부터 10까지의 총합을 수학의 시그마 연산을 통해서 55라는 것을 알고 있습니다.
시그마 연산을 이용하지 않으면 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55 를 통해서 힘겹게 구할 수도 있습니다.
파이썬에서도 마찬가지로 힙겹게 1부터 10까지의 합을 구할 수도 있지만 while문을 통해 간결하게 코드 작성하여 총합을 출력할 수 있습니다.
1부터 10까지의 합
조금 더 범위를 늘려 볼까요??
1부터 100까지의 짝수의 합
우리는 파이썬에서의 나머지를 구하는 연산을 %로 잘 알고 있습니다.
또한 값을 2로 나누어 나머지가 0인 수들이 짝수임도 잘 알고 있습니다.
이 두가지 사실을 기반으로 코드를 짜보겠습니다.
이번에는 1부터 9단 까지의 구구단 중 저희가 원하는 수의 곱셈(단)을 구해보는 코드를 짜보겠습니다.
while문은 조건이 참인 경우에 반복적으로 코드를 실행하는 제어 구조입니다.
연습문제들을 통해서 반복문 중 while문을 익혀보았습니다.
이번에는 반복문 중 for문에 대해서 알아보겠습니다!
3. for문
for 문은 시퀀스(리스트, 튜플, 문자열 등)의 각 항목에 대해 반복 작업을 수행하는 반복문입니다. for 문은 주로 "지정된 범위 내에서 반복"할 때 사용됩니다. 이것은 반복할 요소들이 미리 정해져 있는 경우에 유용합니다.
```
for 요소 in 시퀀스:
# 시퀀스의 요소 갯수만큼 반복할 문장
```
다음의 용어를 익혀봅시다!
요소 | 반복할 시퀀스의 각 항목이 for 문의 실행 도중에 할당되는 변수입니다. |
시퀀스 | 반복할 데이터의 컬렉션(리스트, 튜플, 문자열 등)을 지정합니다. |
작업 | 각 요소에 대해 수행할 작업을 표현합니다. |
for문을 통한 간단한 예시를 들어볼게요.
- for문은 시퀀스 자료형에 대해 사용됩니다. 이외의 다른 자료형(숫자, 불린 등)에는 사용할 수 없습니다.
- for문 내에서 반복 변수를 초기화할 필요가 없습니다. 반복문이 실행될 때마다 시퀀스의 요소가 변수에 할당됩니다.
- for문은 변경 불가능한(immutable) 시퀀스 (예: 문자열, 튜플)와 함꼐 사용할 수 있습니다.
- for문은 시퀀스의 각 항목을 순차적으로 반복합니다. 조건에 따라 특정 요소를 건너뛸 수는 있지만, 일반적으로 순차적인 반복 작업에 사용됩니다.
for문에서 자주 사용되는 함수를 살펴볼게요.
3-1. range() 함수
range() 함수는 파이썬에서 순차적인 정수의 시퀀스를 생성하는 데 사용되는 내장 함수입니다. 주로 for 문과 함께 사용되며, 일정한 범위 내에서 반복 작업을 수행할 때 유용하게 활용됩니다. range() 함수의 결과로 생성되는 순차적인 정수 시퀀스는 실제로 메모리에 저장되지 않고 필요할 때마다 생성되므로, 큰 범위의 반복문에도 효율적으로 사용할 수 있습니다.
```
range([start], stop, [step])
```
start | 순차적인 범위의 시작 값을 지정합니다.(기본 값은 0) |
stop | 순차적인 범위의 끝 값을 지정합니다. 생성된 시퀀스는 stop 값 직전까지의 정수를 포함합니다. |
step | 순차적인 값을 증가시키는 간격을 지정합니다.(기본 값은 1) |
3-2. enumerate() 함수
enumerate() 함수는 파이썬에서 반복문을 사용할 때 인덱스와 값을 함께 가져오기 위해 사용되는 내장 함수입니다. 주로 for 문과 함께 사용되며, 반복문 내에서 순서를 추적하면서 값과 해당 값의 인덱스를 함께 사용할 때 유용합니다. enumerate() 함수는 (인덱스, 값)의 튜플을 반환하는 이터레이터(iterator)를 생성합니다.
```
enumerate(iterable, start1)
```
enumerate()를 통해 인덱스(순서)와 값을 출력할 수 있습니다.
이번에는 다른 함수를 알아보겠습니다.
위의 그림을 통해 li1과 li2의 요소 개수가 다를 때 에러가 발생합니다. 에러가 발생하지 않는 함수가 있습니다. 바로 zip함수입니다.
3-3. zip()함수
zip() 함수는 파이썬에서 여러 개의 반복 가능한(iterable) 객체를 병렬적으로 묶어주는 내장 함수입니다. 각 객체로부터 순서대로 하나의 요소씩 가져와 튜플로 묶어주는 이터레이터를 반환합니다. 주로 여러 개의 리스트나 튜플을 병렬적으로 처리하고자 할 때 사용됩니다.
```
zip(iterable1, iterable2,,,)
```
이번에는 중첩 반복문에 대해서 살펴보겠습니다.
중첩 반복문은 for문 내에 for문이 내포되어 있거나 while문내에 for문이 내포되어 있는 등 복잡한 형태를 띠기 때문에 제대로 이해하고 넘어가는 것이 좋습니다.
4. 중첩 반복문
파이썬에서 중첩된 반복문은 하나의 반복문 안에 다른 반복문이 포함된 구조를 의미합니다. 중첩 반복문은 외부 반복문의 각 반복마다 내부 반복문이 모두 실행되는 방식으로 작동합니다. 이를 통해 다차원의 데이터를 처리하거나 복잡한 작업을 수행할 수 있습니다.
```
for 외부변수 in 외부시퀀스:
for 내부변수 in 내부시퀀스:
내부 반복문 코드
외부 반복문 코드
```
내포되어 있는 변수가 먼저 반복된 후 외부에 있는 변수가 반복됩니다.
따라서 '🤢'가 j : 1부터 3까지 i : 1부터 3까지 3번 반복하여 총 9번 출력됩니다. 또 '🤔'는 i에 종속되어 있기 떄문에 3번 반복하여 3번 출력됩니다.
연습문제를 통해서 중첩루프문을 익혀보겠습니다.
'👨🦰' 가 5개의 행, 5개의 열 구조에 맞게 출력되어야 합니다. 그렇다면 내부 변수를 통해서 5번 반복하여 열로 나타내고 외부 변수의 반복을 통해서 5개의 열을 출력하는 방식을 생각해 볼 수 있습니다.
j 변수가 0부터 4까지 총 5번 반복되며 end = ' '를 통해 띄어쓰기 후 이모지를 출력하는 방식인 것을 알 수 있습니다. 그 후 i변수에 종속되어 한 행이 5번 반복하여 총 5개의 행을 이룬다는 것을 알 수 있습니다. print()을 통해 줄을 바꾸어 행을 나타냅니다.
위의 코드를 짜기 위해서는 문제1의 사고흐름을 빌려와야 합니다. 첫 번째 행까지는 문제1과 동일하나 두 번째 행부터 열의 개수가 1씩 줄어듦을 확인할 수 있었습니다. 따라서 i변수는 그대로 두고 j 변수를 변경하는 것이 좋을 것 같습니다. i가 1씩 증가할 떄마다 j는 1씩 줄어야 합니다.
j의 범위를 i 부터 5로 설정하면 i는 1씩 증가할 때마다
0 ~ 4(5열) => 1 ~ 4(4열) => 2 ~ 4(3열) => 3 ~ 4(2열) => 4 (1열)
이므로 만족하는 것을 알 수 있습니다.
이번 문제는 문제 2와 반대로 1열 2열 3열 4열 5열 으로 마지막행이 문제1과 동일함을 알 수 있습니다.
즉 문제2와 동일하게 i변수는 문제1과 동일하게 두고 j변수의 범위를 조정해야 합니다.
i 변수의 범위가 1씩 증가할 때마다 j도 마찬가지로 1씩 늘어야 합니다.
여기서 저는 처음에 범위를 5-i부터 5까지라고 설정하면 어떨까라는 생각을 했었는데 그렇게 되면 i의 범위가 0부터 4까지이기 때문에 i=4일때 j의 범위는 1부터 4까지로 총 4개의 열까지만 출력됩니다. 5개의 열은 출력이 되지 않기 때문에 다른 해법을 찾아야 했습니다.
다른 해법을 고민하던 중 i의 범위가 0부터 4까지이므로 j의 변수의 범위를 i+1로 두면 어떨까라는 생각이 들었습니다. 그렇게 되면 j는 1부터 5까지로 범위가 설정됩니다. 결국 저희가 원하는 1열부터 차례로 5열까지 증가하는 형태를 만들 수 있게 된 것입니다.
먼저 for문을 이용해서 코드를 만들어보겠습니다.
문제에서 요구하는 바를 풀어서 적으면 '2의 1배 부터 9배까지를 9까지 반복하는 코드를 짜'라는 것입니다.
그렇다면 외부 변수의 범위를 2부터 9까지, 내부 변수의 범위를 1배 부터 9배까지로 설정하는 것입니다. 2단에서 2의 1배부터 9배 그 다음 3단에서 3의 1배부터 9배까지....마지막 9단에서도 9의 1배부터 9배까지 출력하는 것입니다. 이러한 사고의 흐름을 따라서 코드를 짜보면 다음과 같습니다.
for문은 while문에 비해 비교적 쉽게 구할 수 있습니다.
다음은 for문과 while문을 혼합해서 사용한 경우입니다.
for문에서와 동일한 사고 흐름을 이용합니다.
while문은 변수의 값을 우선 정한 후 조건식을 작성하여 반복합니다.
마지막으로 while문만을 이용해서 2단부터 9단까지의 구구단을 만드는 코드를 고민해보겠습니다.
while문도 for문에서의 사고 흐름을 이용하면 됩니다.
제가 처음 떠오른 생각으로 오류를 겪었던 코드가 있습니다.
이런식으로 2단까지만 출력되고 3단부터는 출력이 되지 않았어요. 그 이유는 i = 2 일 때 j가 9배를 마친 후 1이 더해져 10이 되면 while문의 조건 j <= 9 를 만족하지 못하게 되어 내부변수 j에 대한 while문이 종료가 됩니다. 이를 막기 위해서 우리는 j 값을 초기화해야합니다. 따라서 2단에서 9배까지 마무리가 되어 i가 1이 증가되어 j변수에 대한 while문이 실행되도록 j = 1으로 초기화합니다.
파이썬에서 큰 비중을 차지하는 반복문 while문, for문의 개념에 대해서 이해해보고 연습 문제까지 풀어보았습니다. 다음에는 컬렉션과 반복문의 활용에 대해서 공부해보겠습니다!