[python] for문과 items(), range(), enumerate(), zip(), 컴프리헨션

for 문

test_list = ['one', 'two', 'three']
for i in test_list:
    print(i)
    
# one
# two
# three
  • 반복 가능한 자료형의 요소를 하나씩 변수에 대입하며 반복 수행함.
  • if, continue, break, 중첩 for문 모두 가능하다.
  • for 변수 in 반복_가능_객체:
  • **수행할_문장1** **수행할_문장2**
a = [(1,2), (3,4), (5,6)]
for (x, y) in a:
    print(x + y)
    
# 3
# 7
# 11

리스트, 튜플, 문자열 등을 반복 가능 객체사용 가능하다.

 

 

주의할점. for문에서 임시변수를 아무리 바꿔도 원본 객체의 값은 변하지 않는다.

numbers = [10, 20, 30]

for n in numbers:
    n = n + 5
    print("임시변수 n:", n)

print("원본 numbers:", numbers)

왜냐하면 임시변수는 “원본 데이터를 담은 새로운 변수”일 뿐,
원래 객체 내부의 요소를 가리키는 참조(reference)가 아니기 때문.

 

 

items()

students = {
    "철수": {"국어":100, "수학":90},
    "영희": {"국어":95, "수학":85},
}

for name in students:  # 철수 영희
		print(name)

for name, student in students:  # ❌ 에러
    print(name, student)
    
for name, student in students.items():
    print(name, student)
    
    # 철수 {'국어': 100, '수학': 90}
    # 영희 {'국어': 95, '수학': 85}
  • 디셔너리를 그냥 반복하면 name에는 키(key) 하나만 들어감
  • name, student 처럼 두 개를 받으려고 하면 Python은 튜플 언패킹을 시도하는데, 반복 값이 **하나(key)**뿐이므로 언패킹할 수 없어서 오류가 납니다.
  • 키와 값을 두 개를 받고 싶다면 .items()를 활용해야 합니다.

 

 

range()

숫자 시퀀스를 만들어주는 내장 함수로 주로 for문과 함께 사용한다.

range(끝)                  # 0부터 끝-1까지
range(시작, 끝)             # 시작부터 끝-1까지
range(시작, 끝, 증가값)      # 시작부터 끝-1까지, 증가값만큼 증가

0부터 4까지 반복

for i in range(5): # 0, 1, 2, 3, 4

1부터 5까지 반복

for i in range(1, 6): # 1, 2, 3, 4, 5

0부터 10까지 2씩 증가

for in range(0, 11, 2): #0, 2, 4, 6, 8, 10

for i in range(2, 10):          # 2단~9단
    for j in range(1, 10):      # 1~9 곱
        print(f"{i}x{j}={i*j}", end="\\t")
    print()                     # 단 끝나면 줄바꿈
    
# 2 4 6 8 10 12 14 16 18 
# 3 6 9 12 15 18 21 24 27 
# 4 8 12 16 20 24 28 32 36
# 5 10 15 20 25 30 35 40 45
# 6 12 18 24 30 36 42 48 54 
# 7 14 21 28 35 42 49 56 63 
# 8 16 24 32 40 48 56 64 72 
# 9 18 27 36 45 54 63 72 81

 

 

enumerate()

리스트/튜플 순회 시 인덱스와 값 동시에 사용

fruits = ['apple','banana']
for idx, fruit in enumerate(fruits):
    print(idx, fruit)
    
# 0 apple
# 1 banana

for idx, fruit in enumerate(fruits, **1):**

라고 사용하면 시작 번호를 1부터 시작한다.

값: 1 apple

   2 banana

 

 

zip()

두 개 이상의 리스트를 동시에 순회하고 싶을 때는 zip 함수를 사용한다.

names = ['홍길동', '김철수', '이영희']
korean = [85, 92, 78]
english = [90, 88, 95]
for name, kor, eng in zip(names, korean, english):
    print(f"{name}: 국어 {kor}점, 영어 {eng}점")

# 홍길동: 국어 85점, 영어 90점
# 김철수: 국어 92점, 영어 88점
# 이영희: 국어 78점, 영어 95점

 

 

컴프리헨션

리스트 컴프리헨션

리스트 안에 for 문을 포함하는 **리스트 컴프리헨션(list comprehension)**을 사용하면 좀 더 편리하고 직관적인 프로그램을 만들 수 있다.

[표현식 for 항목 in 반복_가능_객체 if 조건문]

a = [1,2,3,4]
result = [num * 3 for num in a]
print(result)

# [3, 6, 9, 12]

표현식: num*3

for

항목: num

in

반복_가능_객체: a

a = [1,2,3,4]
result = [num * 3 for num in a if num % 2 == 0]
print(result)
# [6, 12]

표현식: num*3

for

항목: num

in

반복_가능_객체: a

if

조건문: num % 2 == 0

 

 

딕셔너리 컴프리헨션

{key_expr: value_expr for item in iterable if 조건식}
  • key_expr → 딕셔너리 키
  • value_expr → 딕셔너리 값
  • iterable → 반복 가능한 객체
  • if 조건식 → 선택적으로 조건 필터링

 

 

예제 코드)

# 점수 → 학점 변환 함수
def get_grade(score):
    if score < 60:
        return "F"
    elif score < 70:
        return "D"
    elif score < 80:
        return "C"
    elif score < 90:
        return "B"
    else:
        return "A"

# 학생별 점수 데이터
scores = {
    "철수": {"국어": 90, "수학": 95, "영어": 78, "과학": 55},
    "짱구": {"국어": 60, "수학": 85, "영어": 40, "과학": 75}
}

# 학생별 성적표 데이터 생성 함수
def get_student_report(scores_dict):
    report = {}
    for name, subjects in scores_dict.items():
        report[name] = {subject: get_grade(score) for subject, score in subjects.items()}
    return report

# 출력 전용 함수
def print_report(scores_dict):
    report = get_student_report(scores_dict)
    for name, subjects in report.items():
        print(f"학생 이름: {name}")
        for subject, grade in subjects.items():
            print(f" - {subject}: {scores_dict[name][subject]}점 ({grade})")
        print("-" * 40)

# 실행
print_report(scores)