Created at : 2024-11-02 15:53
Auther: Soo.Y


πŸ“λ©”λͺ¨

python 3.6

  1. λ”•μ…”λ„ˆλ¦¬μ— μˆœμ„œκ°€ μžˆλ‹€. (μ‹€μ œλ‘œλŠ” 3.7λΆ€ν„° 적용이라고 μ•Œλ €μ§)
  2. f-sting λ³€μˆ˜ 포함 κ°€λŠ₯ : {}μ•ˆμ— λ³€μˆ˜ λͺ…을 μ§€μ •ν•΄μ„œ λ¬Έμžμ—΄μ„ μž‘μ„±ν•  수 있음
  3. Type hint λ„μž…
def my_function(name: str) -> str:
	return f"Hello, my name is {name}"

python 3.7

  1. dataclass λ°μ½”λ ˆμ΄λ” : @dataclassλ₯Ό μ‚¬μš©ν•΄μ„œ 클래슀λ₯Ό κ°„κ²°ν•˜κ²Œ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 특히 id, name, email 처럼 λ³€μˆ˜ λͺ…을 λ‚˜μ—΄ν•΄μ„œ μ„ μ–Έν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. λ˜ν•œ print문을 μ‚¬μš©ν•΄μ„œ 좜λ ₯ν•΄μ•Ό ν•  return ν˜•μ‹μ„ __repr__ 맀직 λ©”μ†Œλ“œμ— 선언을 ν•΄μ•Ό ν•˜λŠ”λ° dataclassλŠ” μžλ™μœΌλ‘œ μ„ μ–Έλ©λ‹ˆλ‹€.

Basic class

# Basic class
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')
print(user)
# User(123, 'hojun', 'hojun@gmail')

dataclass

# using dataclass
from dataclasses import dataclass
 
@dataclass
class User:
    id: int
    name: str
    email : str
 
user = User(123, 'hojun', 'hojun@gmail')
print(user)

python 3.8

1. ν• λ‹Ή ν‘œν˜„μ‹( := μ—°μ‚°μž, 바닀코끼리 μ—°μ‚°μž)

ν• λ‹Ή ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ ν‘œν˜„μ‹ λ‚΄μ—μ„œ λ³€μˆ˜λ₯Ό ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œλ₯Ό 더 κ°„κ²©ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • κΈ°μ‘΄ λ°©μ‹μ—μ„œλŠ” len(my_list)의 κ²°κ³Όλ₯Ό λ³„λ„λ‘œ λ³€μˆ˜ n에 ν• λ‹Ήν•œ ν›„ μ‘°κ±΄λ¬Έμ—μ„œ μ‚¬μš©ν–ˆμœΌλ‚˜, ν• λ‹Ή ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜λ©΄ 쑰건문에 λ‚΄μ—μ„œ 직접 λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜κ³  μ‚¬μš©ν•  수 μžˆμ–΄ μ½”λ“œκ°€ κ°„κ²°ν•΄μ§‘λ‹ˆλ‹€.
# κΈ°μ‘΄ 방식
n = len(my_list)
if n > 10:
    print(f"리슀트 길이: {n}")
 
# ν• λ‹Ή ν‘œν˜„μ‹ μ‚¬μš©
if (n := len(my_list)) > 10:
    print(f"리슀트 길이: {n}")
 

2. μœ„μΉ˜ μ „μš© λ§€κ°œλ³€μˆ˜

ν•¨μˆ˜ μ •μ˜ μ‹œ /기호λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • λ§€κ°œλ³€μˆ˜λ₯Ό μœ„μΉ˜ μ „μš©μœΌλ‘œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μΈμˆ˜κ°€ λ°˜λ“œμ‹œ μœ„μΉ˜λ‘œλ§Œ μ „λ‹¬λ˜λ„λ‘ κ°•μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • / μ•žμ˜ λ§€κ°œλ³€μˆ˜ a와 bλŠ” μœ„μΉ˜ μ „μš©μž…λ‹ˆλ‹€. λ’€μ˜ c와 dλŠ” μœ„μΉ˜, 이름 λ‘˜ λ‹€ κ°€λŠ₯ν•˜μ§€λ§Œ a와 bλŠ” 였직 μœ„μΉ˜ λ§€κ°œλ³€μˆ˜λ‘œλ§Œ 받을 수 μžˆμŠ΅λ‹ˆλ‹€.
def func(a, b, /, c, d):
    print(a, b, c, d)
 
# μ˜¬λ°”λ₯Έ 호좜
func(1, 2, c=3, d=4)
 
# 였λ₯˜ λ°œμƒ
func(a=1, b=2, c=3, d=4)  # TypeError: func() got some positional-only arguments passed as keyword arguments: 'a, b'

3. f-λ¬Έμžμ—΄ ν–₯상 ( = 지원)

f-λ¬Έμžμ—΄ λ‚΄μ—μ„œ =λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λͺ…κ³Ό 값을 ν•¨κ»˜ 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 디버깅 μ‹œ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

  • f”{x=}β€œλŠ” λ³€μˆ˜ x의 이름과 값을 ν•¨κ»˜ 좜λ ₯ν•©λ‹ˆλ‹€.
  • 디버깅 μ‹œ λ³€μˆ˜μ˜ μƒνƒœλ₯Ό μ‰½κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
x = 10
y = 20
 
print(f"{x=}, {y=}")
# 좜λ ₯: x=10, y=20

4. μƒˆλ‘œμš΄ μˆ˜ν•™ ν•¨μˆ˜

  • math.prod() : μ‹œν€€μŠ€μ˜ λͺ¨λ“  μš”μ†Œμ˜ 곱을 κ³„μ‚°ν•©λ‹ˆλ‹€.
  • math.isqrt() : μ •μˆ˜μ˜ μ •μˆ˜ μ œκ³±κ·Όμ„ κ³„μ‚°ν•©λ‹ˆλ‹€.
import math
 
# math.prod 예제
numbers = [1, 2, 3, 4]
product = math.prod(numbers)
print(product)  # 좜λ ₯: 24
 
# math.isqrt 예제
number = 16
sqrt = math.isqrt(number)
print(sqrt)  # 좜λ ₯: 4
 
# math.isqrt 예제
number = 18 # 18μ΄μ§€λ§Œ 16κ³Ό 같은 κ²°κ³Όκ°€ λ‚˜μ˜΄
sqrt = math.isqrt(number)
print(sqrt) Β # 좜λ ₯: 4

python 3.9

1. λ”•μ…”λ„ˆλ¦¬ 병합 및 μ—…λ°μ΄νŠΈ μ—°μ‚°μž (| 및 |=)

λ”•μ…”λ„ˆλ¦¬λ₯Ό λ³‘ν•©ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•œ μƒˆλ‘œμš΄ μ—°μ‚°μž |와 |=κ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ”•μ…”λ„ˆλ¦¬μ˜ 병합을 더 κ°„κ²°ν•˜κ²Œ μ§κ΄€μ μœΌλ‘œ μˆ˜ν–‰ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.

  • | μ—°μ‚°μžλŠ” 두 λ”•μ…”λ„ˆλ¦¬λ₯Ό λ³‘ν•©ν•œ μƒˆλ‘œμš΄ λ”•μ…”λ„ˆλ¦¬λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • |= μ—°μ‚°μžλŠ” κΈ°μ‘΄ λ”•μ…”λ„ˆλ¦¬λ₯Ό λ‹€λ₯Έ λ”•μ…”λ„ˆλ¦¬λ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
  • ν‚€κ°€ 쒅볡될 경우, 우츑 λ”•μ…”λ„ˆλ¦¬μ˜ 값이 μš°μ„ ν•©λ‹ˆλ‹€.
# κΈ°μ‘΄ 방식
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
 
merged_dict = {**dict1, **dict2}
print(merged_dict)  # 좜λ ₯: {'a': 1, 'b': 3, 'c': 4}
 
# μƒˆλ‘œμš΄ 방식 (| μ—°μ‚°μž μ‚¬μš©)
merged_dict = dict1 | dict2
print(merged_dict)  # 좜λ ₯: {'a': 1, 'b': 3, 'c': 4}
 
# κΈ°μ‘΄ λ”•μ…”λ„ˆλ¦¬ μ—…λ°μ΄νŠΈ
dict1 |= dict2
print(dict1)  # 좜λ ₯: {'a': 1, 'b': 3, 'c': 4}
 

2. νƒ€μž… νžŒνŒ… κ°œμ„ (λ‚΄μž₯ μ»¬λ ‰μ…˜μ— λŒ€ν•œ μ œλ„€λ¦­ 지원)

이제 list, dict, tupe λ“± λ‚΄μž₯ μ»¬λ ‰μ…˜ νƒ€μž…μ—μ„œ 직접 μ œλ„€λ¦­ νƒ€μž… 힌트λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄μ „μ—λŠ” typing λͺ¨λ“ˆμ˜ μ œλ„€λ¦­ νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

  • μ΄μ „μ—λŠ” typing.Listλ‚˜ typing.Dictλ₯Ό μ‚¬μš©ν•΄μ•Ό ν–ˆμ§€λ§Œ, μ΄μ œλŠ” list[int], dict[str, int]와 같이 λ‚΄μž₯ νƒ€μž…μ— 직접 νƒ€μž… 인수λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λŠ” μ½”λ“œμ˜ κ°„κ²°μ„±κ³Ό 가독성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
from typing import List, Dict
 
# κΈ°μ‘΄ 방식
def process_items(items: List[int]) -> Dict[str, int]:
    return {str(item): item for item in items}
 
# μƒˆλ‘œμš΄ 방식
def process_items(items: list[int]) -> dict[str, int]:
    return {str(item): item for item in items}

3. μƒˆλ‘œμš΄ λ¬Έμžμ—΄ λ©”μ†Œλ“œ

λ¬Έμžμ—΄μ—μ„œ νŠΉμ • μ ‘λ‘μ‚¬λ‚˜ 접미사λ₯Ό μ œκ±°ν•˜λŠ” λ©”μ†Œλ“œκ°€ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

  • removeprefix(prefix)λŠ” λ¬Έμžμ—΄μ΄ μ§€μ •λœ μ ‘λ‘μ‚¬λ‘œ μ‹œμž‘ν•˜λ©΄ κ·Έ 접두사λ₯Ό μ œκ±°ν•œ μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • removesuffix(suffix)λŠ” λ¬Έμžμ—΄μ΄ μ§€μ •λœ μ ‘λ―Έμ‚¬λ‘œ λλ‚˜λ©΄ κ·Έ 접미사λ₯Ό μ œκ±°ν•œ μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • λ¬Έμžμ—΄μ΄ μ§€μ •λœ μ ‘λ‘μ‚¬λ‚˜ μ ‘λ―Έμ‚¬λ‘œ μ‹œμž‘ν•˜μ§€ μ•Šκ±°λ‚˜ λλ‚˜μ§€ μ•ŠμœΌλ©΄ 원본 λ¬Έμžμ—΄μ„ κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
text = "python_rocks"
 
# κΈ°μ‘΄ 방식
if text.startswith("python_"):
    result = text[len("python_"):]
else:
    result = text
print(result)  # 좜λ ₯: rocks
 
# μƒˆλ‘œμš΄ 방식 (removeprefix μ‚¬μš©)
result = text.removeprefix("python_")
print(result)  # 좜λ ₯: rocks
 
# removesuffix μ‚¬μš©
filename = "report.pdf"
name = filename.removesuffix(".pdf")
print(name)  # 좜λ ₯: report

4. zoneinfo λͺ¨λ“ˆ μΆ”κ°€

ν‘œμ€€ μ‹œκ°„λŒ€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ§€μ›ν•˜λŠ” zoneinfo λͺ¨λ“ˆμ΄ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 νƒ€μž„μ‘΄ μ²˜λ¦¬κ°€ λ”μš± κ°„νŽΈν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

  • ZoneInfo 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž„μ‘΄ 정보λ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • datetime 객체와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ νƒ€μž„μ‘΄ κ°„μ˜ μ‹œκ°„ λ³€ν™˜μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • μ‹œμŠ€ν…œμ— μ„€μΉ˜λ¨ IANA μ‹œκ°„λŒ€ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
from zoneinfo import ZoneInfo
from datetime import datetime, timedelta
 
# νŠΉμ • νƒ€μž„μ‘΄μ˜ ν˜„μž¬ μ‹œκ°„ κ°€μ Έμ˜€κΈ°
seoul_time = datetime.now(ZoneInfo("Asia/Seoul"))
print("μ„œμšΈ μ‹œκ°„:", seoul_time)
 
# νƒ€μž„μ‘΄ κ°„ μ‹œκ°„ 계산
new_york_time = seoul_time.astimezone(ZoneInfo("America/New_York"))
print("λ‰΄μš• μ‹œκ°„:", new_york_time)

5. μœ ν΄λ¦¬λ“œ 거리 계산 λͺ¨λ“ˆ

  • math.dist() : 닀차원 κ³΅κ°„μ—μ„œ 두 점 μ‚¬μ΄μ˜ μœ ν΄λ¦¬λ“œ 거리λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  • math.hypot() : μ—¬λŸ¬ μ’Œν‘œμ˜ μœ ν΄λ¦¬λ“œ λ†ˆμ„ κ³„μ‚°ν•©λ‹ˆλ‹€.
import math
 
# math.dist 예제
point1 = [0, 0, 0]
point2 = [3, 4, 5]
distance = math.dist(point1, point2)
print(distance)  # 좜λ ₯: 7.0710678118654755
 
# math.hypot 예제
norm = math.hypot(*point2)
print(norm)  # 좜λ ₯: 7.0710678118654755

πŸ“œμΆœμ²˜(μ°Έκ³  λ¬Έν—Œ)


πŸ”—μ—°κ²° λ¬Έμ„œ

Python 3.10