while 문
조건이 True인 동안 반복 실행합니다.
반복 횟수가 정해지지 않고 특정 조건이 충족될 때까지 반복해야 할 때 사용합니다.
count = 0
while count < 5:
print(count)
count += 1
# 0 1 2 3 4
break와 continue
# break: 반복문 즉시 종료
count = 0
while True:
if count >= 5:
break
print(count)
count += 1
# continue: 현재 반복을 건너뛰고 다음 반복으로
count = 0
while count < 10:
count += 1
if count % 2 == 0:
continue
print(count) # 홀수만 출력: 1 3 5 7 9
while True는 무한 루프를 만들며, 반드시 내부에 break 조건이 있어야 합니다.
조건 없이 사용하면 프로그램이 종료되지 않습니다.
while else
while 문에 else를 붙이면 break 없이 조건이 False가 되어 정상 종료될 때 실행됩니다.
attempts = 0
while attempts < 3:
response = input("y/n: ")
if response == "y":
print("확인됨")
break
attempts += 1
else:
print("3회 시도 초과")
for 문
반복 가능한(iterable) 객체의 요소를 순서대로 꺼내면서 반복합니다.
리스트, 튜플, 문자열, 딕셔너리, 파일 등이 모두 반복 가능한 객체입니다.
genes = ["BRCA1", "TP53", "EGFR"]
for gene in genes:
print(gene)
# BRCA1
# TP53
# EGFR
range()
숫자 범위를 반복할 때 사용합니다.
for i in range(5): # 0, 1, 2, 3, 4
print(i)
for i in range(1, 6): # 1, 2, 3, 4, 5
print(i)
for i in range(0, 10, 2): # 0, 2, 4, 6, 8
print(i)
for i in range(5, 0, -1): # 5, 4, 3, 2, 1 (역순)
print(i)
enumerate()
인덱스와 값을 함께 가져올 때 사용합니다.
samples = ["sample_01", "sample_02", "sample_03"]
for i, sample in enumerate(samples):
print(f"{i}: {sample}")
# 0: sample_01
# 1: sample_02
# 2: sample_03
# 시작 인덱스 지정
for i, sample in enumerate(samples, start=1):
print(f"{i}: {sample}")
# 1: sample_01
zip()
두 개 이상의 iterable을 묶어서 같은 인덱스끼리 짝지어 반복합니다.
samples = ["sample_01", "sample_02", "sample_03"]
coverages = [30.5, 22.1, 45.8]
for sample, cov in zip(samples, coverages):
print(f"{sample}: {cov}x")
# sample_01: 30.5x
# sample_02: 22.1x
# sample_03: 45.8x
길이가 다른 경우 짧은 쪽에 맞춰 종료됩니다. 남은 요소까지 처리하려면 itertools.zip_longest를 사용합니다.
딕셔너리 순회
gene_expression = {"BRCA1": 12.5, "TP53": 8.3, "EGFR": 21.0}
# 키만 순회 (기본)
for gene in gene_expression:
print(gene)
# 키와 값 함께 순회
for gene, expr in gene_expression.items():
print(f"{gene}: {expr}")
# 값만 순회
for expr in gene_expression.values():
print(expr)
문자열 순회
seq = "ATCGATCG"
for base in seq:
print(base) # A T C G A T C G
# GC 함량 계산
gc_count = sum(1 for base in seq if base in "GC")
gc_content = gc_count / len(seq)
break, continue, else
for 문에서도 break와 continue를 사용할 수 있으며, else는 break 없이 반복이 완료됐을 때 실행됩니다.
genes = ["BRCA1", "TP53", "EGFR", "KRAS"]
# break: 특정 조건에서 반복 중단
for gene in genes:
if gene == "EGFR":
print("EGFR 발견, 중단")
break
print(gene)
# continue: 특정 항목 건너뜀
for gene in genes:
if gene == "TP53":
continue
print(gene) # TP53 제외 출력
# else: break 없이 완료됐을 때 실행
for gene in genes:
if gene == "MYC":
break
else:
print("MYC 없음") # 출력됨
중첩 for 문
samples = ["sample_01", "sample_02"]
genes = ["BRCA1", "TP53"]
for sample in samples:
for gene in genes:
print(f"{sample} - {gene}")
# sample_01 - BRCA1
# sample_01 - TP53
# sample_02 - BRCA1
# sample_02 - TP53
중첩 반복문에서 break는 가장 가까운 반복문만 종료합니다. 바깥쪽 반복문까지 한꺼번에 종료하려면 플래그 변수나 함수화(return)를 사용합니다.
컴프리헨션 (Comprehension)
반복문을 이용해 컬렉션을 간결하게 생성하는 파이썬 특유의 문법입니다.
리스트 컴프리헨션
# 기본 형태
[표현식 for 변수 in iterable]
[표현식 for 변수 in iterable if 조건]
# 기본 예시
squares = [x**2 for x in range(1, 6)]
# [1, 4, 9, 16, 25]
# 조건 추가
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
# [4, 16, 36, 64, 100]
# 생물정보학 예시: 커버리지 30x 이상인 샘플 추출
coverages = {"sample_01": 30.5, "sample_02": 18.2, "sample_03": 45.8}
high_cov = [s for s, cov in coverages.items() if cov >= 30]
# ['sample_01', 'sample_03']
# 문자열 처리
gene_list = [" brca1 ", " tp53 ", " egfr "]
cleaned = [g.strip().upper() for g in gene_list]
# ['BRCA1', 'TP53', 'EGFR']
딕셔너리 컴프리헨션
{키: 값 for 변수 in iterable}
# 리스트로 딕셔너리 생성
genes = ["BRCA1", "TP53", "EGFR"]
expr_values = [12.5, 8.3, 21.0]
expr_dict = {gene: val for gene, val in zip(genes, expr_values)}
# {'BRCA1': 12.5, 'TP53': 8.3, 'EGFR': 21.0}
# 조건 필터링
high_expr = {gene: val for gene, val in expr_dict.items() if val >= 10}
# {'BRCA1': 12.5, 'EGFR': 21.0}
셋 컴프리헨션
{표현식 for 변수 in iterable}
gene_list = ["TP53", "BRCA1", "TP53", "EGFR", "BRCA1"]
unique_genes = {gene for gene in gene_list}
# {'TP53', 'BRCA1', 'EGFR'}
제너레이터 표현식
소괄호를 사용하면 리스트 대신 제너레이터를 생성합니다. 리스트 컴프리헨션과 달리 값을 한 번에 메모리에 올리지 않고 필요할 때 하나씩 생성합니다. 대용량 데이터를 처리할 때 메모리 효율이 좋습니다.
# 리스트 컴프리헨션: 모든 값을 메모리에 저장
squares_list = [x**2 for x in range(1000000)]
# 제너레이터 표현식: 필요할 때 하나씩 생성
squares_gen = (x**2 for x in range(1000000))
# sum, max, min 등에 바로 넘길 수 있음
total = sum(x**2 for x in range(1000))
# FASTQ 파일처럼 큰 파일을 줄 단위로 처리할 때 유용
with open("sample.fastq") as f:
seq_lengths = (len(line.strip()) for line in f if not line.startswith("@"))
컴프리헨션 가독성 주의
컴프리헨션은 간결하지만 너무 복잡하게 작성하면 오히려 가독성이 떨어집니다. 조건이 많거나 중첩이 깊어지는 경우에는 일반 for 문으로 작성하는 것이 낫습니다.
# 읽기 어려운 컴프리헨션
result = [f(x) for x in data if condition1(x) if condition2(x)]
# 일반 for 문으로 작성
result = []
for x in data:
if condition1(x) and condition2(x):
result.append(f(x))
정리표
| 구분 | 형태 | 사용 시점 |
| while | 조건 기반 반복 | 반복 횟수가 정해지지 않은 경우 |
| for | iterable 순회 | 반복 횟수나 대상이 정해진 경우 |
| range() | 숫자 범위 반복 | 인덱스 기반 반복 |
| enumerate() | 인덱스 + 값 | 인덱스가 함께 필요한 경우 |
| zip() | 여러 iterable 병렬 순회 | 같은 위치끼리 묶어 처리 |
| 리스트 컴프리헨션 | [식 for ... if ...] | 리스트를 간결하게 생성 |
| 딕셔너리 컴프리헨션 | {k: v for ... if ...} | 딕셔너리를 간결하게 생성 |
| 제너레이터 표현식 | (식 for ... if ...) | 대용량 데이터, 메모리 효율 필요 시 |
'BI&Programming-Tools > Python' 카테고리의 다른 글
| [파이썬 기초] 함수 정의와 인자 (*args, **kwargs) (0) | 2026.06.16 |
|---|---|
| [파이썬 기초] 람다 함수와 내장 함수, collections 모듈 (0) | 2026.06.16 |
| [파이썬 기초] 조건문과 연산자 (0) | 2026.06.15 |
| [파이썬 기초] print / input / 주석 (0) | 2026.06.15 |
| [파이썬 기초] 딕셔너리, 셋, 불리언 (0) | 2026.06.15 |
