3주차: 조건문, 반복문과 함수
이번 강의에서 배울 것
- 비교식과 논리식을 조합해 조건을 표현할 수 있다.
- if, elif, else로 실행 흐름을 나눌 수 있다.
- try, except로 예상되는 오류에 대응할 수 있다.
- for, while, break, continue를 상황에 맞게 사용할 수 있다.
- 매개변수와 반환값이 있는 함수를 정의할 수 있다.
- 지역 변수와 전역 변수의 범위를 구분할 수 있다.
학습 경로
이전: 2주차 · 자료형과 컬렉션 · 다음: 4주차 · 파일 입출력과 Pandas
범위: 3주차 슬라이드 3–40
단원 도입
| 핵심 포인트 | 중요도 | 이렇게 확인한다 |
|---|---|---|
if·elif는 처음 참이 된 블록 하나만 실행 | ★★★ | 조건 순서를 바꿨을 때 결과 예측하기 |
range(start, stop, step)은 stop을 포함하지 않음 | ★★★ | list(range(2, 20, 3)) 쓰기 |
break vs continue | ★★★ | 반복문 출력 결과 쓰기 |
print vs return, return 없으면 None | ★★ | 함수 결과를 변수에 넣었을 때의 값 |
| 지역 변수 vs 전역 변수 | ★★ | 함수 안팎의 x 출력 결과 |
=(할당) vs ==(비교) | ★ | 조건식 오류 찾기 |
형광펜 읽는 법: 노랑 핵심 정의·결론 · 빨강 헷갈리기 쉬운 구분·함정 · 파랑 외워야 할 순서·목록
PART 1 · 조건
비교 연산자
3p~4p
비교 연산의 결과는 항상 True 또는 False(자료형 bool)다.
| 연산자 | 의미 | 예시 |
|---|---|---|
<, > | 작다, 크다 | 3 > 2 → True |
<=, >= | 작거나 같다, 크거나 같다 | 3 >= 3 → True |
== | 값이 같다 | 3 == 2 → False |
!= | 값이 다르다 | 3 != 2 → True |
조건에 따라 분기하기
5p~11p
if는 조건이 참일 때 들여쓴 블록을 실행한다. 여러 조건은 위에서 아래로 검사하며, 처음 참이 된 블록 하나만 실행한다.
number = float(input("숫자를 입력하세요: "))
if number > 0:
print("양수")
elif number == 0:
print("0")
else:
print("음수")| 구조 | 적합한 상황 |
|---|---|
if | 조건이 참일 때만 작업 |
if ... else | 두 경우 중 하나를 반드시 선택 |
if ... elif ... else | 서로 배타적인 여러 경우 중 하나를 선택 |
중첩 if | 바깥 조건이 참일 때 세부 조건을 다시 검사 |
예외 처리
12p
예외 처리는 실행 중 발생할 수 있는 오류를 예상하고 프로그램이 적절히 대응하게 한다.
raw = input("화씨 온도를 입력하세요: ")
try:
fahrenheit = float(raw) # 실패할 수 있는 코드
celsius = (fahrenheit - 32.0) * 5.0 / 9.0
except ValueError: # 숫자로 못 바꿨을 때
print("숫자를 입력해야 합니다.")
else: # 오류 없이 끝났을 때만
print(f"섭씨 온도: {celsius:.1f}℃")논리 연산자
13p~16p
| 연산자 | 참이 되는 경우 | 핵심 |
|---|---|---|
and | 양쪽이 모두 참 | 조건을 좁힌다 |
or | 하나 이상 참 | 조건을 넓힌다 |
not | 원래 조건이 거짓 | 결과를 뒤집는다 |
age = 21
has_id = True
if age >= 19 and has_id:
print("입장 가능") # → 입장 가능not → and → or 순서로 계산된다. 복잡한 조건은 괄호로 의도를 분명하게 표현한다.
PART 2 · 반복
for 반복문과 range
17p~20p
for는 문자열, 리스트, 튜플처럼 반복 가능한 객체의 요소를 하나씩 꺼내 실행한다.
numbers = [6, 5, 3, 8, 4, 2, 5, 4, 11]
total = 0
for number in numbers:
total += number # total = total + number
print(total) # → 48range(start, stop, step)은 정수의 흐름을 만든다. stop은 포함하지 않는다.
print(list(range(10))) # → [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(2, 8))) # → [2, 3, 4, 5, 6, 7]
print(list(range(2, 20, 3))) # → [2, 5, 8, 11, 14, 17]
print(list(range(5, 0, -1))) # → [5, 4, 3, 2, 1]인덱스와 값이 모두 필요하다면 range(len(...))보다 enumerate()가 명확하다.
genres = ["pop", "rock", "jazz"]
for index, genre in enumerate(genres, start=1):
print(index, genre)
# → 1 pop
# → 2 rock
# → 3 jazzwhile, break와 continue
21p~26p
while은 조건이 참인 동안 반복한다. 반복을 끝낼 수 있도록 조건에 쓰인 값이 반드시 변해야 한다.
n = 10
total = 0
i = 1
while i <= n:
total += i
i += 1 # 이 줄이 없으면 무한 반복
print(total) # → 55| 명령 | 동작 |
|---|---|
break | 현재 반복문 전체를 즉시 종료 |
continue | 현재 회차의 나머지만 건너뛰고 다음 회차로 이동 |
for char in "string":
if char == "i":
continue
print(char, end=" ")
# → s t r n g ("i"만 건너뜀)
for char in "string":
if char == "i":
break
print(char, end=" ")
# → s t r ("i"에서 반복 자체가 끝남)PART 3 · 함수
함수 정의와 반환값
27p~30p
함수는 반복되는 작업에 이름을 붙인 코드 단위다. 매개변수로 입력을 받고 return으로 결과를 돌려줄 수 있다.
def absolute_value(number):
"""숫자의 절댓값을 반환한다."""
if number >= 0:
return number
return -number
print(absolute_value(-4)) # → 4def show(x):
print(x * 2)
result = show(3) # 화면에 6이 찍힘
print(result) # → None기본 인자, 키워드 인자와 가변 인자
31p~35p
def greet(name, message="좋은 아침입니다!"):
return f"안녕하세요, {name}. {message}"
print(greet("Kate")) # → 안녕하세요, Kate. 좋은 아침입니다!
print(greet("Bruce", message="잘 지내세요?")) # → 안녕하세요, Bruce. 잘 지내세요?
print(greet(message="반갑습니다!", name="Monica")) # → 안녕하세요, Monica. 반갑습니다!| 종류 | 정의 | 호출 | 특징 |
|---|---|---|---|
| 위치 인자 | def f(a, b) | f(1, 2) | 순서대로 대응 |
| 키워드 인자 | f(b=2, a=1) | 이름으로 대응, 순서 무관 | |
| 기본 인자 | def f(a, b=10) | f(1) | 생략하면 기본값 |
| 가변 인자 | def f(*args) | f(1, 2, 3) | 여러 값을 튜플로 모음 |
def greet_all(*names):
for name in names:
print(f"안녕하세요, {name}")
greet_all("Monica", "Luke", "Steve", "John")*names는 전달된 여러 위치 인자를 하나의 튜플 ("Monica", "Luke", "Steve", "John")로 모은다.
함수 연습: 사칙연산 계산기
36p~37p
def calculate(left, right, operation):
if operation == 1:
return left + right
if operation == 2:
return left - right
if operation == 3:
return left * right
if operation == 4:
if right == 0:
raise ValueError("0으로 나눌 수 없습니다.")
return left / right
raise ValueError("operation은 1~4여야 합니다.")
print(calculate(8, 2, 4)) # → 4.0변수의 범위
38p~40p
함수 안에서 만든 변수는 기본적으로 지역 변수, 함수 밖에서 만든 변수는 전역 변수다.
x = 5
def show_scope():
x = 10 # 새 지역 변수 x (전역 x와 다른 것)
print("지역 x:", x)
show_scope() # → 지역 x: 10
print("전역 x:", x) # → 전역 x: 5값을 인자로 받고 결과를 반환하는 설계를 우선한다.
counter = 0
def increment(value, amount=2):
return value + amount
counter = increment(counter) # → counter는 2정답과 해설
1. B와 C가 모두 출력된다. if를 두 번 따로 썼으므로 두 조건을 각각 검사한다. elif였다면 B만 출력된다.
2. 변환 실패. int("3.5")는 소수점이 있는 문자열이라 ValueError가 난다.
3. [10, 7, 4, 1]. step이 음수면 줄어들며, stop인 0은 포함하지 않는다.
4. 1, 3. 2와 4는 continue로 건너뛰고, 5에서 break로 반복이 끝나 출력되지 않는다.
5. 6, 10, 4.
플래시카드
3주차 — if·elif·else에서 실행되는 블록은 몇 개인가?
처음 참이 된 블록 하나만. 그래서 범위 조건은 좁은 조건(큰 값)부터 검사한다. if를 여러 번 따로 쓰면 참인 것이 모두 실행된다.
3주차 — try / except / else / finally의 실행 순서는?
try 실행 → 오류가 나면 except, 없으면 else → finally는 항상 마지막에 실행.
3주차 — if x == 1 or 2:가 항상 참인 이유는?
(x == 1) or 2로 해석되고 2는 참이기 때문. x == 1 or x == 2 또는 x in (1, 2)로 쓴다.
3주차 — range(2, 20, 3)의 값은?
2, 5, 8, 11, 14, 17. stop(20)은 포함하지 않는다.
3주차 — break와 continue의 차이는?
break는 가장 가까운 반복문 전체를 끝내고, continue는 현재 회차의 나머지만 건너뛰고 다음 회차로 간다.
3주차 — print와 return의 차이는?
print는 화면에 보여 줄 뿐이고, return은 호출한 곳에 값을 돌려준다. return이 없는 함수는 None을 반환한다.
3주차 — 매개변수와 인자의 차이는?
매개변수는 함수 정의의 이름, 인자는 호출할 때 넘기는 실제 값.
3주차 — *names로 받은 값의 자료형은?
튜플. 전달된 여러 위치 인자를 하나로 모은다.
3주차 — 함수 안에서 x = 10을 하면 전역 x가 바뀌는가?
아니다. 대입하는 순간 새 지역 변수가 생긴다. 전역을 바꾸려면 global 선언이 필요하지만, 인자와 반환값을 쓰는 설계가 낫다.
핵심 점검
- 비교 연산의 결과 자료형은 이다.
- 여러 분기 중 처음 참이 된 블록 실행된다.
range(2, 8)의 마지막 값은 이다.continue는 현재 회차만 건너뛰고,break는 를 끝낸다.return이 없는 함수는 을 반환한다.- 기본값이 있는 매개변수는 기본값이 없는 매개변수 에 둔다.
- 함수 안에서 만든 변수는 기본적으로 이다.
내용을 이해했다면 학습 완료를 체크해 주세요.