Python/Python 문제 풀이

📌 'return result if result else None'을 몰랐던 나에게 바칩니다

THINKRUNNER 2025. 4. 22. 15:27

 

📌 오늘 학습한 내용

1. return result if result else None — 이건 대체 무슨 말이냐고요?

이 코드는 제가 직접 만든 코드를 Pythonic한 방법으로 고치는 과정에서 나온 코드의 마지막 줄입니다.

처음 봤을 때 저는 머릿속으로 이런 걸 떠올렸습니다.

"음... result라면 그걸 반환하고, 없으면 None을 준다...? 근데 왜 이게 되지? result는 언제나 있는데?"

고민 끝에 ChatGPT에게 물어봤습니다.

그랬더니 아주 친절하게 설명해주더군요.
파이썬에서는 문자열이 ‘비어있는 것’ 들은 False로 평가된다는 것이죠.

result = ''
이것은 result가 빈 문자열을 가진 변수라는 것을 의미하는데요, 이런 경우, if result는 False로 평가됩니다. 그래서 None을 반환하게 되죠죠.

return result if result else None은 아래와 같은 Python code로 표현할 수 있습니다:

if result != '':
    return result
else:
    return None
    

알고 나면 쉬워 보이네요.

2. Python에서 bool()이 False가 되는 경우

그래서, 이참에 정리해봤습니다.

파이썬에서 bool() 함수로 평가했을 때 False가 나오는 값들입니다.

  • 빈 문자열: ""
  • 빈 리스트: []
  • 빈 딕셔너리: {}
  • 빈 튜플: ()
  • 빈 세트: set()
  • 숫자 0 (int 또는 float)
  • None

이 외의 값들은 대부분 True입니다.
심지어 "False"라는 문자열도 True입니다. 문자열이니까요.

✔️ 정리하자면: “비어 있는 건 False다” 라고 기억하면 거의 모든 경우에 적용됩니다.

3. 시간복잡도 비교 – 내가 만든 코드 vs 개선된 코드

제가 처음 만든 코드는 이렇습니다.

def extract_numbers(s):
    digits = []
    for i in s:
        if i.isdigit():
            digits.append(i)
    result = ''.join(digits)
    if len(result) < 1:
        return None
    return result
    

ChatGPT가 개선해준 버전은 아래와 같습니다.

def extract_numbers(s):
    result = ''.join(i for i in s if i.isdigit())
    return result if result else None
    

시간복잡도를 비교하면 둘 다 O(N)입니다. 문자열 길이만큼 순회하니까요.

하지만 차이가 나는 부분은 다음과 같습니다.

  • 제 코드에는 불필요한 리스트(digits)를 생성하고 나중에 join()으로 문자열로 합칩니다. 이 과정에서 중간 리스트 객체가 메모리를 한 번 더 차지한다고 합니다.
  • 조건문도 명시적으로 if len(result) < 1:로 따로 처리하죠.
  • 반면 개선된 버전은 리스트 컴프리헨션 스타일로 곧장 처리하면서, join()에 제너레이터 표현식을 직접 넘겨줍니다.
    즉, 불필요한 리스트 생성을 피해서 메모리 사용량이 더 적습니다.
  • 마지막으로 개선된 버전은 마지막 한 줄로 존재 여부를 판단합니다. 조건문도 더 짧고 Pythonic하네요.
항목 내 코드 (리스트) 개선 코드 (제너레이터)
메모리 사용량 O(N) O(1) 수준 (lazy eval)
임시 객체 digits 리스트 없음
처리 방식 먼저 다 모은 후 join 하나씩 처리하며 join

→ 다행히도 시간복잡도는 같네요. 하지만 메모리 사용, 코드 길이, 가독성 면에서는 개선 코드가 더 우아하고 효율적입니다.

그리고 무엇보다... 짧고 멋집니다. (이게 진짜 중요하죠 🤓)

즉, 저 세 줄짜리 코드는 뭔가 더 우아하고, Pythonic하고, 괜히 있어 보입니다.

솔직히 말해, 이런 코드를 한 번에 생각해서 쓰는 사람은 마법사 클럽 전속 마법사라고 생각합니다.

저도 빨리 저 마법사 클럽에 입문하고 싶네요. 🧙‍♂️

작성일: 2025-04-22