기본 문법:
[표현식 for 변수 in 반복자]
# 기본
[x**2 for x in range(5)] # [0, 1, 4, 9, 16]
# 필터: 뒤에 if
[x for x in range(10) if x % 2 ==0] # [0, 2, 4, 6, 8]
# 삼항 표현식 (앞쪽): 값을 변환
[x if x > 0 else 0 for x in nums] # 음수는 0으로
# 중첩 반복 (for가 여러 개)
[(i, j) for i in range(2) for j in range(2)]
-> [(0, 0),(0, 1),(1, 0),(1, 1)]
# 중첩 리스트 평탄화 (flaten)
matrix = [[1,2], [3,4], [5,6]]
[x for row in matrix for x in row] # [1,2,3,4,5,6]
중첩 리스트 풀어서 보기:
matrix = [[1,2], [3,4], [5,6]]
result = []
for row in matrix:
for x in row:
result.append(x)
# [1,2,3,4,5,6]
dict / set comprehension
# dict
{**x**: **x**2** for x in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}
# key-value 뒤집기
d = {"a": 1, "b": 2}
{v: k for k, v in d.items()} # {1:"a", 2:"b"}
# set
{x % 3 for x in range(10)} # {0, 1, 2}
generator expression
()로 감싸면 제너레이터값을 미리 다 만들지 않고 필요할 때 하나씩 생성 → 메모리 효율적 (대용량 데이터)
gen = (x**2 for x in range(1000000)) # 메모리 거의 안 씀
sum(x**2 for x in range(100)) # 합계만 필요할 때
# list는 전부 메모리에 올림 / generator는 lazy
동작 구조:
total = sum(live_value for line in file) # 호출 1번
이 한 줄 안에서
1 읽음 -> 더함 -> 버림
2 읽음 -> 더함 -> 버림
.....
끝 -> 결과 반환
sum 을 쓰거나 for , list() 같은 걸 사용