Python 조건문은 문법 자체보다 지금 어떤 종류의 판단을 하는가를 먼저 구분하면 빨라집니다.
여러 구간을 나누는지, 값이 비었는지 보는지, None인지 확인하는지, 여러 후보 중 하나인지, 한 줄 값 선택만 필요한지에 따라 가장 자연스러운 형태가 달라집니다.
숏컷 코드
# 기본 분기
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
else:
grade = "C"
# 비어 있는 값 검사
if not items:
print("비어 있음")
# None 구분
if result is None:
print("결과 없음")
# 여러 후보 중 하나인지 검사
if command in {"start", "run", "go"}:
print("실행")
# 값 하나를 짧게 고름
badge = "adult" if age >= 20 else "minor"문법
기본형은 네 가지 정도로 보면 됩니다.
if condition:
...
if condition:
...
else:
...
if cond1:
...
elif cond2:
...
else:
...
value = a if condition else b독립 조건을 각각 반영해야 하면 if를 나눠 씁니다.
if is_admin:
badges.append("admin")
if is_active:
badges.append("active")if / elif / else는 실행 흐름을 나누는 문장입니다.
여러 줄 동작을 조건에 따라 나눌 때 기본이 됩니다.
조건 표현식 a if cond else b는 값 하나를 고르는 표현식입니다.
변수 하나에 짧게 값을 넣는 상황에는 편하지만, 분기 안에서 여러 줄 동작을 해야 하면 일반 if가 더 낫습니다.
elif는 앞 조건이 거짓일 때만 이어집니다.
그래서 여러 갈래 중 하나만 선택해야 하는 분기라면 if를 여러 번 쓰는 것보다 elif 체인으로 묶는 편이 더 정확합니다.
자주 쓰는 조건
구간을 순서대로 나눌 때는 if / elif / else가 기본입니다.
if temp >= 30:
status = "hot"
elif temp >= 20:
status = "warm"
else:
status = "cool"점수, 온도, 상태 구간처럼 위에서 아래로 좁혀 가는 판단은 이 구조가 가장 직접적입니다.
값이 비었는지만 보면 if value: 또는 if not value:가 자연스럽습니다.
if user_name:
print("이름이 있다")
if not errors:
print("에러 없음")빈 문자열, 빈 리스트, 빈 딕셔너리, 0, None은 조건식에서 거짓처럼 취급될 수 있으므로, "있나/없나" 정도의 간단한 검사에는 짧고 읽기 쉽습니다.
정말 None인지 구분해야 하면 is None이 맞습니다.
if result is None:
print("결과가 아직 없다")
if result is not None:
print("결과를 사용할 수 있다")0, [], ""는 거짓처럼 보여도 None은 아닙니다. 값이 비어 있는 것과 아예 없는 것을 나눠야 하면 truthy/falsy보다 명시 비교가 낫습니다.
여러 후보 중 하나인지 볼 때는 in이 빠릅니다.
if command in {"start", "run", "go"}:
print("실행")문자열이나 상태값 후보가 명확할 때 or를 길게 잇는 것보다 훨씬 빨리 읽힙니다.
if command == "start" or command == "run" or command == "go":
print("실행")값 하나만 짧게 고를 때는 조건 표현식이 좋습니다.
badge = "adult" if age >= 20 else "minor"짧은 선택에는 적합하지만, 여러 분기나 복잡한 동작까지 한 줄 안에 밀어 넣기 시작하면 일반 if가 더 읽기 쉽습니다.
분기 흐름
조건문은 위에서 아래로 검사하고, 처음 참이 되는 분기 하나만 실행합니다.
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "D"score = 85라면 "B"에서 멈추고, 아래 분기는 더 검사하지 않습니다. 그래서 같은 체인 안에서는 조건 순서가 의미를 바꿉니다.
하나만 선택해야 하면 elif, 각각 따로 반영해야 하면 if를 나눕니다.
# 하나만 선택
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
# 각각 독립적으로 반영
if is_admin:
badges.append("admin")
if is_active:
badges.append("active")점수 등급처럼 결과 중 하나만 고르는 문제라면 elif 체인이 맞고, 배지처럼 여러 조건이 동시에 참일 수 있으면 if를 따로 두는 편이 맞습니다.
조건이 겹치면 더 구체적인 조건을 위에 둡니다.
if score >= 90:
result = "excellent"
elif score >= 60:
result = "pass"
else:
result = "fail"더 넓은 조건을 먼저 쓰면 아래의 더 구체적인 분기가 죽을 수 있습니다.
주의할 점
if not value:와 is None은 같은 뜻이 아닙니다.
# 0, "", [], None이 모두 같은 쪽으로 들어갈 수 있음
if not result:
print("결과 없음")
# 정말 None인지 구분
if result is None:
print("결과 없음")비어 있는 값 전체를 보고 싶은지, 정말 None만 보고 싶은지 먼저 정해야 합니다.
문자열이나 숫자 값 비교에는 is를 쓰지 않습니다.
# 잘못된 예
if status is "done":
print("완료")
# 올바른 예
if status == "done":
print("완료")is는 값이 같은지보다 같은 객체인지에 가까운 비교입니다. 문자열, 숫자, 일반 값 비교에는 ==가 맞습니다.
더 넓은 조건을 위에 두면 아래 분기가 닿지 않을 수 있습니다.
# 잘못된 예
if score >= 60:
grade = "pass"
elif score >= 90:
grade = "A"
# 올바른 예
if score >= 90:
grade = "A"
elif score >= 60:
grade = "pass"여러 구간 분기는 순서가 곧 로직입니다. 위쪽 조건이 먼저 매칭되면 아래는 실행되지 않는다는 점을 항상 같이 봐야 합니다.
참고 링크
2 sources