! 03장에서는 프로그램의 흐름을 제어하기 위한
if,while,for문에 대해서 공부했다.
다음 코드를 실행했을 때 출력되는 값을 알아보자.
a = "Life is too short, you need python"
if "wife" in a:
print("wife")
elif "python" in a and "you" not in a:
print("python")
elif "shirt" not in a:
print("shirt")
elif "need" in a:
print("need")
else:
print("none")
shirt
if - elif - else문은 위에서부터 조건을 차례대로 검사한다.
그리고 조건이 처음으로 True가 되는 순간 해당 코드를 실행하고 나머지 조건은 확인하지 않는다.
"wife" in a
문자열 a는 다음과 같다.
Life is too short, you need python
여기에 "wife"는 없다.
"wife" in a
↓
False
따라서 다음 조건으로 넘어간다.
"python" in a and "you" not in a
먼저
"python" in a
를 확인하면
True
이다.
하지만
"you" not in a
를 확인하면 문자열 안에 "you"가 존재하므로
False
이다.
결국
True and False
↓
False
가 된다.
따라서 다음 조건으로 넘어간다.
"shirt" not in a
문자열에는 "shirt"가 없다.
따라서
"shirt" not in a
↓
True
가 된다.
그래서
print("shirt")
가 실행된다.
shirt
여기서 중요한 점은 아래에 있는
elif "need" in a:
도 사실 조건만 확인하면 True라는 것이다.
하지만 이미 그 위의
elif "shirt" not in a:
가 True가 되었으므로 더 이상 아래 조건은 검사하지 않는다.
"wife" in a
→ False
↓
"python" in a and "you" not in a
→ True and False
→ False
↓
"shirt" not in a
→ True
↓
"shirt" 출력
↓
조건 검사 종료
if / elif 문은 위에서부터 검사한다.
처음 True가 나온 조건만 실행한다.
그 아래 조건은 더 이상 검사하지 않는다.
while문을 사용해서
1부터 1000까지의 자연수 중 3의 배수의 합을 구해 보자.
result = 0
i = 1
while i <= 1000:
if i % 3 == 0:
result += i
i += 1
print(result)
166833
먼저 합계를 저장할 변수를 만든다.
result = 0
그리고 1부터 시작한다.
i = 1
while문의 조건은 다음과 같다.
while i <= 1000:
즉,
i가 1000 이하인 동안 반복
한다.
if i % 3 == 0:
%는 나머지를 구하는 연산자이다.
3의 배수는 3으로 나누었을 때 나머지가 0이다.
3 % 3 = 0
6 % 3 = 0
9 % 3 = 0
12 % 3 = 0
따라서
i % 3 == 0
이면 현재 숫자는 3의 배수이다.
3의 배수를 발견하면
result += i
를 실행한다.
이는
result = result + i
와 같은 의미이다.
처음 몇 번의 반복을 살펴보면
i = 1
1 % 3 != 0
→ 더하지 않음
i = 2
2 % 3 != 0
→ 더하지 않음
i = 3
3 % 3 == 0
→ result = 0 + 3
→ 3
i = 4
→ 더하지 않음
i = 5
→ 더하지 않음
i = 6
→ result = 3 + 6
→ 9
와 같은 방식으로 계속 반복한다.
반복이 끝날 때마다
i += 1
을 실행한다.
1 → 2 → 3 → 4 → ... → 1000
만약
i += 1을 빼먹으면i의 값이 변하지 않기 때문에 무한 루프가 발생할 수 있다.
while i <= 1000:
→ 1 ~ 1000까지 반복
i % 3 == 0
→ 3의 배수 확인
result += i
→ 합계 누적
i += 1
→ 다음 숫자로 이동
while문을 사용해서 다음과 같은 별을 출력해 보자.
*
**
***
****
*****
다음과 같이 작성할 수 있다.
i = 0
while True:
i += 1
if i > 5:
break
print("*" * i)
*
**
***
****
*****
먼저
i = 0
으로 시작한다.
그리고
while True:
를 사용했다.
True는 항상 참이므로 이 while문은 그대로 두면 계속 반복된다.
while True
↓
무한 루프
따라서 반복문 안에서
break를 사용해서 종료 조건을 만들어 주었다.
if i > 5:
break
i += 1
실행 후
i = 1
이 된다.
print("*" * i)
는
"*" * 1
이므로
*
을 출력한다.
i = 2
"*" * 2
**
i = 3
***
이런 식으로
i = 1 → *
i = 2 → **
i = 3 → ***
i = 4 → ****
i = 5 → *****
까지 출력한다.
그다음 반복에서
i = 6
이 되고
if i > 5:
가
6 > 5
↓
True
가 된다.
따라서
break
가 실행되면서 while문을 종료한다.
"*" * 3
의 결과는
***
이다.
문자열에서 * 연산자는 문자열을 반복한다.
while True
→ 무한 반복
break
→ 반복문 종료
"*" * 숫자
→ 문자열 반복
for문과
range()를 사용해서1부터 100까지의 숫자를 출력해 보자.
for i in range(1, 101):
print(i)
1
2
3
4
5
...
98
99
100
range()의 기본 형태는 다음과 같다.
range(시작, 끝)
여기에서 끝 값은 포함하지 않는다.
따라서
range(1, 101)
은
1 이상
101 미만
↓
1 ~ 100
을 의미한다.
for문이 반복될 때마다
i에는 다음 숫자가 자동으로 들어간다.
첫 번째 반복
i = 1
두 번째 반복
i = 2
세 번째 반복
i = 3
...
마지막 반복
i = 100
따라서
print(i)
를 이용하면 1 ~ 100까지 출력할 수 있다.
참고한 코드에는 다음과 같은 형태가 들어 있다.
for i in range(1, 101):
print(i)
i += 1
하지만 여기서
i += 1
은 필요하지 않다.
for문은
range()가 만들어 놓은 값을 다음 반복에서 자동으로 변수에 넣는다.
예를 들어
for i in range(1, 4):
라면
첫 번째 반복
i = 1
두 번째 반복
i = 2
세 번째 반복
i = 3
이 자동으로 이루어진다.
따라서 반복문 안에서
i += 1
을 실행하더라도 다음 반복에서는 range()가 다시 다음 값을 i에 대입한다.
즉,
for i in range(1, 101):
print(i)
만 작성하면 된다.
! while과 for의 차이
while에서는
i += 1처럼 직접 값을 증가시켜야 하는 경우가 많다.
하지만 for + range에서는 다음 반복 값이 자동으로 들어오기 때문에 직접 증가시킬 필요가 없다.
A 학급에 학생 10명이 있고 중간고사 점수가 다음과 같다고 하자.
scores = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]
for문을 사용해서 평균 점수를 구해 보자.
scores = [70, 60, 55, 75, 95, 90, 80, 80, 85, 100]
total = 0
for score in scores:
total += score
average = total / len(scores)
print(average)
79.0
평균을 구하려면 먼저 모든 점수를 더해야 한다.
total = 0
에서 시작한다.
for문으로 점수를 하나씩 가져온다.
for score in scores:
첫 번째 반복에서는
score = 70
이므로
total += score
를 실행하면
total = 0 + 70
↓
70
이 된다.
두 번째 반복에서는
score = 60
이므로
total = 70 + 60
↓
130
이 된다.
이 작업을 모든 학생에게 반복하면
70
+ 60
+ 55
+ 75
+ 95
+ 90
+ 80
+ 80
+ 85
+ 100
= 790
이 된다.
따라서
total = 790
이다.
학생 수는 리스트의 길이와 같다.
len(scores)
결과는
10
이다.
따라서 평균은
790 / 10
↓
79.0
이 된다.
total = 0
for score in scores:
total += score
→ 모든 값의 합 구하기
len(scores)
→ 학생 수 구하기
total / len(scores)
→ 평균 구하기
다음 리스트가 있다고 하자.
numbers = [1, 2, 3, 4, 5]
이 중에서 홀수만 골라 2를 곱한 값을 새로운 리스트에 저장해 보자.
numbers = [1, 2, 3, 4, 5]
result = []
for n in numbers:
if n % 2 == 1:
result.append(n * 2)
print(result)
[2, 6, 10]
numbers에서 숫자를 하나씩 가져온다.
1
2
3
4
5
그리고 다음 조건을 확인한다.
n % 2 == 1
숫자를 2로 나누었을 때 나머지가 1이면 홀수이다.
1 % 2 = 1
↓
홀수
따라서
result.append(1 * 2)
를 실행한다.
result = [2]
2 % 2 = 0
↓
짝수
조건이 거짓이므로 아무 작업도 하지 않는다.
3 % 2 = 1
↓
홀수
따라서
3 × 2 = 6
을 추가한다.
result = [2, 6]
5 × 2 = 10
까지 추가하면 최종 결과는
[2, 6, 10]
이다.
위 코드는 리스트 컴프리헨션을 이용하면 한 줄로 표현할 수 있다.
numbers = [1, 2, 3, 4, 5]
result = [n * 2 for n in numbers if n % 2 == 1]
print(result)
[2, 6, 10]
처음 보면 다음 코드가 조금 복잡해 보일 수 있다.
[n * 2 for n in numbers if n % 2 == 1]
다음 순서로 생각하면 쉽다.
numbers에서 n을 하나씩 가져온다.
↓
n이 홀수인지 확인한다.
↓
홀수라면 n * 2를 계산한다.
↓
계산 결과를 새로운 리스트에 넣는다.
result = []
for n in numbers:
if n % 2 == 1:
result.append(n * 2)
result = [
n * 2
for n in numbers
if n % 2 == 1
]
줄만 나누어 보면 두 코드의 구조가 비슷하다는 것을 알 수 있다.
조건이 없는 경우
[표현식 for 변수 in 반복자료]
예를 들어
[n * 2 for n in numbers]
조건이 있는 경우
[표현식 for 변수 in 반복자료 if 조건]
예를 들어
[n * 2 for n in numbers if n % 2 == 1]
for
→ 값을 하나씩 가져옴
if
→ 필요한 값만 선택
표현식
→ 선택된 값을 가공
[]
→ 결과를 새로운 리스트로 만듦
이번 문제에서는 03장에서 공부한
if,while,for문을 다시 확인했다.
| 문제 | 핵심 내용 |
|---|---|
| Q1 | if / elif / else, in, and, not |
| Q2 | while, 나머지 연산, 누적 합 |
| Q3 | while True, break, 문자열 반복 |
| Q4 | for, range() |
| Q5 | for문을 이용한 누적 합과 평균 |
| Q6 | 리스트 컴프리헨션 |
if 조건:
실행문
elif 다른조건:
실행문
else:
실행문
조건은 위에서부터 차례대로 검사한다.
첫 번째 True 발견
↓
해당 코드 실행
↓
나머지 조건 검사 X
while 조건:
실행문
조건이
True인 동안 계속 반복한다.
조건 True
→ 반복
조건 False
→ 종료
while True:
→ 계속 반복
따라서 보통
break
와 함께 사용한다.
for 변수 in 반복자료:
실행문
반복 가능한 자료에서 값을 하나씩 가져온다.
range(1, 101)
1 ~ 100
끝 숫자는 포함하지 않는다.
break
→ 현재 반복문을 즉시 종료한다.
total = 0
for value in values:
total += value
→ 값을 계속 더해서 합계를 구한다.
[
표현식
for 변수 in 반복자료
if 조건
]
예를 들어
[n * 2 for n in numbers if n % 2 == 1]
은
numbers에서 숫자를 가져옴
↓
홀수만 선택
↓
2를 곱함
↓
새로운 리스트 생성
을 의미한다.
! 03장 제어문에서 반드시 기억해야 할 핵심
제어문은 프로그램이 어떤 코드를 실행하고, 몇 번 반복할지 결정하는 문법이다.
먼저
if문은조건을 판단한다. True → 실행 False → 실행하지 않음을 담당한다.
if 조건: 실행문
while문은조건이 True인 동안 계속 반복한다.
while 조건: 실행문특히 while문에서는
조건에 사용하는 값이 어떻게 변하는가?를 반드시 확인해야 한다.
그렇지 않으면 무한 루프가 발생할 수 있다.
for문은리스트나 range 등의 값을 하나씩 꺼내면서 반복한다.
for 변수 in 반복자료: 실행문
두 반복문을 간단하게 구분하면
while → 조건 중심 → "언제까지 반복할까?" for → 데이터 중심 → "무엇을 하나씩 반복할까?"라고 생각하면 쉽다.
그리고 반복문을 강제로 종료할 때는
break를 사용한다.
마지막으로 파이썬에서는 for문으로 새로운 리스트를 만드는 작업을
[표현식 for 변수 in 반복자료 if 조건]형태의 리스트 컴프리헨션으로 간단하게 표현할 수도 있다.
이번 03장에서 가장 중요하게 가져가야 할 것은
if → 조건 판단 while → 조건이 참인 동안 반복 for → 데이터를 하나씩 반복 break → 반복 종료이 네 가지의 역할을 확실하게 구분하는 것이다.