# Understanding Loops in Python

**Contents  
1️⃣** 반복문의 필요성 (Why do we need loops?)  
**2️⃣** While문 (While loop)  
**3️⃣** For문 (For loop)

---

## **1️⃣반복문의 필요성**  
(Why do we need loops?)

반복문은 동일한 작업을 여러 번 반복해야 할 때 매우 유용하다. 예를 들어, 학생들의 성적을 처리하는 경우, 각 학생의 성적을 각각 계산하는 대신, 반복문을 사용하면 모든 학생의 성적을 효율적으로 처리할 수 있다.

1. **시간 절약**: 반복문을 사용하면 같은 코드를 여러 번 작성할 필요 없이 한 번만 작성하고 여러 번 실행할 수 있다. 이는 코드의 길이를 줄이고, 가독성을 높이며, 유지보수를 쉽게 만든다.
    
2. **자동화**: 반복문은 반복적인 작업을 자동화할 수 있다. 예를 들어, 학생들의 성적을 처리할 때, 각각의 성적을 수동으로 계산하는 대신, 반복문을 사용하여 모든 학생의 성적을 자동으로 계산할 수 있다.
    
3. **오류 감소**: 수동으로 반복 작업을 수행하면 실수할 가능성이 높아진다. 반복문을 사용하면 이런 실수를 줄일 수 있다.
    

  
예제: 학생들의 성적을 아래의 예제처럼 배열로 저장하고, 각 학생의 성적을 처리하게 된다.

```python
# 학생들의 성적 리스트 (각 학생의 성적)
students_scores = [
    [25, 90, 20, 90],  # 1번 학생
    [85, 70, 80, 90],  # 2번 학생
    [75, 80, 85, 60],  # 3번 학생
    [90, 95, 85, 100]  # 4번 학생
]
```

---

## **2️⃣** While문 (While loop)

<mark>while 조건문: 문법을 사용하여 반복문을 사용한다.<br>for 변수 in 리스트(또는 튜플, 문자열): 문법을 사용하여 반복문을 사용한다.<br>리스트안에 for문을 포함하여 리스트 내포를 사용할 수 있다.</mark>

**while 문의 기본 구조 (Basic structure of while loop)**

```python
while 조건문:
    수행할 문장1
    수행할 문장2
    ...
```

> * `while` 문은 조건문이 참(`True`)인 동안 계속해서 `while` 문 아래에 있는 문장들을 반복해서 수행한다.
>     
> * 조건문이 거짓(`False`)이 되면 `while` 문을 종료하고 다음 코드로 넘어간다.
>     

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720576847038/1f71f9e7-9974-4d33-9df7-2a6790329cff.png align="center")

---

**while 문의 활용 (Practice while loop)**

```python
treeHit = 0  # 나무를 찍은 횟수를 저장하는 변수

while treeHit < 10:  # treeHit이 10보다 작은 동안 반복되게 된다.
    treeHit += 1  # 나무를 한 번 찍음 (treeHit를 1 증가시킴)
    print("나무를 %d번 찍었습니다." % treeHit)  # 현재 나무를 찍은 횟수 출력

    if treeHit == 10:  # treeHit이 10이 되면
        print("나무가 넘어갔습니다.")  # 나무가 넘어갔음을 출력
```

> 1. `treeHit` 변수를 0으로 초기화한다.
>     
> 2. `while` 문은 `treeHit`이 10보다 작은 동안 반복한다.
>     
> 3. 루프 내부에서 `treeHit`을 1씩 증가시킨다.
>     
> 4. `treeHit`의 현재 값을 출력한다.
>     
> 5. `treeHit`이 10이 되면 "나무가 넘어갔습니다."를 출력하고 루프를 종료한다.
>     

이 코드 예제를 실행하면 다음과 같은 출력이 나오게 된다. 이와 같이 `while` 문을 사용하여 조건이 만족되는 동안 특정 동작을 반복 수행할 수 있다.

```python
나무를 1번 찍었습니다.
나무를 2번 찍었습니다.
나무를 3번 찍었습니다.
나무를 4번 찍었습니다.
나무를 5번 찍었습니다.
나무를 6번 찍었습니다.
나무를 7번 찍었습니다.
나무를 8번 찍었습니다.
나무를 9번 찍었습니다.
나무를 10번 찍었습니다.
나무가 넘어갔습니다.
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720577167834/c753f258-6686-41bc-807f-7cc446d4662d.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720577174772/42b1e245-5d2a-4425-a1b7-1c7745d8f3ee.png align="center")

---

  
**Break 문 (Break in loop)** ✅ 강제로 while 문을 빠져나가야 할 때 사용한다.  

`break` 문을 사용하여 무한 루프를 종료하는 예제를 보자. 아래는 자판기에 커피가 10개 있고, 커피를 뽑을 때마다 커피의 개수가 하나씩 줄어드는 상황을 시뮬레이션한 코드이다. 이때 `money`가 300원으로 고정되어 있어 `while` 문의 조건이 항상 참이다. `break` 문을 사용하여 커피가 다 떨어지면 루프를 종료한다.

```python
coffee = 10  # 자판기에 있는 커피의 개수
money = 300  # 커피를 뽑을 수 있는 돈

while money:  # money가 300으로 고정이 되어 있다면 항상 참이게 되므로 무한 루프이다.
    print("돈을 받았으니 커피를 뽑습니다.")
    coffee -= 1  # 커피의 개수를 하나 줄입니다.
    print("남은 커피의 개수는 %d개입니다" % coffee)

    if coffee == 0:  # 커피가 다 떨어졌을 때
        print("커피가 다 떨어졌습니다. 자판기를 종료합니다.")
        break  # 무한 루프를 종료합니다.
```

> * `coffee` 변수를 10으로 초기화합니다.
>     
> * `money` 변수는 300으로 고정되어 있습니다.
>     
> * `while money`가 무한 루프를 만들게 된다. (money가 300으로 고정되어 있음)
>     
> * 루프 내부에서 "커피를 뽑았습니다."를 출력하고 `coffee` 변수를 1 감소시킨다.
>     
> * 남은 커피의 개수를 출력한다.
>     
> * `coffee`가 0이 되면 "커피가 다 떨어졌습니다. 자판기를 종료합니다."를 출력하고 `break` 문을 사용하여 루프를 종료한다.
>     
> * `% coffee`는 문자열 포맷팅(string formatting)에서 사용되는 부분이다. `% coffee`는 문자열 내에 포맷 지정자 `%d`와 함께 사용되어, `%d` 자리에 변수 `coffee`의 값을 대입하여 문자열을 형식화한다. 여기서 `%d`는 정수를 나타내며, `% coffee`는 변수 `coffee`의 현재 값으로 대체된다. 이 포맷팅 기법을 통해 변수의 값을 문자열 내에 삽입하거나 출력할 때 사용한다.
>     

이 코드 예제를 실행하면 다음과 같은 출력이 나온다. 이와 같이 `break` 문을 사용하여 특정 조건을 만족할 때 `while` 문을 강제로 종료할 수 있다.

```python
커피를 뽑았습니다.
남은 커피의 개수: 9개
커피를 뽑았습니다.
남은 커피의 개수: 8개
...
커피를 뽑았습니다.
남은 커피의 개수: 1개
커피를 뽑았습니다.
남은 커피의 개수: 0개
커피가 다 떨어졌습니다. 자판기를 종료합니다.
```

---

**continue 문 (continue in loop)** ✅ while문을 빠져나가지 않고 while 문의 맨 처음(조건문)으로 다시 돌아가야 할 때 사용한다.

`continue` 문을 사용하여 `while` 문의 특정 조건에서 현재 반복을 건너뛰고 처음으로 돌아가는 예제를 확인해보자. 이 예제에서는 1부터 10까지의 숫자 중 홀수만 출력하도록 한다.

```python
a = 1  # 초기값 설정

while a < 10:  # a가 10보다 작은 동안 반복
    a += 1  # a를 1 증가시킴
    if a % 2 == 0:  # a를 2로 나눈 나머지가 0이면 (짝수이면)
        continue  # while 문의 처음으로 돌아감 (아래 코드 실행 안 됨)
    print(a)  # a가 홀수일 때만 출력됨
```

> * `a` 변수를 1로 초기화한다.
>     
> * `while` 문은 `a`가 10보다 작은 동안 반복한다.
>     
> * 루프 내부에서 `if a % 2 == 0` 조건문을 통해 `a`가 짝수인지를 확인한다.
>     
> * `a`가 짝수이면 `a += 1`로 `a`를 1 증가시키고 `continue` 문을 실행하여 `while` 문의 처음으로 돌아간다. 이 경우, `print(a)` 문은 실행되지 않는다.
>     
> * `a`가 홀수이면 `print(a)`로 `a`를 출력한다.
>     
> * `a`가 10이 되면 루프가 종료된다.
>     

코드 예제를 실행하면 다음과 같은 출력이 나온다. 이와 같이 `continue` 문을 사용하여 특정 조건에서 현재 반복을 건너뛰고 `while` 문의 처음으로 돌아갈 수 있다.

```python
1
3
5
7
9
```

---

## **3️⃣** for 문 (for loop)

**for 문의 기본 구조 (Basic structure of while loop)**

```python
for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...
```

```python
test_list = ['one', 'two', 'three']

for i in test_list:  # test_list 리스트의 각 요소를 순서대로 i에 대입
    print(i)  # i 출력
```

> * `for` 문은 리스트, 튜플, 문자열 등의 첫 번째 요소부터 마지막 요소까지 차례대로 변수(i)에 대입하여 `for` 문의 블록을 수행한다.
>     
> * 각 반복에서 변수는 순서대로 다음 요소를 가리킨다.
>     
> * 변수(i)의 데이터타입은 문자열(string)이다.
>     

---

**range 함수 사용법 (range function in for loop)** range()는 숫자 리스트를 자동으로 만들어주는 함수이다. 이 함수는 반복문과 함께 자주 사용된다.  
리스트 \[ 1, 2, 3, 4 ... 100 \]을 일일히 손으로 작성한다고하면 번거롭고 시간이 오래걸리기 마련이다. 이럴때 range()가 사용된다.

✅ range(stop)

```python
for i in range(10):
    print(i)
```

> * `range(stop)`은 0부터 10 미만의 숫자를 포함하는 `range` 객체를 만들어 준다.
>     
> * 즉, `0, 1, 2, 3, 4, 5, 6, 7, 8, 9`를 생성한다. (10은 불포함)
>     

✅ range(start, stop)

```python
for i in range(0,10):
    print(i)
```

> * `range(a, b)`는 `a`부터 `b` 미만의 숫자를 포함하는 `range` 객체를 만들어 준다.
>     
> * 예를 들어, `range(1, 11)`은 `1, 2, 3, 4, 5, 6, 7, 8, 9, 10`을 생성한다.
>     

---

**range 함수를 이용한 for 문 예제 (Example of for loop with range function)**

`for` 문을 사용하여 구구단을 만드는 예제를 연습하자. 아래 코드는 2부터 9까지의 숫자에 대해 각각의 곱셈 결과를 출력한다.

```python
# 구구단 만들기
for i in range(2, 10):  # 2부터 9까지의 숫자가 차례로 i에 대입됨 (1번 for 문)
    for j in range(1, 10):  # 1부터 9까지의 숫자가 차례로 j에 대입됨 (2번 for 문)
        print(i*j, end ="")  # i와 j의 곱셈 결과를 출력
    print('')  # 각 단이 끝날 때마다 빈 줄을 출력하여 구분
```

> 1. 첫 번째 `for` 문에서 `i`는 2부터 9까지의 숫자를 차례로 가진다. (짝수)
>     
> 2. 두 번째 `for` 문에서 `j`는 1부터 9까지의 숫자를 차례로 가진다. (홀수)
>     
> 3. 내부의 `print(i*j, end ="")` 문장은 `i`와 `j`의 곱셈 결과를 출력한다.
>     
> 4. 각 단이 끝날 때마다 빈 줄을 출력하여 단을 구분한다.
>     

이 코드를 실행하면 다음과 같은 출력이 나온다. 이와 같이 `for` 문을 중첩하여 구구단을 만들 수 있다. `range` 함수를 사용하여 반복할 범위를 지정하고, 각 범위 내의 숫자를 곱하여 출력하면 된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720591446490/7b14307a-5e31-4704-b6d9-8cfc242107d5.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720583398283/3044bdad-1f84-4e17-b147-47c44a296f99.png align="center")

---

**리스트 내포 사용법 (How to use list comprehension)** 리스트를 더 간결하고 직관적으로 만들 수 있는 방법이다.

> 1. 리스트 안에 for 문 포함하기
>     
> 2. for문 2개 이상 사용 가능
>     
> 3. 구구단의 모든 결과를 리스트로 담는 리스트 내포 예제
>     

✅ 리스트 안에 for 문 포함하기

예제1) a 리스트의 각 항목에 3을 곱한 결과를 result 리스트에 담기

```python
a = [1, 2, 3, 4]
result = []

for num in a:
    result.append(num * 3)

print(result)  # [3, 6, 9, 12]
```

예제2) 예제 1을 리스트 내포를 사용하도록 수정 (예제1과 동일한 결과를 얻는다)

```python
a = [1, 2, 3, 4]
result = [num * 3 for num in a] #표현식 num *3 뒤에 for 변수 in 반복개체

print(result)  # [3, 6, 9, 12]
```

예제3) 리스트 내포 안에 'if 조건' 사용

```python
a = [1, 2, 3, 4]
result = [num * 3 for num in a if num % 2 == 0] # 표현식, for 문 변수 in 반복 개체, if 조건 

print(result)  # [6, 12]
```

> 1. **예제 1**:
>     
>     * 일반적인 `for` 문을 사용하여 리스트 `a`의 각 항목에 3을 곱한 결과를 `result` 리스트에 추가한다.
>         
> 2. **예제 2**:
>     
>     * 리스트 내포를 사용하여 예제 1을 간결하게 표현한다.
>         
>     * `[num * 3 for num in a]`는 `a` 리스트의 각 요소 `num`에 대해 `num * 3`을 계산하여 `result` 리스트에 추가한다.
>         
> 3. **예제 3**:
>     
>     * 리스트 내포 안에 `if` 조건을 사용하여 조건에 맞는 항목만 처리한다.
>         
>     * `[num * 3 for x in a if num % 2 == 0]`는 `a` 리스트의 각 요소 `num`에 대해 `num % 2 == 0`인 경우에만 `num * 3`을 계산하여 `result` 리스트에 추가한다.
>         
>     * 여기서 `num % 2 == 0` 조건은 `num`이 짝수인지를 확인한다.
>         
> 
> 리스트 내포를 사용하면 코드가 더 간결하고 읽기 쉬워진다. 이를 활용하여 다양한 리스트 변환 작업을 효율적으로 처리할 수 있다.

---

  
✅ for문 2개 이상 사용 가능

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

> 여기서 `표현식`은 각 항목에 적용되는 표현식이고, `항목`은 반복 가능 객체에서 가져오는 값이다. `if 조건`은 선택 사항이다.
> 
> 이 방법은 가독성이 떨어질수 있으므로 잘 사용하지 않지만 프로그래머로써 알아야할 문법이라고 교수님께서 말씀하셨다.

---

  
✅ 구구단의 모든 결과를 리스트로 담는 리스트 내포 예제

```python
result = [x*y for x in range(2,10)
    for y in range(1,10)]
print(result)
```

> * `for x in range(2, 10)`: 2부터 9까지의 숫자 범위에서 `x`를 반복. 즉, 3단부터 9단까지 반복된다.
>     
> * `for y in range(1, 10)`: 1부터 9까지의 숫자 범위에서 `y`를 반복. 이는 각 단의 곱셈 결과를 반복한다.
>     
> * `x*y`: 각 반복마다 `x * y`의 튜플을 생성하여 리스트에 추가한다.
>     
> * 아래와 같은 결과가 나온다.
>     

```python
[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]
```

---

## Quiz

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720606177915/220a940c-b57c-4045-90a9-2eb4a685ac55.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1720606530774/e68f1441-802d-4ab9-b07d-803e24a4fc73.png align="center")
