# Python len() 함수 완벽 가이드
## 개요
`len()` 함수는 Python의 내장 함수로, 객체의 길이(크기, 개수)를 반환합니다. 데이터 타입에 따라 다르게 작동하는 다재다능한 함수입니다.
## 기본 문법
```python
len(object)
```
- **매개변수**: 길이를 측정할 객체
- **반환값**: 정수(int) - 객체의 길이
## 데이터 타입별 동작
### 1. 리스트 (List)
리스트의 **요소 개수**를 반환합니다.
```python
# 기본 리스트
numbers = [1, 2, 3, 4, 5]
print(len(numbers)) # 5
# 중첩 리스트도 하나의 요소로 계산
nested = [[1, 2], [3, 4], [5, 6]]
print(len(nested)) # 3 (내부 리스트는 각각 하나의 요소)
# 빈 리스트
empty_list = []
print(len(empty_list)) # 0
```
### 2. 문자열 (String)
문자열의 **문자 개수**를 반환합니다.
```python
# 영문
text1 = "Hello"
print(len(text1)) # 5
# 한글 (한 글자당 1로 계산)
text2 = "안녕하세요"
print(len(text2)) # 5
# 공백과 특수문자 포함
text3 = "Hello World!"
print(len(text3)) # 12 (공백과 ! 포함)
# 이모지도 계산 (주의: 일부 이모지는 2로 계산될 수 있음)
text4 = "안녕 😊"
print(len(text4)) # 4
```
### 3. 딕셔너리 (Dictionary)
딕셔너리의 **키(key) 개수**를 반환합니다.
```python
# 기본 딕셔너리
person = {
"name": "홍길동",
"age": 30,
"city": "서울"
}
print(len(person)) # 3 (키가 3개)
# 중첩 딕셔너리
data = {
"users": {"john": 1, "jane": 2},
"posts": [1, 2, 3],
"settings": {}
}
print(len(data)) # 3 (최상위 키만 계산)
```
### 4. 집합 (Set)
집합의 **고유 요소 개수**를 반환합니다.
```python
# 중복이 있는 경우
numbers = {1, 2, 3, 3, 3, 4, 5}
print(len(numbers)) # 5 (중복 제거 후 개수)
# 문자 집합
chars = set("hello")
print(len(chars)) # 4 ({'h', 'e', 'l', 'o'})
```
### 5. 튜플 (Tuple)
튜플의 **요소 개수**를 반환합니다.
```python
# 기본 튜플
coordinates = (10, 20, 30)
print(len(coordinates)) # 3
# 단일 요소 튜플
single = (42,) # 쉼표 필수!
print(len(single)) # 1
```
### 6. 바이트 객체 (Bytes, Bytearray)
바이트의 **개수**를 반환합니다.
```python
# bytes
b_data = b"Hello"
print(len(b_data)) # 5
# bytearray
ba_data = bytearray(b"Hello")
print(len(ba_data)) # 5
# UTF-8 인코딩된 한글
korean = "안녕".encode('utf-8')
print(len(korean)) # 6 (한글은 UTF-8에서 3바이트씩)
```
### 7. range 객체
range의 **요소 개수**를 반환합니다.
```python
# 기본 range
r1 = range(10)
print(len(r1)) # 10 (0부터 9까지)
# 시작과 끝 지정
r2 = range(5, 15)
print(len(r2)) # 10 (5부터 14까지)
# 스텝 지정
r3 = range(0, 10, 2)
print(len(r3)) # 5 (0, 2, 4, 6, 8)
```
## 실전 활용 예시
### 1. 반복문에서 활용
```python
# 인덱스와 함께 순회
fruits = ["사과", "바나나", "딸기"]
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
```
### 2. 조건문에서 활용
```python
# 빈 컨테이너 확인
data = []
if len(data) == 0: # 또는 if not data:
print("데이터가 없습니다")
# 길이 제한 확인
password = "1234"
if len(password) < 8:
print("비밀번호는 8자 이상이어야 합니다")
```
### 3. 데이터 분석에서 활용
```python
# 텍스트 데이터 분석
text = "안녕하세요. 파이썬을 공부하고 있습니다."
words = text.split()
print(f"단어 수: {len(words)}") # 4
print(f"문자 수: {len(text)}") # 24
# 고유 문자 집합 크기 (vocab size)
unique_chars = set(text)
vocab_size = len(unique_chars)
print(f"사용된 고유 문자 수: {vocab_size}")
```
### 4. 머신러닝/딥러닝에서 활용
```python
# 데이터셋 크기 확인
dataset = ["문서1", "문서2", "문서3", "문서4", "문서5"]
train_size = int(0.8 * len(dataset))
train_data = dataset[:train_size]
test_data = dataset[train_size:]
print(f"전체 데이터: {len(dataset)}개")
print(f"훈련 데이터: {len(train_data)}개")
print(f"테스트 데이터: {len(test_data)}개")
# 배치 처리
batch_size = 32
num_batches = len(dataset) // batch_size
print(f"배치 수: {num_batches}")
```
## 성능 고려사항
### 시간 복잡도
- 대부분의 컨테이너: **O(1)** - 상수 시간
- 길이가 미리 저장되어 있어 매우 빠름
```python
# 큰 리스트도 즉시 길이 반환
huge_list = list(range(1000000))
import time
start = time.time()
length = len(huge_list)
end = time.time()
print(f"100만 개 요소의 길이 계산: {end - start:.10f}초")
# 거의 0초에 가까움
```
## 주의사항
### 1. len()을 지원하지 않는 객체
```python
# 제너레이터는 len() 불가
gen = (x for x in range(10))
# len(gen) # TypeError 발생!
# 대신 리스트로 변환
gen_list = list(gen)
print(len(gen_list)) # 10
```
### 2. 사용자 정의 클래스
```python
# __len__ 메서드 구현 필요
class MyList:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list)) # 5
```
### 3. None 값
```python
# None은 길이가 없음
value = None
# len(value) # TypeError 발생!
# 안전한 체크
if value is not None:
print(len(value))
```
## 실제 코드 예시 (GPT 프로젝트)
```python
# 한국어 문자 집합 생성
ko_text = "".join(data["train"]["document"])
ko_chars = sorted(list(set(ko_text)))
ko_vocab_size = len(ko_chars) # 2,701
# 이 값은 임베딩 테이블 크기 결정에 사용
embedding = nn.Embedding(ko_vocab_size, ko_vocab_size)
```
## 요약
> [!important]
> `len()` 함수는 Python에서 가장 자주 사용되는 내장 함수 중 하나로:
> - 데이터 타입에 따라 적절히 작동
> - O(1) 시간 복잡도로 매우 빠름
> - 데이터 분석, 머신러닝에서 필수적
> - 빈 컨테이너 확인, 반복 횟수 결정 등에 활용