๐ ํด๋น ํฌ์คํ ์ ์ธํ๋ฐ์ ํ์ด์ฌ ์ค๊ธ ๊ฐ์๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ณต์ต์ฐจ์์ผ๋ก ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค. ํด๋น ๋ด์ฉ์ ์ฃผ๋ก ๋ณธ์ธ์ ๋ณต์ต์ฉ์ด๋ผ์ ์์ธํ ์ค๋ช ์ ์๋ ์ ์ํด ๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋ณธ ์ฝ๋๋ ์ฌ๊ธฐ์ ์์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ํ์ด์ฌ์ ์ผ๊ธํจ์(์ผ๊ธ๊ฐ์ฒด)์ ํน์ง์ ๋ํด ๊ฐ๋จํ ์์๋ณด๊ณ , ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ํด๋ก์ ์ ๋ํด ์ค์ตํด๋ณด๊ณ ํด๋ก์ ํจ์๋ฅผ ์ด์ฉํด ๋ฐ์ฝ๋ ์ดํฐ๊น์ง ๋ง๋ค์ด๋ณด๋ ์ค์ต์ ํด๋ณด์.
1. ์ผ๊ธํจ์(First-class)์ ํน์ง
ํ์ด์ฌ ์ผ๊ธํจ์์ ํน์ง์ผ๋ก๋ ๋ค์์ 4๊ฐ์ง ํน์ง์ด ์กด์ฌ
- ๋ฐํ์ ์ด๊ธฐํ : ์คํ ์์ ์ ์ด๊ธฐํ๊ฐ ๋จ์ ์๋ฏธ
- ํจ์๋ฅผ ๋ณ์์ ํ ๋น์ด ๊ฐ๋ฅ
- ํจ์๋ฅผ ๋ ๋ค๋ฅธ ํจ์ ์ธ์๋ก ์ ๋ฌ ๊ฐ๋ฅ
- ํจ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํจ์ ๊ฒฐ๊ณผ๊ฐ์ ํ ๋น์ ๋ฐํ ๊ฐ๋ฅ
๋จผ์ ํจ์๋ฅผ ๋ณ์์ ํ ๋น์ด ๊ฐ๋ฅํ ์์๋ฅผ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด์.
# ์ผ๋ฐ ํจ์ ๋ง๋ค์ด๋ณด๊ธฐ
def factorial(n):
"""factorial function -> n : int """
# ์ฌ๊ทํจ์ ์ข
๋จ ์กฐ๊ฑด
if n < 2:
return 1
else:
return n + factorial(n-1)
# ์ผ๋ฐ Class ๋ง๋ค๊ธฐ
class A:
pass
# ์ผ๊ธ๊ฐ์ฒด ํน์ง : ํจ์๋ฅผ ๋ณ์๋ก ํ ๋น ๊ฐ๋ฅ
var_func = factorial
print(type(var_func))
print(var_func(5))
# map ํจ์ ์ด์ฉํด๋ณด๊ธฐ
print(list(map(var_func, range(1, 12))))
์ ํ๋ฉด์ฒ๋ผ ํจ์๋ ์ผ์ข ์ 'function' ์ด๋ผ๋ ํด๋์ค์ธ ๊ฒ์ ์ ์ ์๋ค.
๋ค์์ ํจ์๋ฅผ ๋ ๋ค๋ฅธ ํจ์ ์ธ์์ ์ ๋ฌํ๋ ํน์ง์ ๋ณด์. ์ด๋ฅผ ๊ณ ์(High-order) ํจ์๋ผ๊ณ ๋ ํ๋ค.
# 3. ์ผ๊ธ๊ฐ์ฒด ํน์ง : ํจ์๋ฅผ ํจ์ ์ธ์์ ์ ๋ฌ => ๊ณ ์(high-order) ํจ์
# filter์์ ์ต๋ช
ํจ์๋ฅผ ์ ์ํด ๋ฆฌ์คํธ๋ฅผ ํํฐ๋งํ ํ ์ด๋ฅผ var_func ํจ์์ map์ ์ด์ฉํด ์ ์ฉ!
print(list(map(var_func, filter(lambda x: x % 2, range(1, 11)))))
print([var_func(i) for i in range(1, 11) if i % 2])
์ฆ, factorial์ด๋ผ๋ ํจ์๋ฅผ var_func ๋ณ์์ ํ ๋นํ๊ณ ์ด๋ฅผ map ํจ์์ธ์๋ก ๋ค์ ์ ๋ฌํ๋ค. ์ถ๊ฐ๋ก ๋ฐฉ๊ธ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ ์ํ factorial ํจ์๊ฐ ์๋ ์ด๋ฏธ ๊ตฌํ๋์ด ์๋ ํจ์ add๋ฅผ import๋ฅผ ํ ํ reduce ํจ์ ์ธ์๋ก ์ ๋ฌํด๋ณด์. ์ฐธ๊ณ ๋ก reduce ํจ์๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋์ ํ๋ฉด์ ์ง๊ณ์์ผ์ฃผ๋ ํจ์์ด๋ค.
# reduce() ๋ฉ์๋ ์ฌ์ฉ๋ฐฉ๋ฒ -> reduce(ํจ์, ๋ฆฌ์คํธ๊ฐ์ฒด)
from functools import reduce
from operator import add
print(reduce(add, range(1, 5)))
print(sum(range(1, 5)))
# ์ต๋ช
ํจ์ : lambda -> ๊ฐ๊ธ์ ์ฃผ์์ ์ฌ์ฉํ๋ ๋๋๋ก์ด๋ฉด ์ผ๋ฐํจ์ ํํ๋ก ์์ฑํ๋๊ฒ ๊ถ์ฅ(๊ฐ๋
์ฑ ์ํด)
print(reduce(lambda x, t: x + t, range(1, 5)))
๋ง์ง๋ง์ธ ํจ์๋ฅผ ๋ ๋ค๋ฅธ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ๋ฐํํ๋ ๊ฒ์ ํด๋ก์ ์ ๋ฐ์ฝ๋ ์ดํฐ์์ ๋ค๋ฃจ๋ฏ๋ก ๋ ํ๋จ์ ๋ด์ฉ์์ ๋ค๋ฃจ๊ธฐ๋ก ํ์. ํ ๊ฐ์ง ์ถ๊ฐ๋ก ์๊ฐํ ๋ฉ์๋๋ partial ๋ฉ์๋๋ค. partial ๋ฉ์๋๋ ์ธ์๋ฅผ ๊ณ ์ ์ํค๋ ํจ์์ธ๋ฐ, ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
# partial ์ฌ์ฉ๋ฒ : ์ธ์๋ฅผ ๊ณ ์ ์ํค๊ธฐ -> ์ฝ๋ฐฑํจ์์ ์ฌ์ฉ๋จ
# partial(ํจ์, ๊ณ ์ ์ํฌ ์ธ์)
from operator import mul
from functools import partial
# ์ธ์ ํ๋๋ฅผ 10์ผ๋ก ๊ณ ์ ์ํค๊ธฐ
one_fix = partial(mul, 10)
# 10 ์ธ์๋ฅผ ๊ณ ์ ์ํจ ์ฑ 2๋ผ๋ ์ถ๊ฐ ์ธ์๋ง ์ง์ ํด์ฃผ๊ณ mul ์ฐ์ฐ ์ํ!
print(one_fix(2))
print([one_fix(i) for i in range(1, 11)])
# map ์ด์ฉํด๋ณด๊ธฐ
print(list(map(one_fix, range(1, 11))))
# filter๋ ์ฐธ, ๊ฑฐ์ง์ ํ๋จํด์ ์์๋ค์ ํํฐ๋ง ํ๋ ์ญํ ์!(map๊ณผ๋ ๋ค๋ฆ!!)
print(list(filter(lambda x: x % 2, range(1, 11))))
# filter + map์ ๊ฒฐํฉ!!
print(list(map(one_fix, filter(lambda x: x % 2, range(1, 11)))))
print('-'*50)
# ์ธ์ ํ๋๋ฅผ ์ถ๊ฐ๋ก ๋ ๊ณ ์ ์ํค๊ธฐ
double_fix = partial(one_fix, 2000)
print(double_fix()) # mul์ฐ์ฐ์ 2๊ฐ์ ์ธ์๊ฐ ํ์ํ๋ฐ ์ด๋ฏธ 2๊ฐ ์ธ์ ๋ชจ๋ ๊ณ ์ ์์ผฐ์ผ๋ฏ๋ก ๊ทธ๋ฅ ํธ์ถํ๋ฉด ๋จ!
# print(double_fix(4)) # ์ถ๊ฐ ์ธ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ์๋ฌ ๋ฐ์!
2. ํด๋ก์ ๊ฐ๋ ์ ๋ํ ์ดํด
ํด๋ก์ ๊ฐ๋ ์ ๋ํ ์ดํด๋ฅผ ํ๊ธฐ์ ์ ์ฐ์ ํ์ด์ฌ ๋ณ์ ๋ฒ์(scope)์ ๋ํด ์ดํด๋ณด๋ ๊ฒ๋ ์ข์๋ฐ, ์ด์ ๋ํ ์์ธํ ์ค๋ช ๋ธ๋ก๊ทธ๊ฐ ์์ด ์๊ฐํ๋ค. ํด๋ก์ ๋ ์ผ๋ช '์ํ๋ฅผ ๊ณ์ ์ ์ฅํ๊ณ ์ ์ง'ํ๊ธฐ ์ํ๋ค๊ณ ๋ณผ ์ ์๋ค. ์ฆ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์๊ณ ๋ฉ์ธ์ง ์ ๋ฌ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํจ์ด๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ํด๋ก์ ๋ ์ถํ์ ๋ฐฐ์ธ ๋ฉํฐ ์ฐ๋ ๋(์ฝ๋ฃจํด) ํ๋ก๊ทธ๋๋ฐ์ ๊ฐํ๋ค๊ณ ํ๋ค. ๋ณดํต ํด๋ก์ ๋ ๊ณต์ ๋ฅผ ํ๋ ๋ณ๊ฒฝ๋์ง ์๋(immutable) ๊ฒ๋ค์ ์ํด ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
์ฐ์ , ์ผ๋ฐ์ ์ผ๋ก ๋์ ํฉ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ๊ณผ class๋ฅผ ์ด์ฉํด ๋์ ํฉ์ ๊ตฌํ๋ ์ค์ต ์ฝ๋์ด๋ค.
# ์ผ๋ฐ์ ์ธ ๋์ ํฉ ๊ตฌํ๊ธฐ
print(sum(range(1,11)))
print()
# ๋์ ํ๊ท ๊ตฌํ๋ Class ์ ์ํด๋ณด๊ธฐ
# ํด๋์ค์ ๋งค์ง ๋ฉ์๋ __call__์ ํด๋์ค๋ฅผ ๋ง์น ํจ์(๋ฉ์๋)์ฒ๋ผ callableํ ์ ์์!!
class Averager:
def __init__(self):
self._series = []
def __call__(self, value):
self._series.append(value)
print(f"Series:{self._series}, Length:{len(self._series)}")
# ๋์ ํ๊ท ๊ฐ return
return sum(self._series) / len(self._series)
# ํด๋์ค๋ฅผ ์ด์ฉํด ๋์ ๋ ๊ฐ save
cls_averager = Averager()
result = cls_averager(10)
print("1๋ฒ์งธ:", result)
# ์์ save๋ ์ํ์์ ๋์ ์ํค๊ณ ํ๊ท ๊ตฌํ๊ธฐ
result = cls_averager(20)
print("2๋ฒ์งธ:", result)
result = cls_averager(154)
print("3๋ฒ์งธ:", result)
result = cls_averager(256)
print("4๋ฒ์งธ:", result)
๋ค์์ ํด๋ก์ ๋ฅผ ์ด์ฉํด์ ๋์ ํฉ์ ๊ตฌํด๋ณด์. ์ฐ์ ํด๋ก์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ธ๋ถ(outer) ํจ์์ ๋ด๋ถ(inner ์ด๊ฒ์ nested function์ด๋ผ๊ณ ๋ ํจ)ํจ์๊ฐ ์กด์ฌํ๊ณ ์ด๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ์ ์ผ๋์ ๋์.
def outer_func():
series = [] # Free variable(์์ ๋ณ์) => list, dict, set๊ฐ์ ๊ฒฝ์ฐ mutableํ๊ธฐ ๋๋ฌธ์ nonlocal ๋ฐ๋ก ์ ์ธํ์ง ์์๋ ๊ฐ๋ฅ!
def inner_func(value):
series.append(value)
print(f"Series:{series}, Length:{len(series)}")
return sum(series) / len(series)
# inner_func์ return ํจ์ผ๋ก์จ ์ํ๋ฅผ ๊ณ์ save!
return inner_func
avg_closure1 = outer_func()
print(type(avg_closure1))
print("1๋ฒ์งธ ํธ์ถ:", avg_closure1(10))
print("2๋ฒ์งธ ํธ์ถ:", avg_closure1(20))
print("3๋ฒ์งธ ํธ์ถ:", avg_closure1(55))
๊ฒฐ๊ณผํ๋ฉด์์ ํด๋ก์ ํจ์์ type์ ์ดํด๋ณด๋ฉด function์ด๋ผ๋ ์ผ์ข ์ ํด๋์ค์ธ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ ํ๊ฐ์ง ์ผ๋์ ๋ ์ ์ outer_func๊ณผ inner_fun(์ค์ฒฉํจ์) ์ฌ์ด๋ฅผ ๋ณดํต Free variable(์์ ๋ณ์) ๊ตฌ์ญ์ด๋ผ๊ณ ์นญํ๋๋ฐ, ์ฌ๊ธฐ์ ์ ์๋๋ ๋ณ์๋ ํจ์๋ค์ ์ค์ฒฉํจ์ ๋ด๋ถ์์ ์ฌ์ฉ๋ ์ ์๋ค. ๊ทธ๋ฌ๋ Free variable ๊ตฌ์ญ ๋ด์์ ์ ์๋๋ ์๋ฃ๊ตฌ์กฐ๊ฐ ๋ง์ฝ immutableํ ์๋ฃ๊ตฌ์กฐ(int, float, string, tuple, bool, frozenset)๋ผ๋ฉด ์ค์ฒฉํจ์ ๋ด๋ถ์์ nonlocal๋ก ๋ณ์๋ฅผ ์ ์ํด์ฃผ์ด์ผ ํ๋ค.
# ์๋ชป๋ Closure ์ฌ์ฉ๋ฒ
def outer_func2():
# Free variable ์ ์ธ
cnt = 0
total = 0
def inner_func2(value):
cnt += 1 # inner_func2 ์ธ๋ถ์ ์๋ cnt, total ๋ณ์๋ฅผ ์ฐธ์กฐํ์ง ๋ชปํจ! => cnt, total์ด immtuableํ ์๋ฃ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ!
total += value
return total / cnt
return inner_func2
# ์๋ฌ๋ฐ์
wrong_closure = outer_func2()
wrong_closure(10)
# ์ ์๋ชป๋ ๋ฐฉ๋ฒ ํด๊ฒฐ ๋ฐฉ์
def outer_func3():
cnt = 0 # Free variable ์ ์ธ
total = 0
def inner_func3(value):
# cnt, total์ด inner_func3 ํจ์ ์ธ๋ถ์ ์ง์ญ๋ณ์๋ฅผ ์ฐธ์กฐํ ๊ฒ์ ์ ์ธ!
nonlocal cnt, total
cnt += 1
total += value
return total / cnt
return inner_func3
right_closure = outer_func3()
print("1๋ฒ์งธ ํธ์ถ:", right_closure(10))
print("2๋ฒ์งธ ํธ์ถ:", right_closure(20))
print("3๋ฒ์งธ ํธ์ถ:", right_closure(55))
๊ฒฐ๊ณผํ๋ฉด์ ๋ณด๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ ํ๊ท ๊ฐ์ด ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
3. ๋ฐ์ฝ๋ ์ดํฐ
์ด์ ์ ๋ฐฐ์ ๋ ํด๋ก์ ํจ์๋ฅผ ํ์ฉํด ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ณด์. ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ํด๋ก์ ํจ์์ ์ธ๋ถํจ์์ ์ธ์๋ก ํน์ ํ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ์.(์ด ๋ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ ์ผ๊ธ ๊ฐ์ฒด์ ํน์ง!)
๋จผ์ ๋ฐ์ฝ๋ ์ดํฐ์ ์ฅ,๋จ์ ์ ๋ํด์ ๊ฐ๋จํ ์์๋ณด์.
- ์ฅ์
- ์ค๋ณต ์ ๊ฑฐ, ์ฝ๋์ ๊ฐ๊ฒฐ, ๊ณตํต ํจ์ ์์ฑ(๊ณตํต ํจ์๋, ๋ก๊น , ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ ํจ์ฑ ์ฒดํฌ ๊ฐ๋ฅ. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ํ ์ํ๋ก์ฐ ์์ค์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ๋ง์ ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ฌ์ฉ๋จ)
- ๋จ์
- ๋๋ฌด ๋จ๋ฐํ๋ฉด ๊ฐ๋ ์ฑ ๊ฐ์.. ๊ทธ๋์ ๋๋ฒ๊น ์ด ์ด๋ ค์
- ํน์ ๊ธฐ๋ฅ์ ํ์ ๋ ํจ์๋ ๊ตณ์ด ๋ฐ์ฝ๋ ์ดํฐ๋ณด๋ค ์ผ๋ฐ ๋จ์ผ ํจ์๋ก ์ ์ํ๋ ๊ฒ์ด ๋์ ๊ฒฝ์ฐ๋ ์กด์ฌ
์ด์ ๋ฐ์ฝ๋ ์ดํฐ ์ค์ต์ฝ๋๋ฅผ ์ดํด๋ณด์. ํน์ ํจ์๊ฐ ๋์๋๊ณ ์ข ๋ฃ๋๋ ๋์์ ์๊ฐ์ธ ๋ฐํ์์ ์ธก์ ํด๋ณด๋ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด๋ณด์
# ๋ฐ์ฝ๋ ์ดํฐ ์ค์ต - ํน์ ํจ์๊ฐ ๋์๋๊ณ ์ข
๋ฃ๋๋ ๋์์ ์๊ฐ์ ์ธก์ ํด๋ณด์
import time
# ์ฐ์ , ํด๋ก์ ํจ์ ๋ง๋ค๊ธฐ
def perf_clock(func): # ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ - ์ผ๊ธ ๊ฐ์ฒด์ ํน์ง
# Free variable ๊ตฌ์ญ
def inner_func(*args): # ์ ๋์ ์ธ ์ธ์๋ฅผ ์ํ packing
# ์์ time ์ธก์
st = time.perf_counter()
result = func(*args)
et = time.perf_counter()
runtime = et - st
name = func.__name__
arg_str = ', '.join(repr(arg) for arg in args)
print(f"{runtime :.5f} {name}({arg_str}) -> {result}")
return result
return inner_func
# 1. ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉํด๋ณด๊ธฐ
@perf_clock
def sleep_func(seconds):
time.sleep(seconds)
pass
@perf_clock
def sum_func(*numbers):
return sum(numbers)
print("## Decorator๋ก sleep_func ํจ์ ๋์ ์๊ฐ ์ถ๋ ฅ ##")
result1 = sleep_func(2)
print("## Decorator๋ก sum_func ํจ์ ๋์ ์๊ฐ ์ถ๋ ฅ ##")
result2 = sum_func(1,2,3,4,5,6,7,8,9,)
print(result2)
๋ฒ์ธ๋ก ๋ง์ฝ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํธ์ถํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค. ํด๋ก์ ํจ์๋ฅผ ์ ์ํ๋ ๋ถ๋ถ์ ๋์ผํ๋ค.
import time
# ์ฐ์ , ํด๋ก์ ํจ์ ๋ง๋ค๊ธฐ
def perf_clock(func): # ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ - ์ผ๊ธ ๊ฐ์ฒด์ ํน์ง
# Free variable ๊ตฌ์ญ
def inner_func(*args): # ์ ๋์ ์ธ ์ธ์๋ฅผ ์ํ packing
# ์์ time ์ธก์
st = time.perf_counter()
result = func(*args)
et = time.perf_counter()
runtime = et - st
name = func.__name__
arg_str = ', '.join(repr(arg) for arg in args)
print(f"{runtime :.5f} {name}({arg_str}) -> {result}")
return result
return inner_func
# ๋์ ์๊ฐ์ ์ธก์ ํ ํจ์ 2๊ฐ์ง ์ ์ํด์ฃผ๊ธฐ
def sleep_func(seconds):
time.sleep(seconds)
return
def sum_func(*numbers):
return sum(numbers)
# 2. ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํธ์ถํ๊ธฐ
no_deco1 = perf_clock(sleep_func)
print("## None Decorator๋ก sleep_func ํจ์ ๋์ ์๊ฐ ์ถ๋ ฅ ##")
result1 = no_deco1(2)
no_deco2 = perf_clock(sum_func)
print("## None Decorator๋ก sum_func ํจ์ ๋์ ์๊ฐ ์ถ๋ ฅ ##")
result2 = no_deco2(1,2,3,4,5,6,7,8,9,10)
print("sum_func ํจ์ ๊ฒฐ๊ณผ :", result2)
'Python > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] yield๋ก ์ ๋ค๋ ์ดํฐ ํจ์ ๋ง๋ค๊ธฐ (0) | 2021.08.25 |
---|---|
[Python] ํด๋์ค ์์ ์ super() ์ ์ฐ์ (0) | 2021.08.25 |
[Python ์ค๊ธ] Python ์ํ์ค (0) | 2020.12.24 |
[Python ์ค๊ธ] Magic method์ named tuple (0) | 2020.12.22 |
[Python ์ค๊ธ] Class์ Method ์ฌํ (0) | 2020.12.20 |