여러분이 사용하고 계신 브라우저는 HTML5를 지원하지 않기 때문에 몇몇 요소가 제대로 보이도록 JScript를 사용하고 있습니다. 하지만 여러분의 브라우저 설정에서 스크립트 기능이 꺼져있으므로, 현재 페이지를 제대로 확인하시려면 스크립트 기능을 켜주셔야 합니다. Python - 다중 변수

Python – 다중 변수

3주전 작성

Python 다중 변수

Python에서는 한 번에 여러 변수에 값을 할당하는 다양한 방법을 제공한다. 이러한 기능을 사용하면 코드를 더 간결하고 효율적으로 작성할 수 있으며, 특히 데이터를 다룰 때 매우 유용하다.

여러 변수에 여러 값 할당

Python에서는 한 줄로 여러 변수에 서로 다른 값을 할당할 수 있다.

기본 다중 할당

x, y, z = "Orange", "Banana", "Cherry"
print(x)
print(y)
print(z)

실행 결과는 다음과 같다.

Orange
Banana
Cherry

다양한 데이터 타입 할당

name, age, height, is_student = "홍길동", 25, 175.5, True
print(f"이름: {name}")
print(f"나이: {age}")
print(f"키: {height}cm")
print(f"학생 여부: {is_student}")

💡 다중 할당 주의사항:
• 변수의 개수와 값의 개수가 일치해야 한다
• 개수가 맞지 않으면 ValueError가 발생한다
• 순서대로 할당되므로 순서에 주의하자
• 가독성을 위해 너무 많은 변수를 한 번에 할당하지 말자

여러 변수에 같은 값 할당

여러 변수에 동일한 값을 할당할 때는 연쇄 할당을 사용한다.

기본 연쇄 할당

[code lang="python"]x = y = z = "Orange"
print(x)
print(y)
print(z)

모든 변수가 같은 값 "Orange"를 가진다.

숫자 연쇄 할당

a = b = c = 0
print(f"a = {a}, b = {b}, c = {c}")
# 각 변수를 개별적으로 수정 가능
a = 10
print(f"a = {a}, b = {b}, c = {c}")

연쇄 할당 주의사항

가변 객체(리스트, 딕셔너리 등)의 연쇄 할당은 주의가 필요하다.

[code lang="python"]# 주의: 같은 리스트 객체를 참조
list1 = list2 = list3 = []
list1.append(1)
print(f"list1: {list1}") # [1]
print(f"list2: {list2}") # [1] - 같은 객체를 참조
print(f"list3: {list3}") # [1] - 같은 객체를 참조
# 올바른 방법: 각각 다른 리스트 생성
list1 = []
list2 = []
list3 = []

컬렉션에서 값 언패킹

리스트, 튜플 등의 컬렉션에서 값을 추출하여 여러 변수에 할당할 수 있다. 이를 언패킹(Unpacking)이라고 한다.

리스트 언패킹

[code lang="python"]fruits = ["apple", "banana", "cherry"]
x, y, z = fruits
print(x) # apple
print(y) # banana
print(z) # cherry

튜플 언패킹

coordinates = (10, 20)
x, y = coordinates
print(f"x 좌표: {x}")
print(f"y 좌표: {y}")
# 3차원 좌표
point_3d = (5, 10, 15)
x, y, z = point_3d
print(f"3D 좌표: ({x}, {y}, {z})")

문자열 언패킹

문자열도 시퀀스이므로 언패킹할 수 있다.

[code lang="python"]word = "ABC"
a, b, c = word
print(a) # A
print(b) # B
print(c) # C

언패킹 오류 처리

언패킹 시 변수 개수와 값의 개수가 맞지 않으면 오류가 발생한다.

개수 불일치 오류

# 오류 발생 예제
fruits = ["apple", "banana", "cherry"]
# x, y = fruits # ValueError: too many values to unpack
# x, y, z, w = fruits # ValueError: not enough values to unpack
# 올바른 사용
x, y, z = fruits
print(f"과일들: {x}, {y}, {z}")

안전한 언패킹

[code lang="python"]def safe_unpack(data, expected_count):
"""안전한 언패킹을 위한 함수"""
if len(data) != expected_count:
raise ValueError(f"Expected {expected_count} values, got {len(data)}")
return data
# 사용 예제
try:
fruits = ["apple", "banana"]
x, y, z = safe_unpack(fruits, 3)
except ValueError as e:
print(f"오류: {e}")
# 기본값으로 처리
x, y = fruits
z = "default"
print(f"처리된 값: {x}, {y}, {z}")

별표(*) 연산자를 이용한 언패킹

Python 3에서는 별표 연산자를 사용하여 나머지 값들을 하나의 변수에 할당할 수 있다.

기본 별표 언패킹

[code lang="python"]numbers = [1, 2, 3, 4, 5]
first, *middle, last = numbers
print(f"첫 번째: {first}") # 1
print(f"중간 값들: {middle}") # [2, 3, 4]
print(f"마지막: {last}") # 5

다양한 별표 언패킹 패턴

# 앞의 몇 개만 추출
data = [1, 2, 3, 4, 5, 6, 7]
first, second, *rest = data
print(f"첫 번째: {first}, 두 번째: {second}")
print(f"나머지: {rest}")
# 뒤의 몇 개만 추출
*beginning, second_last, last = data
print(f"마지막 두 개: {second_last}, {last}")
print(f"앞의 값들: {beginning}")
# 중간 값들 무시
first, *_, last = data
print(f"첫 번째와 마지막: {first}, {last}")

문자열과 별표 언패킹

[code lang="python"]word = "PYTHON"
first, *middle, last = word
print(f"첫 글자: {first}") # P
print(f"중간 글자들: {middle}") # ['Y', 'T', 'H', 'O']
print(f"마지막 글자: {last}") # N

중첩된 구조 언패킹

중첩된 리스트나 튜플도 언패킹할 수 있다.

중첩 튜플 언패킹

# 사용자 정보: (이름, (나이, 키))
user_info = ("홍길동", (25, 175))
name, (age, height) = user_info
print(f"이름: {name}")
print(f"나이: {age}")
print(f"키: {height}cm")
# 좌표 정보: [(x1, y1), (x2, y2)]
points = [(10, 20), (30, 40)]
(x1, y1), (x2, y2) = points
print(f"점1: ({x1}, {y1})")
print(f"점2: ({x2}, {y2})")

딕셔너리와 언패킹

# 딕셔너리 키 언패킹
person = {"name": "홍길동", "age": 25, "city": "서울"}
name, age, city = person.values()
print(f"이름: {name}, 나이: {age}, 도시: {city}")
# 딕셔너리 아이템 언패킹
for key, value in person.items():
print(f"{key}: {value}")

함수 반환값 언패킹

함수가 여러 값을 반환할 때 언패킹을 사용하여 각각의 변수에 할당할 수 있다.

여러 값을 반환하는 함수

def get_user_info():
"""사용자 정보를 반환하는 함수"""
return "홍길동", 25, "서울", True
# 언패킹으로 각 값을 받기
name, age, city, is_active = get_user_info()
print(f"이름: {name}")
print(f"나이: {age}")
print(f"도시: {city}")
print(f"활성 상태: {is_active}")

수학 계산 함수 예제

def calculate_stats(numbers):
"""숫자 리스트의 통계를 계산하는 함수"""
total = sum(numbers)
count = len(numbers)
average = total / count if count > 0 else 0
minimum = min(numbers) if numbers else 0
maximum = max(numbers) if numbers else 0
return total, count, average, minimum, maximum
# 함수 사용
data = [10, 20, 30, 40, 50]
total, count, avg, min_val, max_val = calculate_stats(data)
print(f"합계: {total}")
print(f"개수: {count}")
print(f"평균: {avg:.2f}")
print(f"최솟값: {min_val}")
print(f"최댓값: {max_val}")

변수 교환 (Swapping)

Python에서는 임시 변수 없이 간단하게 변수 값을 교환할 수 있다.

두 변수 교환

a = 10
b = 20
print(f"교환 전: a={a}, b={b}")
# Python의 우아한 변수 교환
a, b = b, a
print(f"교환 후: a={a}, b={b}")

여러 변수 순환

x, y, z = 1, 2, 3
print(f"원래: x={x}, y={y}, z={z}")
# 순환 교환
x, y, z = y, z, x
print(f"순환 후: x={x}, y={y}, z={z}")
# 역순으로 변경
x, y, z = z, y, x
print(f"역순: x={x}, y={y}, z={z}")

실용적인 활용 예제

다중 변수 할당의 실제 활용 사례들을 살펴보자.

CSV 데이터 처리

# CSV 한 줄을 파싱하는 예제
csv_line = "홍길동,25,서울,개발자,5000"
name, age, city, job, salary = csv_line.split(",")
# 데이터 타입 변환
age = int(age)
salary = int(salary)
print(f"이름: {name}")
print(f"나이: {age}세")
print(f"거주지: {city}")
print(f"직업: {job}")
print(f"급여: {salary:,}원")

좌표 계산

# 두 점 사이의 거리 계산
import math
point1 = (0, 0)
point2 = (3, 4)
x1, y1 = point1
x2, y2 = point2
distance = math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
print(f"점 ({x1}, {y1})과 점 ({x2}, {y2}) 사이의 거리: {distance}")

시간 데이터 처리

from datetime import datetime
# 현재 시간을 여러 변수로 분해
now = datetime.now()
year, month, day = now.year, now.month, now.day
hour, minute, second = now.hour, now.minute, now.second
print(f"날짜: {year}년 {month}월 {day}일")
print(f"시간: {hour}시 {minute}분 {second}초")
# 시간 문자열 파싱
time_string = "2024-03-15 14:30:45"
date_part, time_part = time_string.split(" ")
year, month, day = date_part.split("-")
hour, minute, second = time_part.split(":")
print(f"파싱된 날짜: {year}/{month}/{day}")
print(f"파싱된 시간: {hour}:{minute}:{second}")

고급 언패킹 기법

더 복잡한 상황에서의 언패킹 활용법을 알아보자.

조건부 언패킹

def process_data(data):
"""데이터 길이에 따른 조건부 처리"""
if len(data) >= 3:
first, second, *rest = data
print(f"첫 번째: {first}, 두 번째: {second}")
if rest:
print(f"나머지: {rest}")
elif len(data) == 2:
first, second = data
print(f"두 개 값: {first}, {second}")
elif len(data) == 1:
first, = data # 튜플 언패킹을 위한 쉼표
print(f"하나 값: {first}")
else:
print("데이터가 없습니다")
# 테스트
process_data([1, 2, 3, 4, 5])
process_data([1, 2])
process_data([1])
process_data([])

중첩 함수 호출과 언패킹

def get_name_age():
return "홍길동", 25
def get_address():
return "서울", "강남구", "12345"
# 중첩 언패킹
(name, age), (city, district, postal) = get_name_age(), get_address()
print(f"이름: {name}, 나이: {age}")
print(f"주소: {city} {district} (우편번호: {postal})")

💡 다중 변수 활용 팁:
• 가독성을 위해 관련된 변수들만 함께 할당하자
• 별표 연산자는 필요한 경우에만 사용하자
• 언패킹 시 변수명을 의미 있게 지정하자
• 복잡한 중첩 구조는 단계별로 나누어 처리하자
• 오류 처리를 고려하여 안전한 언패킹을 구현하자

성능과 메모리 고려사항

다중 변수 할당 시 성능과 메모리 사용에 대한 고려사항이다.

효율적인 변수 교환

import time
# 전통적인 방법 (임시 변수 사용)
def swap_traditional(a, b):
temp = a
a = b
b = temp
return a, b
# Python의 튜플 언패킹 방법
def swap_pythonic(a, b):
a, b = b, a
return a, b
# 성능 비교 (참고용)
a, b = 1000000, 2000000
start = time.time()
for _ in range(1000000):
a, b = swap_pythonic(a, b)
pythonic_time = time.time() - start
print(f"Python 방식 시간: {pythonic_time:.4f}초")

Python의 다중 변수 할당 기능을 활용하면 코드를 더 간결하고 읽기 쉽게 만들 수 있다. 특히 데이터 처리, 함수 반환값 처리, 변수 교환 등에서 매우 유용하다.

참고
Mingg`s Diary
밍구
공부 목적 블로그