제어 흐름

지금까지 작성한 모든 프로그램은 같은 방식으로 실행됩니다: 위에서 아래로, 한 번에 한 줄씩. 단순한 스크립트에는 충분하지만, 실제 프로그램은 의사 결정을 하고 작업을 반복해야 합니다. 퀴즈는 답이 맞는지 확인해야 합니다. 게임은 플레이어가 이기거나 질 때까지 계속 실행되어야 합니다. 이 장에서는 프로그램을 분기하고 반복하는 방법을 다룹니다.
비교
의사 결정을 하기 전에 사물을 비교해야 합니다. 비교 연산자는 True 또는 False를 반환합니다. 초반에 올바르게 하는 것이 가장 중요한 것: =는 값을 할당하고, ==는 두 값이 같은지 확인합니다. 이 둘을 헷갈리는 것이 초보자가 가장 흔히 하는 실수입니다.
5 > 3 # True
5 < 3 # False
5 == 5 # True (주의: 이중 등호; =는 할당, ==는 비교)
5 != 3 # True ("같지 않음")
5 >= 5 # True ("이상")
5 <= 4 # False ("이하")=와 ==의 구분은 초보자를 거의 항상 혼란스럽게 합니다. 할당(=)은 값을 저장하고, 비교(==)는 두 값이 같은지 확인합니다.
문자열도 비교할 수 있습니다. Python은 문자 단위로 알파벳 순서대로 비교하며, 이는 문자열 장에서 더 자세히 다룹니다:
"apple" == "apple" # True
"apple" < "banana" # True (a가 b보다 먼저 옴)
"apple" == "Apple" # False (대소문자 구분)=는 값을 저장하고, ==는 두 값이 같은지 확인합니다. 피곤할 때도 느려서 그것을 두 번 확인합니다. 그것 때문에 혼란스러워하면 당신만 그런 게 아닙니다. 비교는 True 또는 False를 반환하며, 문자열에도 작동하고, 알파벳 순서입니다. 조건 결합
and, or, not은 비교를 결합합니다. and는 양쪽이 모두 참이어야 합니다. or는 한쪽이라도 참이면 됩니다. not은 결과를 뒤집습니다. 이를 사용하면 "점수가 통과 AND 사용자가 활성" 같은 실제 조건을 표현할 수 있습니다.
age = 25
score = 88
age >= 18 and score >= 80 # True (둘 다 참이어야 함)
age < 18 or score >= 80 # True (최소한 하나는 참이어야 함)
not age >= 18 # False (결과를 뒤집음)and는 양쪽을 필요로 합니다. or는 한쪽이라도 필요로 합니다. not은 반대로 합니다.
and는 양쪽이 참이어야 하고, or은 한쪽이라도 참이어야 하며, not은 답을 뒤집습니다. 이것이 "점수가 통과이고 사용자가 활성"처럼 대부분의 실제 조건을 작성하는 방법입니다. Python은 답을 알게 되자마자 확인을 멈춥니다. 참 같은 값과 거짓 같은 값
Python의 모든 값은 True 또는 False가 아니어도 부울 해석을 가집니다. 빈 문자열, 0, 빈 리스트, None은 모두 조건에서 False처럼 동작합니다. 다른 모든 것은 True처럼 동작합니다. 이는 if results:가 if len(results) > 0:을 작성하지 않고도 리스트가 비어 있지 않은지 확인한다는 의미입니다.
# 이것들은 모두 조건에서 False처럼 동작합니다:
False, 0, 0.0, "", [], {}, (), None
# 다른 모든 것은 True처럼 동작합니다이는 if results:가 "리스트가 비어 있지 않으면"이라고 말하는 자연스러운 방식이며, if name:은 문자열에 내용이 있는지 확인합니다.
if / elif / else
if 문은 조건이 True일 때만 코드 블록을 실행합니다. elif는 첫 번째가 거짓이었으면 확인할 더 많은 조건을 추가합니다. else는 어떤 조건과도 일치하지 않은 모든 것을 처리합니다. Python은 중괄호가 아닌 들여쓰기를 사용하여 각 블록에 속하는 것을 정의합니다.
score = 87
if score >= 90:
print("A 학점")
elif score >= 80:
print("B 학점")
elif score >= 70:
print("C 학점")
else:
print("C 미만")규칙:
if는 필수이며 항상 먼저 옵니다elif("else if"의 약자)는 선택사항이며 필요한 만큼 많이 사용할 수 있습니다else는 선택사항이며 일치하지 않은 모든 것을 처리하고 마지막에 옵니다- Python은 들여쓰기(4개 공백)를 사용하여 각 블록에 속하는 것을 표시합니다; 중괄호는 없습니다
들여쓰기는 선택사항이거나 미용적이지 않습니다. Python은 이것을 사용하여 구조를 정의합니다. 불일치한 들여쓰기는 구문 오류입니다.
한 줄 조건
단순한 예/아니오 할당의 경우 Python에는 삼항 표현식이라는 컴팩트한 한 줄 형태가 있습니다: true일_때_값 if 조건 else false일_때_값. 논리가 작고 문장처럼 읽힐 때만 사용하세요.
label = "통과" if score >= 50 else "불통과"이는 삼항 표현식입니다; 문장처럼 읽힙니다. 논리가 작을 때 사용하세요. elif를 포함하는 것은 전체 버전을 작성하세요.
while 반복문
while 반복문은 조건이 True인 동안 블록을 반복합니다. 반복문이 몇 번 실행되어야 하는지 미리 알 수 없을 때 사용하세요. 예를 들어 유효한 입력을 기다리거나 작업이 성공할 때까지 재시도할 때입니다.
lives = 3
while lives > 0:
print(f"남은 목숨: {lives}")
lives -= 1
print("게임 오버")while은 미리 반복 횟수를 알 수 없을 때 가장 좋습니다. 알 때, 또는 컬렉션을 반복할 때는 for가 더 깔끔합니다.
break 및 continue
break는 반복문을 즉시 종료하며, 남은 반복이 몇 개이든 무시합니다. continue는 현재 반복의 나머지를 건너뛰고 조건 확인으로 돌아갑니다. 둘 다 자신이 내부에 있는 가장 안쪽 반복문에만 영향을 줍니다.
break는 반복문을 즉시 종료합니다:
target = 5
num = 0
while True:
num += 1
if num == target:
print(f"{target}을 찾았습니다")
break # 반복문 종료while True:와 break는 종료 조건이 복잡하거나 반복문 본문의 끝에서 일어나야 할 때의 유효하고 일반적인 패턴입니다.
continue는 현재 반복의 나머지를 건너뛰고 조건 확인으로 돌아갑니다:
num = 0
while num < 10:
num += 1
if num % 2 == 0:
continue # 짝수 건너뜀
print(num) # 홀수만 인쇄: 1, 3, 5, 7, 9for 반복문
for 반복문은 시퀀스를 한 번에 한 항목씩 살펴봅니다: 리스트, 문자열, 숫자 범위. for 이후에 명명한 변수는 차례로 각 항목을 받습니다. 카운터를 관리하거나 길이를 직접 확인하지 않습니다.
players = ["민지", "준호", "승미"]
for player in players:
print(f"안녕하세요, {player}님!")for 반복문은 또한 문자열(문자 단위로 반복)과 다른 모든 시퀀스 유형에서 작동합니다.
range()
range()는 반복할 숫자 시퀀스를 생성합니다. range(5)는 0, 1, 2, 3, 4를 제공합니다. 시작, 끝, 스텝 크기를 제어할 수 있습니다. 반복문을 특정 횟수만큼 실행하려면 사용하세요.
for i in range(5):
print(i) # 0, 1, 2, 3, 4range()는 3가지 형태가 있습니다:
| 호출 | 생성 |
|---|---|
range(5) | 0, 1, 2, 3, 4 |
range(2, 6) | 2, 3, 4, 5 |
range(0, 10, 2) | 0, 2, 4, 6, 8 (스텝 2) |
range(5, 0, -1) | 5, 4, 3, 2, 1 (역순 계산) |
range()은 리스트를 생성하지 않습니다. 한 번에 한 숫자를 생성하므로 매우 큰 범위에도 효율적입니다.
enumerate()
enumerate()는 반복하면서 인덱스와 값을 모두 제공하므로 카운터를 별도로 추적할 필요가 없습니다. i, player 부분은 각 반복마다 자동으로 값의 쌍을 받습니다.
players = ["민지", "준호", "승미"]
for i, player in enumerate(players):
print(f"{i + 1}. {player}")
# 1. 민지
# 2. 준호
# 3. 승미i, player 구문은 언팩이라고 불립니다. Python은 (index, value) 쌍을 두 이름으로 자동 분할합니다.
기본적으로 enumerate()는 0에서 시작합니다. 시작 값을 전달하여 변경하세요:
for i, player in enumerate(players, start=1):
print(f"{i}. {player}") # 1에서 시작중첩 반복문
반복문을 다른 반복문 안에 넣을 수 있습니다. 내부 반복문은 외부 반복문의 각 단일 반복에 대해 완전히 실행됩니다. 이것은 격자, 조합 또는 두 가지 구조 수준의 모든 데이터를 처리하는 방법입니다.
rows = [1, 2, 3]
cols = ["A", "B"]
for row in rows:
for col in cols:
print(f"{col}{row}", end=" ")
print() # 각 행 후 줄 바꿈
# A1 B1
# A2 B2
# A3 B3중첩 반복문 내부의 break와 continue는 가장 안쪽 반복문에만 영향을 줍니다.
반복문-else
Python 반복문은 반복문이 break를 치지 않고 종료되었을 때만 실행되는 else 절을 가질 수 있습니다. 일반적으로 사용되지 않지만 "리스트를 검색하고 아무것도 찾지 못했으면 이것을 하세요"를 작성하는 가장 깔끔한 방법입니다.
target = "민지"
names = ["준호", "승미", "준영"]
for name in names:
if name == target:
print(f"{target}을 찾았습니다")
break
else:
print(f"{target}은 리스트에 없습니다") # break가 실행되지 않아서 실행됨break가 실행되면 else는 건너뜁니다. 반복문이 시퀀스를 소비하면 else는 실행됩니다. 틈새 패턴이지만 플래그 변수보다 깔끔합니다.
정렬
sorted()는 새로운 정렬된 리스트를 반환하고 원본을 변경하지 않습니다. .sort()는 제자리에서 리스트를 정렬하고 None을 반환합니다. key= 인수를 사용하면 원시 값이 아닌 다른 것으로 정렬할 수 있습니다. 예를 들어 이름을 대소문자 구분 없이 정렬하거나 플레이어 튜플을 점수로 정렬하세요.
scores = [87, 42, 96, 55, 71]
ranked = sorted(scores) # [42, 55, 71, 87, 96] (새 리스트)
scores.sort() # 원본 리스트 정렬, None 반환
scores.sort(reverse=True) # [96, 87, 71, 55, 42]둘 다 key= 인수를 허용합니다: 비교 전에 각 항목에 적용되는 함수:
names = ["승미", "민지", "준호"]
sorted(names, key=str.lower) # 대소문자 구분 없이 정렬
players = [("민지", 87), ("준호", 96), ("승미", 55)]
sorted(players, key=lambda p: p[1]) # 점수로 정렬lambda p: p[1]은 한 줄 함수입니다: 플레이어 튜플을 받아서 점수를 반환합니다. 람다는 람다 및 이해 장에서 자세히 다룹니다.
단순한 경우 sorted()를 사용하세요. 제자리에서 수정하려는 리스트의 경우 .sort()를 사용하세요.
실제로
점수를 반복하고, 합계를 축적하고, 통과 학점을 세고, 요약을 인쇄하세요:
raw_scores = [87, 42, 96, 55, 71, 63]
total = 0
passing = 0
for score in raw_scores:
total += score
if score >= 60:
passing += 1
average = total / len(raw_scores)
print(f"평균: {average:.1f}")
print(f"통과: {passing}/{len(raw_scores)}")
print(f"최고 점수: {sorted(raw_scores, reverse=True)[0]}")
