
변수 하나를 조건에 따라 다르게 초기화하는 상황, 자주 있죠. "0이면 기본값, 아니면 그대로", "None이면 빈 리스트, 아니면 받은 값 그대로" 같은 아주 단순한 분기. 이걸 if/else 블록으로 4줄씩 쓰면 코드가 무거워지고, 진짜 로직이 공백에 묻힙니다. 반대로 and/or 트릭으로 한 줄에 욱여넣으면 falsy 값 때문에 미묘한 버그가 생기기 쉽고요.
파이썬은 이 사이를 메우는 조건식(conditional expression)을 제공합니다. a if 조건 else b 형태인데, 다른 언어의 삼항 연산자(조건 ? a : b)와 어순이 달라서 처음엔 어색하지만 익숙해지면 아주 편합니다.
# 단순 분기를 장황하게 풀어 쓰기
def get_display_name(user):
if user.nickname:
name = user.nickname
else:
name = "익명"
return name
# 더 나쁜 경우: and/or 트릭
name = user.nickname and user.nickname or "익명"
# nickname이 빈 문자열("")이면? → "익명"으로 빠져서 의도대로 동작하는 듯 보이지만
# nickname이 0이나 False를 반환할 가능성이 있으면 버그 폭탄
첫 번째 예시는 틀린 건 아니지만 단순 대입 하나에 4줄을 쓰고 있어서 함수가 비대해집니다. 두 번째 예시는 한 줄이지만 and/or의 단락 평가에 의존해서 falsy 값이 끼면 오동작해요. 둘 다 아쉽습니다.
# 조건식 한 줄로 깔끔하게
def get_display_name(user):
return user.nickname if user.nickname else "익명"
# 변수 초기화에도 자주 씀
timeout = custom_timeout if custom_timeout is not None else 30
status = "성인" if age >= 18 else "미성년자"
# 리스트 컴프리헨션 안에서도 유용
labels = [("짝수" if n % 2 == 0 else "홀수") for n in numbers]
어순이 "참일 때 값 → 조건 → 거짓일 때 값"이라는 게 포인트입니다. A if condition else B라고 읽히죠. 영어 문장처럼 "A를, 조건이 참이면, 아니면 B를"이라는 흐름이에요. 처음엔 낯설어도 한 번 익숙해지면 if/else 블록이 오히려 길게 느껴집니다.
다만 조건식을 중첩하거나(x if a else (y if b else z)), 한 줄이 너무 길어지는 순간 바로 후퇴하세요. 그때는 평범한 if 문이나 도우미 함수가 훨씬 읽기 좋습니다. 조건식은 "단순한 이항 분기"에서만 빛을 봅니다.
값A if 조건 else 값B. 다른 언어의 삼항 연산자와 어순이 다릅니다.if/else 블록으로 돌아가는 게 맞습니다.and/or 트릭은 falsy 값(0, "", [], None) 때문에 버그를 만들기 쉬우니 조건식으로 대체하세요.[x*2 if x > 0 else 0 for x in nums]).API 응답 가공할 때 자주 쓰입니다. user["name"] if user.get("name") else "Guest"처럼 기본값 채우기, "ok" if response.status_code == 200 else "error"처럼 상태 플래그 만들기 같은 거요. 또 로깅 메시지를 상황에 따라 다르게 찍을 때 logger.info(f"처리 완료 ({'성공' if ok else '실패'})")식으로 쓰면 포매팅이 훨씬 간결해집니다. 데이터 정제 파이프라인에서도 df["category"] = df["score"].apply(lambda s: "높음" if s >= 80 else "낮음") 같은 패턴이 흔해요. 단, 분기가 3개 이상이 되는 순간엔 미련 없이 별도 함수로 빼는 게 정답입니다.