students={
'대한이' : 85,
'민국이' : 72,
'행복이' : 91,
'사랑이' : 68,
'기쁨이' : 97
}
for student, score in students.items():
print(f'{student} : {score}')
total_score=0
for score in students.values():
total_score += score
average_score = total_score / len(students)
print(f'전체 학생들의 평균 점수 : {average_score:.2f}')
결과)
대한이 : 85
민국이 : 72
행복이 : 91
사랑이 : 68
기쁨이 : 97
전체 학생들의 평균 점수 : 82.60
파이썬 소스 및 결과값입니다. 소스설명)
이 파이썬 코드는 'students' 딕셔너리에 저장된 학생들의 이름과 점수를 출력하고, 이들의 평균 점수를 계산하여 출력하는 프로그램입니다. 코드는 크게 두 부분으로 나뉘는데, 첫 번째 부분은 각 학생의 점수를 출력하고, 두 번째 부분은 모든 학생의 총점과 평균을 계산합니다.
소스 코드 상세 설명
1. 학생 점수 출력 부분
for student, score in students.items():
print(f'{student} : {score}')
- for student, score in students.items():: 이 코드는 students 딕셔너리의 모든 키-값 쌍을 순회합니다. items() 메서드는 딕셔너리의 각 항목을 (키, 값) 형태의 튜플로 반환합니다. 여기서는 각 튜플의 첫 번째 요소인 키(학생 이름)는 student 변수에, 두 번째 요소인 값(점수)은 score 변수에 할당됩니다.
- print(f'{student} : {score}'): f-string (포맷팅된 문자열 리터럴)을 사용하여 현재 순회 중인 학생의 이름과 점수를 이름 : 점수 형식으로 깔끔하게 출력합니다.
2. 평균 점수 계산 및 출력 부분
total_score=0
for score in students.values():
total_score += score
average_score = total_score / len(students)
print(f'전체 학생들의 평균 점수 : {average_score:.2f}')
- total_score=0: 학생들의 총점을 계산하기 위해 total_score라는 변수를 0으로 초기화합니다.
- for score in students.values():: 이 코드는 students 딕셔너리의 모든 값(점수)만을 순회합니다. values() 메서드는 딕셔너리에 있는 모든 값들을 묶어서 반환하며, 각 점수는 순차적으로 score 변수에 할당됩니다.
- total_score += score: 순회할 때마다 현재 학생의 점수(score)를 total_score에 누적하여 더합니다. 이 과정을 통해 모든 학생의 점수를 합산하게 됩니다.
- average_score = total_score / len(students): 모든 학생의 점수를 합산한 total_score를 학생 수로 나눕니다. len(students)는 딕셔너리 students에 저장된 항목의 개수, 즉 학생 수를 반환합니다. 이 연산으로 평균 점수가 계산됩니다.
- print(f'전체 학생들의 평균 점수 : {average_score:.2f}'): 계산된 평균 점수를 f-string을 사용하여 출력합니다. :.2f는 소수점 둘째 자리까지 표시하도록 형식을 지정하는 포맷팅 옵션입니다. 이 때문에 결과값이 82.60으로 출력됩니다.
기초질문)
students={
'대한이' : 85,
'민국이' : 72,
'행복이' : 91,
'사랑이' : 68,
'기쁨이' : 97
}는 가로로 쓰나 세로로 쓰나 상관없나요?
네, 파이썬에서 딕셔너리(dict)를 정의할 때 항목들을 가로로 한 줄에 나열하거나 세로로 여러 줄에 걸쳐 쓰는 것 모두 가능하며 기능상 차이는 전혀 없습니다.
가로로 쓰는 경우
students = {'대한이': 85, '민국이': 72, '행복이': 91, '사랑이': 68, '기쁨이': 97}
- 코드가 짧고 간결해 보입니다.
- 항목이 많지 않을 때 주로 사용됩니다.
세로로 쓰는 경우
students = {
'대한이': 85,
'민국이': 72,
'행복이': 91,
'사랑이': 68,
'기쁨이': 97
}
- 각 항목을 명확하게 구분할 수 있어 가독성이 높아집니다.
- 특히 항목이 많아지거나 각 키-값 쌍이 길어질 때 코드를 보기 쉽게 만들어 줍니다.
두 방식 모두 파이썬이 문법적으로 올바르게 인식하므로, 코드를 작성하는 사람의 선호나 가독성 향상을 위해 선택하여 사용하면 됩니다.
질문)
for student, score in students.items():: 이 코드는 students 딕셔너리의 모든 키-값 쌍을 순회합니다. items() 메서드는 딕셔너리의 각 항목을 (키, 값) 형태의 튜플로 반환합니다. 여기서는 각 튜플의 첫 번째 요소인 키(학생 이름)는 student 변수에, 두 번째 요소인 값(점수)은 score 변수에 할당됩니다. 여기에서 키:값 이것이 for문 다음의 변수에 키와 값이 student, score라는 두 변수에 각각 할당이 되는게 문법적으로 약속인가요?
네, 맞습니다. for ... in 구문을 사용하여 딕셔너리의 items() 메서드를 순회할 때, (키, 값) 형태의 튜플이 반환되고 이를 두 변수에 할당하는 것은 파이썬의 문법적 약속입니다. 이 원리는 튜플 언패킹(tuple unpacking)이라는 파이썬의 핵심 기능에 기반을 둡니다.
튜플 언패킹의 원리
파이썬에서 여러 개의 변수에 여러 개의 값을 한 번에 할당하는 것을 언패킹이라고 합니다. items() 메서드는 (키, 값) 형태의 튜플을 하나씩 반환하는데, for student, score in ... 구문은 이 튜플을 자동으로 언패킹하여 첫 번째 값(키)을 student 변수에, 두 번째 값(값)을 score 변수에 할당해 줍니다.
예를 들어,
my_tuple = ('사과', 10)
fruit, quantity = my_tuple
이 코드는 my_tuple의 첫 번째 값인 '사과'를 fruit 변수에, 두 번째 값인 10을 quantity 변수에 할당합니다. for ... in students.items() 구문은 이 언패킹 과정을 순회하는 각 항목에 대해 반복하는 것과 같습니다.
이러한 문법적 약속 덕분에 코드를 훨씬 간결하고 가독성 높게 작성할 수 있습니다. 딕셔너리의 키와 값에 동시에 접근해야 할 때 매우 유용하게 사용됩니다.
질문)
언패킹이 키:값 이 각각 2개의 변수에 각각 할당하는 것을 의미하나요?
네, 언패킹(unpacking)은 여러 값을 가진 객체(예: 튜플, 리스트)에 들어있는 요소들을 여러 변수에 각각 할당하는 것을 의미합니다.
언패킹의 원리
파이썬에서 (키, 값) 형태의 튜플을 for 루프에서 순회할 때, 이 튜플에 담긴 첫 번째 값은 첫 번째 변수(student)에, 두 번째 값은 두 번째 변수(score)에 자동으로 할당됩니다. 이는 마치 보따리에 담긴 물건들을 하나씩 꺼내어 각각의 자리에 놓는 것과 비슷합니다.
예시
- 일반적인 튜플 언패킹:data 튜플의 첫 번째 요소는 name 변수에, 두 번째 요소는 age 변수에 할당됩니다.
-
Python
data = ('김철수', 30) name, age = data print(name) # 결과: 김철수 print(age) # 결과: 30 - 딕셔너리 items()와 언패킹:students.items()는 ('대한이', 85)와 ('민국이', 72)와 같은 튜플을 하나씩 생성합니다. 이 튜플들이 for 루프에서 자동으로 언패킹되어 student와 score 변수에 할당되는 것입니다.
-
Python
students = {'대한이': 85, '민국이': 72} for student, score in students.items(): print(f'이름: {student}, 점수: {score}')
질문
for문 다음에 items()에서 할당 받을 값이 2개인것을 알고 변수를 두개 입력해주는게 약속인가요? 한개나 세개를 변수로 넣으면 에러 나나요?
네, 맞습니다. for ... in students.items() 구문에서 items()가 반환하는 튜플의 요소 수와 동일한 개수의 변수를 입력하는 것이 약속입니다. 만약 변수 개수가 일치하지 않으면 에러가 발생합니다.
정확히 2개의 변수를 쓰는 이유
items() 메서드는 딕셔너리의 각 항목을 (키, 값) 형태의 두 요소를 가진 튜플로 반환합니다. 파이썬의 언패킹(unpacking) 규칙에 따라, 이 튜플의 첫 번째 요소는 첫 번째 변수에, 두 번째 요소는 두 번째 변수에 정확히 할당되어야 합니다.
변수 개수가 일치하지 않을 경우 발생하는 에러
- 변수가 1개일 경우: for 루프는 (키, 값) 튜플 전체를 하나의 변수에 할당하려고 시도합니다. 이 자체는 에러가 아니지만, 튜플 내부의 키와 값에 개별적으로 접근하려면 변수[0] 또는 변수[1]처럼 인덱스를 사용해야 해서 코드가 비효율적이고 복잡해집니다.
-
Python
# for item in students.items(): # print(item) # 결과: # ('대한이', 85) # ('민국이', 72) - 변수가 3개 이상일 경우: items()가 반환하는 튜플에는 두 개의 요소만 있는데, 세 개 이상의 변수에 할당하려 하기 때문에 ValueError가 발생합니다.위 에러 메시지는 "언패킹할 값이 충분하지 않습니다 (3개를 예상했지만, 2개를 받았습니다)"라는 의미입니다.
-
Python
# try: # for student, score, extra in students.items(): # print(student, score, extra) # except ValueError as e: # print(e) # 결과: not enough values to unpack (expected 3, got 2)
따라서 items() 메서드를 사용할 때는 반드시 두 개의 변수를 사용해야 키와 값을 각각 명확하게 할당받아 원하는 작업을 효율적으로 수행할 수 있습니다.
언패킹(Unpacking)을 한국어로 쉽게 외우려면 '보따리 풀기'나 '짐 풀기'로 생각하시면 가장 자연스럽습니다.
쉽게 이해하는 언패킹
- '패킹(Packing)'은 여러 물건을 하나의 보따리에 싸서 묶는 것입니다.
- 예: data = ('사과', '바나나')는 '사과'와 '바나나'를 data라는 보따리에 묶어 놓은 것입니다.
- '언패킹(Unpacking)'은 묶여 있는 보따리를 풀어 안에 있는 물건들을 각각의 자리에 놓는 것입니다.
- 예: fruit1, fruit2 = data는 data 보따리를 풀어 '사과'는 fruit1에, '바나나'는 fruit2에 놓는 것입니다.
따라서 "언패킹 = 보따리 풀기"로 기억하시면 파이썬 코드를 볼 때 개념을 더 쉽게 떠올릴 수 있습니다. students.items()가 (키, 값)이라는 '보따리'를 넘겨주면, for student, score가 이 보따리를 '풀어' 각각의 변수에 '짐'을 나누어 담는 과정이라고 생각해보세요.
'파이썬(Python)' 카테고리의 다른 글
| 파이썬, for, if, range함수, 3의 배수 제외한 숫자 합계 소스 (0) | 2025.09.07 |
|---|---|
| 파이썬, while문 소스, 정수 입력 덧셈 수행 소스 (0) | 2025.09.07 |
| 파이썬, 딕셔너리, 모든 key, value, item 반환, 메서드, 뷰(view) 객체 (0) | 2025.09.06 |
| 파이썬, for 변수 in 딕셔너리 / 메뉴와 가격 정보 출력 (0) | 2025.09.06 |
| 파이썬에서 for 변수 in 딕셔너리 구문 (0) | 2025.09.06 |
콘텐츠 내 자동삽입광고
