기본 문법: [표현식 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 읽음 -> 더함 -> 버림
.....

끝 -> 결과 반환