한양과학기술고등학교

에듀테크 프로젝트 대시보드

불리언 · None · 비교

bool None is vs == truthy short-circuit

if 는 truthy/falsy 로 판단하고, and/or 는 피연산자를 그대로 반환합니다.

1. bool 은 int 의 하위 타입

True == 1        # => True
False == 0       # => True
True + True      # => 2
sum([True, False, True])   # => 2  (조건 개수 세기 관용구)
isinstance(True, int)      # => True

2. Falsy 값

거짓으로 취급되는 값 — 이것 외에는 전부 참
  • False, None
  • 숫자 0, 0.0, 0j
  • 빈 시퀀스/컬렉션: "", [], (), {}, set()
  • len() 이 0을 반환하는 객체
items = []
if not items:
    print("비어 있음")      # 이 방식 권장 (len(items) == 0 대신)

name = ""
print(name or "익명")       # => '익명'  (기본값 관용구)

3. and / or 단축 평가

# and: 첫 falsy 를, 없으면 마지막 값을 반환
1 and 2            # => 2
0 and 2            # => 0
"" and foo()       # foo() 는 호출조차 안 됨

# or: 첫 truthy 를, 없으면 마지막 값을 반환
None or [] or "fallback"   # => 'fallback'

# 조건부 값
status = "on" if enabled else "off"

4. == 와 is

a = [1, 2, 3]
b = [1, 2, 3]
a == b     # => True   (값이 같은가)
a is b     # => False  (같은 객체인가)

x = None
x is None  # => True   (None 비교는 항상 is)
is 는 정체성 비교
  • None, True, False 비교에만 is 사용
  • 작은 정수(-5~256)·짧은 문자열은 캐시되어 is 가 우연히 True — 신뢰 금지
  • 값 비교는 언제나 ==

5. 비교 체이닝

age = 20
18 <= age < 65           # => True   (18 <= age and age < 65)

# 정렬 가능 여부: 같은 타입끼리만
# 1 < "2"                # TypeError (3.x)
(1, 2) < (1, 3)          # => True   (튜플은 사전식 비교)

6. None 활용

def find(seq, target):
    for i, v in enumerate(seq):
        if v == target:
            return i
    return None            # "못 찾음"

idx = find([1, 2], 9)
if idx is not None:
    ...

# 가변 기본인자 회피 패턴
def add(item, bucket=None):
    if bucket is None:
        bucket = []
    bucket.append(item)
    return bucket
"There should be one — and preferably only one — obvious way to do it"