출시·고도화 중
Python 안내서 · 3/6
Python에는 숫자, 문자열, 불리언 같은 기본 타입과 함께 리스트, 튜플, 딕셔너리, 집합이라는 강력한 내장 컬렉션이 있습니다. 이 장에서는 이 타입들을 언제 어떻게 쓰는지, 직접 타입을 만드는 클래스와 데이터클래스, 그리고 코드의 의도를 드러내는 타입 힌트를 다룹니다.
| 타입 | 예 | 설명 |
|---|---|---|
int | 42, 1_000_000 | 정수. 크기 제한이 없습니다 |
float | 3.14, 1e-3 | 부동소수점 수 |
str | "hello", '안녕' | 유니코드 문자열. 바꿀 수 없습니다 |
bool | True, False | 불리언 |
None | None | 값이 없음을 나타내는 유일한 값 |
7 / 2 # 3.5 (나눗셈은 항상 float)
7 // 2 # 3 (몫)
7 % 2 # 1 (나머지)
2 ** 100 # 아주 큰 정수도 정확히 계산합니다
text = "Python"
text[0] # 'P'
text[-1] # 'n'
text[1:4] # 'yth' (슬라이싱)
"py" in text.lower() # True
value = None
if value is None: # None 비교는 == 가 아니라 is 를 씁니다
print("값 없음")빈 문자열, 0, 빈 컬렉션, None은 조건식에서 거짓으로 취급됩니다. 그래서 if items:처럼 쓰면 "리스트가 비어 있지 않으면"이라는 뜻이 됩니다.
네 가지 내장 컬렉션은 쓰임새가 분명히 다릅니다.
list: 순서가 있고 바꿀 수 있는 목록입니다. 가장 많이 씁니다.tuple: 순서가 있지만 바꿀 수 없습니다. 좌표나 함수의 여러 반환값처럼 고정된 묶음에 씁니다.dict: 키로 값을 찾는 표입니다. 넣은 순서가 유지됩니다.set: 중복 없는 값의 모음입니다. 포함 여부 확인과 합집합·교집합 계산이 빠릅니다.nums = [3, 1, 2]
nums.append(4)
nums.sort() # [1, 2, 3, 4]
point = (10, 20)
x, y = point # 튜플 풀기
ages = {"mina": 31, "joon": 28}
ages["sara"] = 25
ages.get("tom", 0) # 키가 없으면 기본값 0
for name, age in ages.items():
print(name, age)
tags = {"python", "web", "python"}
tags # {'python', 'web'}
tags & {"web", "api"} # {'web'} (교집합)리스트와 딕셔너리는 바뀌는(mutable) 객체이므로, 다른 변수에 대입해도 복사되지 않고 같은 객체를 함께 가리킵니다. 따로 바꾸고 싶다면 nums.copy()나 dict(ages)로 복사합니다.
클래스는 class로 정의합니다. __init__ 메서드가 생성자 역할을 하고, 메서드의 첫 매개변수 self가 인스턴스 자신을 가리킵니다.
class Account:
def __init__(self, owner: str, balance: int = 0) -> None:
self.owner = owner
self.balance = balance
def deposit(self, amount: int) -> None:
if amount <= 0:
raise ValueError("amount must be positive")
self.balance += amount
def __repr__(self) -> str:
return f"Account({self.owner!r}, {self.balance})"
acc = Account("mina")
acc.deposit(100)
print(acc) # Account('mina', 100)데이터를 담는 것이 주목적인 클래스라면 표준 라이브러리의 dataclasses가 훨씬 간단합니다. 필드를 타입 힌트와 함께 적기만 하면 __init__, __repr__, __eq__를 자동으로 만들어 줍니다. frozen=True를 주면 만든 뒤 바꿀 수 없는 객체가 됩니다.
from dataclasses import dataclass, field
@dataclass
class Order:
id: int
customer: str
items: list[str] = field(default_factory=list)
paid: bool = False
@dataclass(frozen=True)
class Point:
x: float
y: float
order = Order(1, "mina")
order.items.append("book")
print(order) # Order(id=1, customer='mina', items=['book'], paid=False)
Point(1, 2) == Point(1, 2) # TruePython은 동적 타입 언어지만, 변수와 함수에 타입 힌트를 붙일 수 있습니다. 힌트는 실행 중에 검사되지 않으며, 편집기의 자동 완성과 mypy·Pyright 같은 정적 검사 도구가 활용합니다. 규모가 커질수록 버그를 미리 잡는 데 큰 도움이 됩니다.
from typing import Optional
def find_user(users: dict[str, int], name: str) -> int | None:
return users.get(name)
def average(values: list[float]) -> float:
return sum(values) / len(values) if values else 0.0
scores: list[int] = [90, 85]
lookup: dict[str, tuple[int, int]] = {"origin": (0, 0)}
maybe: Optional[str] = None # str | None 과 같습니다python -m pip install mypy
mypy app.pyint, float, str, bool, None이며, None 비교에는 is를 씁니다.@dataclass로 간단히 정의합니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.