본문 바로가기

파이썬 버전별 변경 사항

파이썬은 지속적으로 발전하며 새로운 문법과 기능이 추가됩니다. f-string(3.6), dataclass(3.7), 왈러스 연산자(3.8), 딕셔너리 병합(3.9), match-case(3.10) 등 주요 변경사항을 버전별로 정리합니다.

1. Python 3.5 이상 버전의 신규문법

파이썬 구조와 문법은 지속해서 변경되고 있습니다. 어떤 문법이 어떤 버전에서 나왔고, 어떻게 유용하게 사용되는지 파악한다면 좀 더 우아한 코드를 작성하는데 도움이 될 것입니다.

아래는 Python 버전별 출시 연도입니다. 여러분이 만약 2019년 이전에 나온 책을 보셨다면 match 문법이나 왈러스 연산자 챕터는 없을 것입니다.

파이썬 3버전 배포 날짜 입니다.

  • 파이썬 3.0: 2008년 12월
  • 파이썬 3.1: 2009년 6월
  • 파이썬 3.2: 2011년 2월
  • 파이썬 3.3: 2012년 9월
  • 파이썬 3.4: 2014년 3월
  • 파이썬 3.5: 2015년 9월
  • 파이썬 3.6: 2016년 12월
  • 파이썬 3.7: 2018년 6월
  • 파이썬 3.8: 2019년 10월
  • 파이썬 3.9: 2020년 10월
  • 파이썬 3.10: 2021년 10월
  • 파이썬 3.11: 2022년 10월
  • 파이썬 3.12: 2023년 10월
  • 파이썬 3.13: 2024년 10월
  • 파이썬 3.14: 2025년 10월

파이썬은 매년 10월에 새 버전을 내놓습니다. 각 버전은 출시 후 약 5년간 보안 업데이트를 받습니다.

중요한 버전 배포 날짜 입니다.

  • 2000년 10월: 파이썬 2.0 릴리스
  • 2008년 12월: 파이썬 3.0 릴리스
  • 2020년 1월 1일: 파이썬 2 개발 및 지원 종료

1.1 Python 3.5

  • async와 await: Python의 비동기 프로그래밍에 사용됩니다. async def를 사용하여 코루틴을 정의하고, await를 사용하여 코루틴이 완료될 때까지 기다릴 수 있습니다.

1.2 Python 3.6

  • 딕셔너리에 순서가 생겼습니다. 3.6버전부터 순서가 지켜졌으나 공식 문서에는 3.7버전부터 들어가 있다고 나와있으니 코딩을 할 때에는 3.7버전부터 순서가 지켜진다는 것을 전제하고 코딩하는 것이 좋습니다.
  • f-string: 문자열 내부에 중괄호 {}를 사용하여 변수를 직접 삽입할 수 있습니다. 이를 통해 문자열 포매팅이 훨씬 쉬워졌습니다.
    name = 'Alice'
    print(f'Hello, {name}')
    
  • 변수 타입 힌트: 함수 인수와 반환 값에 대한 타입 정보를 제공하는 방법입니다. 이를 통해 개발자는 코드의 의도를 명확하게 표현할 수 있고, IDE와 linter는 이 정보를 사용하여 오류를 더 잘 잡아낼 수 있습니다.
    def greet(name: str) -> str:
        return f'Hello, {name}'
    

1.3 Python 3.7

  • dataclasses: 이 모듈은 @dataclass 데코레이터를 제공하여 클래스를 간결하게 정의할 수 있게 합니다. 이 데코레이터는 __init__, __repr__, __eq__ 등의 특별한 메서드를 자동으로 추가합니다.

    # id, name, email이 각각 3번씩 반복
    # -> 이러한 현상을  보일러 플레이트(boiler-plate)라 함
    # -> print를 해도 필드값이 보이지 않아 불편
    class User:
        def __init__(self, id, name, email):
            self.id = id
            self.name = name
            self.email = email
    
    # id, name, email이 각각 3번씩 반복
    # -> 이러한 현상을  보일러 플레이트(boiler-plate)라 함
    # -> print를 해도 필드값이 보이지 않아 불편
    class User:
        def __init__(self, id, name, email):
            self.id = id
            self.name = name
            self.email = email
    
        def __repr__(self):
            return (f'{self.__class__.__qualname__}{self.id, self.name, self.email}')
    
    user = User(123, 'hojun', 'hojun@gmail')
    user
    # User(123, 'hojun', 'hojun@gmail')
    
    from dataclasses import dataclass
    
    @dataclass
    class User:
        id: int
        name: str
        email : str
    
    user = User(123, 'hojun', 'hojun@gmail')
    user
    

1.4 Python 3.8

  • 왈러스 연산자 :=: 이 연산자를 사용하면 표현식을 평가하고 그 결과를 변수에 할당할 수 있습니다. 이는 주로 while 루프나 if 문 같은 곳에서 사용됩니다.

1.5 Python 3.9

  • 딕셔너리 결합 연산자: 딕셔너리의 병합과 업데이트를 위한 새로운 연산자 |와 |=이 추가되었습니다.

    x = {"key1": "value1"}
    y = {"key2": "value2"}
    z = x | y
    z
    

    아래와 같은 딕셔너리 언패킹은 3.5버전에서 나온 기능입니다.

    x = {"key1": "value1"}
    y = {"key2": "value2"}
    z = {**x, **y}
    z
    

1.6 Python 3.10

  • 구조적 패턴 매칭(structural pattern matching) : 어떤 값을 기반으로 가능한 여러 조건 중 하나를 매칭하는 방법 (ex Switch - Case 문)
# 간단한 버전
str_test = "good"

match str_test:
    case "happy":
        print("happy")

    case "good":
        print("good")
# Enum 사용
from enum import Enum

class Test(Enum): # Enum을 상속받은 class 정의
    ENTER = 1
    QUIT = 0

test = Test(1) # ENTER 값을 가진 class 객체 생성

match test:
    case Test.ENTER:
        print("enter")
    case Test.QUIT:
        print("quit")
# 리스트 사용
test = ["load", "good"]
match test:
    # 리스트 안에 "quit" 하나만 있는지 확인합니다.
    # 다른 값이 함께 있으면 매칭되지 않습니다.
    case ["quit"]:
        print("종료합니다.")
    # 첫 번째 요소가 "load"인 두 개짜리 리스트에 매칭됩니다.
    # 두 번째 값은 검사하지 않고 filename이라는 이름으로 꺼내 씁니다.
    case ["load", filename]:
        print(f"Loading {filename}")
    # 어떤 case에도 걸리지 않을 때 실행됩니다.(와일드카드)
    case _:
        print("기본값")
# 패턴 예시

case "test"             # 단일 값 "test"에 매칭
case ["a", "b"]         # ["a", "b"]라는 컬렉션에 매칭
case ["a", value]       # 두 개의 값이 있는 컬렉션에 매칭하고, 두 번째 값을 캡처 변수 value에 저장
case ("a" | "b" | "c")  # 세로줄(|)로 하나의 case에서 여러 값을 처리, "a", "b" 또는 "c"에 매칭
case ["z", _]           # 첫 값이 "z"인 두 개짜리 컬렉션에 매칭

1.7 Python 3.11 이후

3.11 이후로는 새 문법보다 성능과 개발 편의성 개선이 두드러집니다.

  • Python 3.11: 이전 버전 대비 평균 25% 가량 빨라졌습니다. 또한 에러가 났을 때 트레이스백이 문제가 된 위치를 정확히 짚어주기 시작했습니다.

    # 아래 코드를 실행해 에러 메시지가 어느 지점을 가리키는지 확인해보세요.
    a = {'x': {'y': None}}
    print(a['x']['y']['z'])
    
  • Python 3.12: f-string의 제약이 풀려 중괄호 안에서 바깥과 같은 종류의 따옴표를 쓸 수 있게 되었습니다. 이전에는 f"{d["key"]}"가 에러였습니다.

  • Python 3.13: 대화형 인터프리터가 색상 표시와 여러 줄 편집을 지원하도록 개선되었습니다.

  • Python 3.14: 성능 개선이 이어졌으며, 예외 처리와 문자열 관련 세부 문법이 다듬어졌습니다.

새 버전의 변경 사항은 공식 문서의 What's New 문서에 정리됩니다. 거대언어모델은 최신 버전 정보에 대해 부정확한 답을 내놓는 경우가 많으니 반드시 공식 문서를 확인해주세요.

What's New in Python | docs.python.org