[파이썬 기초] 반복문 (while, for, comprehension)

2026. 6. 16. 18:00·BI&Programming-Tools/Python

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
'BI&Programming-Tools/Python' 카테고리의 다른 글
  • [파이썬 기초] 함수 정의와 인자 (*args, **kwargs)
  • [파이썬 기초] 람다 함수와 내장 함수, collections 모듈
  • [파이썬 기초] 조건문과 연산자
  • [파이썬 기초] print / input / 주석
데이터로 읽는 생명
데이터로 읽는 생명
is-note 님의 블로그 입니다.
  • 데이터로 읽는 생명
    In Silico Note
    데이터로 읽는 생명
  • 전체
    오늘
    어제
    • 분류 전체보기 (190)
      • Bio-Knowledge (16)
        • 분자생물학 & 유전학 기초 (0)
        • 전사체학 & 유전자 발현 (0)
        • 구조생물학 & 단백질 (0)
        • 싱글셀 & 다중오믹스 (0)
        • 임상유전학 & 질환 데이터 (0)
      • Programming (4)
        • API (4)
      • BI&Programming-Tools (111)
        • File Formats (14)
        • Linux & Bash Script (38)
        • Python (35)
        • R (11)
        • 통계 (8)
        • Pipeline Manager (0)
        • Etc (5)
      • Bio Data Analysis (28)
        • 서열분석개론 (6)
        • WGS(Whole Genome Seq) (11)
        • WES(Whole Exome Seq) (2)
        • RNA-Seq (4)
        • Metagenome (2)
        • Non-human Resequencing (1)
        • 임상유전체 분석 (1)
        • Multi-Omics (1)
      • Bio-Trends & Tech (1)
      • 코딩테스트 연습 (30)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    GATK
    ngs
    통계
    파이썬연습
    코딩테스트
    파일포맷
    wgs
    bioinformatics
    리눅스
    파이썬기초
    리눅스기초
    R기초
    FASTQ
    데이터분석
    유전체분석
    분자생물학
    생물정보학
    파이썬
    R
    fasta
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
데이터로 읽는 생명
[파이썬 기초] 반복문 (while, for, comprehension)
상단으로

티스토리툴바