WeniVooks

검색

견고한 파이썬

파이썬 버전별 변경 사항

파이썬 버전별 변경 사항

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

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월

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

  • 2000년 10월: 파이썬 2.0 릴리스
  • 2008년 12월: 파이썬 3.0 릴리스
  • 2020년 1월 1일: 파이썬 2 개발 및 지원 종료
1.1 Python 3.5
  • asyncawait: 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}'
    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
    # 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
    x = {"key1": "value1"}
    y = {"key2": "value2"}
    z = {**x, **y}
    z
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 = ["quit","good"] match test: # 리스트 내부에 quit이라는 문자열만 있는 지 확인, # 이외에 다른 값이 있을 경우 매칭이 되지 않습니다. case ["quit"]: quit() # 리스트 첫 번째 요소가 문자열 load인지 판단합니다. # filename이라는 변수는 체크하지 않고 값을 가져와 사용합니다. case ["load", filename]: print(f"Loading {filename}") # 모든 케이스가 매칭이 되지 않을 경우 최종적으로 수행하는 매칭되는 구문입니다.(와일드 카드) case _: print ("기본값")
# 패턴 예시
 
case "test" # 단일 값 "test"에 매칭
case ["a","b"] # ["a","b"]라는 컬렉션에 매칭
case ["a", value] : # 두 개의 값이 있는 컬렉션에 매칭하고, 두 번째 값을 캡처 변수 value에 저장
case ("a"|"b"|"c") : # or 연산자(|)를 사용해서 하나의 case 블록에서 여러 case를 처리, "a","b" 또는 "c"에 매칭
case ["z", _] # "z"로 시작하는 모든 컬렉션을 매칭
# 패턴 예시
 
case "test" # 단일 값 "test"에 매칭
case ["a","b"] # ["a","b"]라는 컬렉션에 매칭
case ["a", value] : # 두 개의 값이 있는 컬렉션에 매칭하고, 두 번째 값을 캡처 변수 value에 저장
case ("a"|"b"|"c") : # or 연산자(|)를 사용해서 하나의 case 블록에서 여러 case를 처리, "a","b" 또는 "c"에 매칭
case ["z", _] # "z"로 시작하는 모든 컬렉션을 매칭
{"packages":["numpy","pandas","matplotlib","lxml"]}
14장 부록14.2 파일 다루기 | 파일 입출력