38. κ°λ¨ν μΈν°νμ΄μ€μ κ²½μ° ν΄λμ€ λμ ν¨μλ₯Ό λ°μλΌ
API κ° μ€νλλ κ³Όμ μμ μ λ¬ν ν¨μλ₯Ό μ€ννλ κ²½μ°
sort λ©μλμμ key λ₯Ό ν
μΌλ‘ len λ΄μ₯ ν¨μλ₯Ό μ λ¬νλ μμ
names = ['μν¬λΌν
μ€' , 'μλ₯΄ν€λ©λ°μ€' , 'νλΌν€' , 'μ리μ€ν ν
λ μ€' ]
names .sort (key = len )
print (names )
> >>
['νλΌν€' , 'μν¬λΌν
μ€' , 'μλ₯΄ν€λ©λ°μ€' , 'μ리μ€ν ν
λ μ€' ]
defaultdict λ₯Ό μ¬μ©νμ¬ ν
μ¬μ©νλ μμ
from collections import defaultdict
def log_missing ():
print ('ν€ μΆκ°λ¨' )
return 0
current = {'μ΄λ‘' : 12 , 'νλ' : 3 }
increments = [
('λΉ¨κ°' , 5 ),
('νλ' , 17 ),
('μ£Όν©' , 9 ),
]
result = defaultdict (log_missing , current )
print ('μ΄μ :' , dict (result ))
for key , amount in increments :
result [key ] += amount
print ('μ΄ν:' , dict (result ))
> >>
μ΄μ : {'μ΄λ‘' : 12 , 'νλ' : 3 }
ν€ μΆκ°λ¨
ν€ μΆκ°λ¨
μ΄ν : {'μ΄λ‘' : 12 , 'νλ' : 20 , 'λΉ¨κ°' : 5 , 'μ£Όν©' : 9 }
2. ν
ν¨μμμ μνλ₯Ό μ²λ¦¬ν μ μλλ‘ νμ₯ν μμ
missing ν
ν¨μμ added_count λ³μμ μνλ₯Ό κΈ°λ‘
def increment_with_report (current , increments ):
added_count = 0
def missing ():
nonlocal added_count # μνκ° μλ ν΄λ‘μ
added_count += 1
return 0
result = defaultdict (missing , current )
for key , amount in increments :
result [key ] += amount
return result , added_count
result , count = increment_with_report (current , increments )
assert count == 2
κ°λ¨ν ν΄λμ€λ‘ μνλ₯Ό κ΄λ¦¬νλ μμ
class CountMissing :
def __init__ (self ):
self .added = 0
def missing (self ):
self .added += 1
return 0
counter = CountMissing ()
result = defaultdict (counter .missing , current ) # λ©μλ μ°Έμ‘°
for key , amount in increments :
result [key ] += amount
assert counter .added == 2
ν¬νΌ ν΄λμ€λ‘ μνκ° μλ ν΄λ‘μ μ κ°μ λμ ꡬνμ΄ ν¨μ μ¬μ©ν ꡬνλ³΄λ€ κΉλν¨
κ·Έλ¬λ ν΄λμ€λ§ 보면 ν΄λΉ ν΄λμ€ μ μ λͺ©μ μ΄ λλ¬λμ§ μμ
λκ° λ§λ€μ§?
λκ° νΈμΆνμ§?
μΆν κ³΅κ° λ©μλκ° λ μΆκ°λ κ°λ₯μ±μ?
...
__call__ νΉλ³ λ©μλ μ μν μμ
class BetterCountMissing :
def __init__ (self ):
self .added = 0
def __call__ (self ):
self .added += 1
return 0
counter = BetterCountMissing ()
assert counter () == 0
assert callable (counter )
__call__, callable κ°μ²΄
κ°μ²΄λ₯Ό ν¨μμ²λΌ νΈμΆ κ°λ₯ν¨
__call__ μ΄ μ μλ ν΄λμ€ μΈμ€ν΄μ€μ λν΄ callable λ΄μ₯ ν¨μλ₯Ό νΈμΆνλ©΄ True λ°νλ¨
counter = BetterCountMissing ()
result = defaultdict (counter , current ) # __call__μ μμ‘΄ν¨
for key , amount in increments :
result [key ] += amount
assert counter .added == 2
μ¬λ¬ μ»΄ν¬λνΈ μ¬μ΄ κ°λ¨ν μΈν°νμ΄μ€κ° νμν λλ ν΄λμ€ μΈμ€ν΄μ€ννλ λμ ν¨μλ₯Ό μ¬μ©νλκ² μ΄λ
callable κ°μ²΄λ₯Ό μ¬μ©νλ©΄ ν¨μμ²λΌ νΈμΆ κ°λ₯
μνλ₯Ό κ΄λ¦¬νλ ν¨μκ° νμν κ²½μ° callable κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ ν μ§λ₯Ό κ³ λ―Όν κ²