📌 오늘 학습한 내용
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하고, 괜히 있어 보입니다.
솔직히 말해, 이런 코드를 한 번에 생각해서 쓰는 사람은 마법사 클럽 전속 마법사라고 생각합니다.
저도 빨리 저 마법사 클럽에 입문하고 싶네요. 🧙♂️
'Python > Python 문제 풀이' 카테고리의 다른 글
💡파이썬에서 두 수 곱의 최댓값 구하기: 정렬 vs 루프 vs remove 방식 비교 (0) | 2025.04.30 |
---|---|
⚡Pythonic하게 //, %, divmod() 처리하기: Simple is better than complex! (0) | 2025.04.30 |
비트 토글 문제 해결기 - module 없이 얼마나 Pythonic하게 풀 수 있을까? (0) | 2025.04.24 |