μ½λ - ν¨μΊ μμ μ½λ μ°Έκ³ (ν¨μΊ μμ μ 리)
<μ΄μ κΈ>
https://silvercoding.tistory.com/24
[python μ¬ν] 7. ν΄μν μ΄λΈ(hashtable), Dictionary, Set μ¬ν
μ½λ - ν¨μΊ μμ μ½λ μ°Έκ³ (ν¨μΊ μμ μ 리) <μ΄μ κΈ> https://silvercoding.tistory.com/23 https://silvercoding.tistory.com/22 https://silvercoding.tistory.com/21 https://silvercoding.tistory.com/20..
silvercoding.tistory.com
μμ κΈμμλ λ€λ£¨μλ―μ΄ νμ΄μ¬μ λͺ¨λ κ²μ κ°μ²΄ λΌλ κ°λ μ μμ£Ό μ€μν κ°λ μ΄μλ€. μ΄λ₯Ό ν΅ν΄ ν¨μ λν κ°μ²΄λΌλ κ²μ μ μ μλ€.
μΌκΈν¨μ(μΌκΈ κ°μ²΄) - νμ΄μ¬ ν¨μμ νΉμ§
1. λ°νμ μ΄κΈ°ν κ°λ₯
2. λ³μμ ν λΉ κ°λ₯
3. ν¨μ μΈμμ μ λ¬ κ°λ₯ (ex) sorted(keys=len) --- ν¨μ μμ ν¨μ
4. ν¨μ κ²°κ³Όλ‘ λ°ν κ°λ₯ (ex) return function
- ν©ν λ¦¬μΌ ν¨μ ꡬν μμ
def factorial(n):
print("run")
'''Factorial Function -> n:int'''
if n ==1: # n < 2
return 1
return n * factorial(n-1)
class A:
pass
μμμ 보μλ μΌκΈν¨μμ νΉμ§ μ€ 4λ²μ μ¬μ©νμλ€. ν¨μμ κ²°κ³Όλ‘ ν¨μλ₯Ό λ°νν΄μ ν©ν 리μΌμ ꡬνν κ²μ΄λ€.
Aν΄λμ€λ ν¨μμ λΉκ΅ν΄ 보기 μν΄μ μμ±ν κ² .
* μ¬μ©ν΄λ³΄κΈ°
print('EX1-1 - ', factorial(5))
print('EX1-2 - ', factorial.__doc__)
print('EX1-3 - ', type(factorial), type(A))
print('EX1-4 - ', set(sorted(dir(factorial)))-set(sorted(dir(A)))) # ν΄λμ€μ λ€λ₯΄κ² ν¨μκ° κ°κ³ μλ λ©μλλ€
print('EX1-5 - ', factorial.__name__) # ν¨μ μ΄λ¦
print('EX1-6 - ', factorial.__code__) # ν¨μ μ½λ μμΉ
EX1-1 μμ λ³Ό μ μλ―μ΄ factorial(5) λ₯Ό νλ©΄ runμ΄ 5λ² νΈμΆ λλ κ²μ λ³Ό μ μλ€.
* λ³μ ν λΉ / ν¨μ μΈμ μ λ¬
val_func = factorial
print('EX2-1 - ', val_func)
print('EX2-2 - ', val_func(5))
print('EX2-3 - ', map(val_func, range(1, 6)))
print('EX2-4 - ', list(map(val_func, range(1, 6))))
μΌκΈν¨μμ νΉμ§ 2λ²κ³Ό κ°μ΄ λ³μμ ν λΉν μ μλ€. λ³μμ ν¨μλ₯Ό λ£κ³ , κΈ°μ‘΄ λ§λ€μ΄ λμλ ν¨μμ λκ°μ΄ μ¬μ©ν΄ μ£Όλ©΄ λλ€. EX2-3, 4 μμλ νΉμ§ 3λ²κ³Ό κ°μ΄ mapν¨μμ μΈμμ factorial ν¨μλ₯Ό λ£μ΄ μ¬μ©ν κ²μ΄λ€.
EX2-4λ μμκ°μ΄ 리μ€νΈλ‘ κ²°κ³Ό κ°μ λ³Ό μ μλ€.
# ν¨μ μΈμ μ λ¬ λ° ν¨μλ‘ κ²°κ³Ό λ°ν -> κ³ μ ν¨μ (Higher-order Function)
print('EX3-1 - ', list(map(val_func, filter(lambda x: x%2, range(1, 6))))) # --> ν¨μ μμ ν¨μ μ λ¬
print('EX3-2 - ', [val_func(i) for i in range(1, 6) if i % 2])
EX2-4 μμ λ λμκ° 1-6 μ€μμ νμμΈ μ«μλ€λ§ factorialμ μ μ©μν€λ μ½λμ΄λ€.
EX3-1κ³Ό EX3-2 λ κ°μ κ²°κ³Όκ° λμ€λ μ½λμ΄μ§λ§, EX3-2λ list comprehensionμ μ¬μ©νμκ³ , EX3-1μ ν¨μμ μΈμλ‘ ν¨μλ₯Ό μ λ¬νλ€λ μ μμ μ°¨μ΄κ° μλ€.
- reduce
from functools import reduce
import functools
from operator import add
print('EX3-3 - ', reduce(add, range(1, 11))) # λμ
print('EX3-4 - ', sum(range(1, 11)))
1λΆν° 10κΉμ§ λνλ μ½λλ₯Ό μ§μΌνλ€κ³ νλ©΄ EX3-4 μ²λΌ sumν¨μλ₯Ό μ¬μ©νμ¬ μ§λ κ²μ΄ μΌλ°μ μ΄λ€. μ΄ λ°©λ² λ§κ³ λ functoolsμ reduceλ₯Ό μ¬μ©νμ¬ κ΅¬νν μλ μλ€. 1λΆν° 11κΉμ§ μ°¨λ‘λλ‘ λν΄κ°λ©° μ€μ¬λκ°λ λ°©μμ΄λ€.
* μ΅λͺ ν¨μ (lambda) μ reduce
*** μ΅λͺ ν¨μ (lambda)
1. κ°κΈμ μ£Όμ μ¬μ© (κ°λ μ±μ΄ λ¨μ΄μ§κΈ° λλ¬Έ)
2. κ°κΈμ ν¨μ μ¬μ©
3. μΌλ° ν¨μ ννλ‘ λ¦¬ν©ν λ§ κΆμ₯
print('EX3-5 - ', reduce(lambda x, t: x + t, range(1, 11)))
μμμμ addν¨μ λμ lambdaν¨μλ₯Ό μ¬μ©ν μ μλ€. 1 + 2 ---> 3 + 3 ---> 6 + 4 ---> 10 + 5 μ΄λ° μμΌλ‘ λν΄μ§ κ°μ λμ μΌλ‘ λ€μ μλ₯Ό λν΄μ£Όλ μ리μ΄λ€.
<lambda, map(), reduce(), filter() μ°Έκ³ >
μν€λ μ€
μ¨λΌμΈ μ± μ μ μ 곡μ νλ νλ«νΌ μλΉμ€
wikidocs.net
μ΄λ €μμ λλ λ μμλ₯Ό λ³΄κ³ μ€κΈ°!
- Callable : νΈμΆ μ°μ°μ
* λ©μλ ννλ‘ νΈμΆ κ°λ₯νμ§ νμΈ
---- λ‘λ μΆμ²¨ ν΄λμ€ μμ ----
* ν΄λμ€ μ μΈ
import random
class LottoGame:
def __init__(self):
self._balls = [n for n in range(1, 46)]
def pick(self):
random.shuffle(self._balls)
return sorted([random.choice(self._balls) for n in range(6)])
μ°μ randomμ import ν΄μ€λ€. κ°μ²΄λ₯Ό μ΄κΈ° μμ±νμ λ _ballsμλ 1λΆν° 45κΉμ§μ μ«μλ₯Ό 리μ€νΈλ₯Ό λ£μ΄μ€λ€.
pick ν¨μμμλ random.shuffleμ μ¬μ©νμ¬ _ballsλ₯Ό μμ΄ μ€λ€. κ·Έλ€μ 6κ°λ₯Ό λ½μμ€λ€.
* κ°μ²΄ μμ±
game = LottoGame()
* λ‘λμΆμ²¨ μ€ν
print('EX4-2 - ', game.pick())
EX4-2 - [1, 5, 14, 24, 30, 34]
μ΄λ κ² 6κ°κ° μ λ½νλ κ²μ μ μ μλ€.
--- callable μ¬μ©
print('EX4-1 - ', callable(str), callable(list), callable(factorial), callable(3.14), callable(game))
μμμ λ§νλ―μ΄ callableμ μ¬μ©νμ¬ λ©μνΈ ννλ‘ νΈμΆ κ°λ₯νμ§ μ μ μλ€.
EX4-1 - True True True False False
str, list, factorialμ λͺ¨λ λ©μλ ννλ‘ νΈμΆμ΄ κ°λ₯νμ§λ§, μ€μμΈ 3.14 λλ κ°μ²΄κ° λ€μ΄κ° μλ λ³μμΈ game κ°μ κ²½μ°λ λ©μλ ννλ‘ νΈμΆμ΄ λΆκ°λ₯ νλ€. 3.14(), game() <--- μ΄μ κ°μ ννλ‘ μ¬μ©ν μ μλ€λ μ리μ΄λ€.
νμ§λ§ ν΄λμ€μμ __call__λ©μλλ₯Ό μ¬μ©νλ©΄ gameκ°μ κ°μ²΄κ° λ΄κΈ΄ λ³μλ λ©μλ ννλ‘ νΈμΆμ κ°λ₯νκ² λ§λ€ μ μλ€.
--- __call__ λ©μλ μ¬μ©νκΈ° (λ§€μ° μ€μν κ°λ μ)
class LottoGame:
...
def __call__(self):
return self.pick()
LottoGame ν΄λμ€μ __call__λ©μλλ₯Ό μΆκ°ν΄ μ€λ€. self.pickμ return ν΄μ£Όλ κ²μΌλ‘ μμ±νμμΌλ―λ‘, game()μ νΈμΆνλ©΄ pick μ΄ μ€νλ κ²μ΄λ€.
*** μ¬μ©ν΄λ³΄κΈ°
print('EX4-3 - ', game())
print('EX4-4 - ', callable(game))
EX4-3 - [14, 18, 42, 44, 44, 45]
EX4-4 - True
-- 맀κ°λ³μ μ λ ₯ (*args, **kwargs)
def args_test(name, *contents, point=None, **attrs):
return '<args_test> -> ({}) ({}) ({}) ({})'.format(name, contents, point, attrs)
λ³Ό λλ§λ€ ν·κ°λ Έλ λ³ν! ν¨μμ μΈμμ λ³ νλ (*) κ° λΆμΌλ©΄ ννμ λ°κ³ , λ³ λκ° (**) κ° λΆμΌλ©΄ λμ λ리λ₯Ό λ°λλ€.
ν μ€νΈλ₯Ό νκΈ° μν΄ μΌλ° λ³μ name, ννμ λ°λ contents, default κ°μ΄ μ ν΄μ Έ μλ point, λμ λ리λ₯Ό λ°λ attrs, μ΄ 4κ°μ μΈμλ₯Ό λ°λ ν¨μ args_testλ₯Ό μμ±νμλ€.
print('EX5-1 - ', args_test('test1'))
print('EX5-2 - ', args_test('test1', 'test2'))
print('EX5-3 - ', args_test('test1', 'test2', 'test3', id='admin'))
print('EX5-4 - ', args_test('test1', 'test2', 'test3', id='admin', point=7))
print('EX5-4 - ', args_test('test1', 'test2', 'test3', id='admin', point=7, password='1234'))
* νλμ© νμ΄μ μ 리
EX5-1 - <args_test> -> (test1) (()) (None) ({})
'test1' νλλ₯Ό λ£μλλ nameμ λ€μ΄ κ°λ€.
EX5-2 - <args_test> -> (test1) (('test2',)) (None) ({})
'test1', 'test2' λ₯Ό λ£μλλ name, contents ννμ λ€μ΄κ°λ€. (defaultκ°μ΄ μλ pointλ pointλ₯Ό λͺ μν΄ μ£Όμ΄μΌ νλ©°, attrμ λμ λ리λ₯Ό λ°μΌλ―λ‘ key, valueκ°μ μ μ΄μ£Όμ΄μΌ νλ€.)
EX5-3 - <args_test> -> (test1) (('test2', 'test3')) (None) ({'id': 'admin'})
'test1', 'test2', 'test3' λ₯Ό μ°μμ μΌλ‘ μ μ΄ μ£Όμλλ nameμ test1, contents ννμ test2, test3κ° λ€μ΄κ° κ²μ λ³Ό μ μλ€. μ°¨λ‘λλ‘ μ λλΌλ pointμλ λ€μ΄κ°μ§ μλλ€. keyμ valueλ₯Ό λ£μ΄μ£Όλ attr λμ λ리μ λ€μ΄κ° κ² λν λ³Ό μ μλ€.
EX5-4 - <args_test> -> (test1) (('test2', 'test3')) (7) ({'id': 'admin'})
μ΄λ²μλ pointλ₯Ό λͺ μν΄μ£Όμ΄ κ°μ λ£μλλ μ λ€μ΄ κ° μλ€.
EX5-4 - <args_test> -> (test1) (('test2', 'test3')) (7) ({'id': 'admin', 'password': '1234'})
μμμ μκ΄ μμ΄ key, value λ₯Ό λ£μ΄μ£Όλ©΄ λμ λ리μ λ€μ΄ κ° μλ€.
- ν¨μ Signature
: ν¨μμ μΈμμ λν μ 보λ₯Ό νμν΄μ€ μ μλ ν΄λμ€ ννμ λ©μλ
from inspect import signature
μ°μ inspectμ signatureλ₯Ό import ν΄μ€λ€.
sg = signature(args_test)
print('EX6-1 - ', sg)
print('EX6-2 - ', sg.parameters)
EX6-1 - (name, *contents, point=None, **attrs)
EX6-2 - OrderedDict([('name', <Parameter "name">), ('contents', <Parameter "*contents">), ('point', <Parameter "point=None">), ('attrs', <Parameter "**attrs">)])
μμ κ°μ΄ ν¨μμ μΈμμ λν μ 보λ₯Ό νμΈν μ μλ€.
* μΈμμ λͺ¨λ μ 보 μΆλ ₯ν΄λ³΄κΈ°
# λͺ¨λ μ 보 μΆλ ₯
for name, param in sg.parameters.items():
print('EX6-3 - ', name, param.kind, param.default)
EX6-3 - name POSITIONAL_OR_KEYWORD <class 'inspect._empty'>
EX6-3 - contents VAR_POSITIONAL <class 'inspect._empty'>
EX6-3 - point KEYWORD_ONLY None
EX6-3 - attrs VAR_KEYWORD <class 'inspect._empty'>
- partial
1. μ£Όλ‘ νΉμ μΈμλ₯Ό κ³ μ ν ν μ½λ°±ν¨μμ μ¬μ©
2. νλ μ΄μμ μΈμκ° μ΄λ―Έ ν λΉλ ν¨μμ μ λ²μ (μ λ²μ μ ν¨μ) λ°ν
3. ν¨μμ μ κ°μ²΄ νμ μ μ΄μ ν¨μμ μ체λ₯Ό κΈ°μ νκ³ μμ
κΈλ‘ μ½μΌλ©΄ μ΄ν΄κ° μ κ°μ§ μμ μ μλ€. μ¬μ©ν΄ 보μ!
from functools import partial
μ°μ functoolsμ partialμ import ν΄μ€λ€.
*** cf ) mul ν¨μλ μ μλ
from operator import mul
print('EX7-1 - ', mul(10, 100))
μ μ½λ κ°μ κ²½μ°λ 10 * 100 μ νλ©΄ κ°μ κ²°κ³Όκ° λμ¬ν λ°, κ΅³μ΄ mulκ³Ό κ°μ ν¨μκ° μ‘΄μ¬νλ μ΄μ λ 무μμΈκ°.
---> mulκ³Ό κ°μ ν¨μλ₯Ό μΈμλ‘ λ°λ κ²½μ°κ° μκΈ° λλ¬Έμ΄λ€.
* μΈμ κ³ μ
five = partial(mul, 5)
μ΄λ κ² partialν¨μμ μΈμμ mulν¨μλ₯Ό λ£μ΄μ£ΌκΈ° μν μ©λλ‘ μ°μΌ μ μλ€.
κ·Έλμ partial ν¨μκ° λ¬΄μμΈκ°!
μΈμλ₯Ό κ³ μ μμΌ λλ μν μ νλ€. partial(mul, 5) λ mul(5) <--- μ΄ μνλ‘ 5λ₯Ό κ³ μ μμΌ λκ² λ€λ μ리μ΄λ€.
* κ³ μ μΆκ°
six = partial(five, 6)
μ΄λ κ² νλ©΄ mul(5, 6) <--- μ΄ μνλ‘ κ³ μ μ΄ λλ κ²μ΄λ€.
* μ¬μ©
print('EX7-2 - ', five(100)) # νκ°λ§ λ°μ μ μμ
# print(six(100)) # ---> μ€λ₯ λ¨ . μ무κ²λ λ°μ μ μμ
print('EX7-3 - ', six())
print('EX7-4 - ', [five(i) for i in range(1, 11)])
print('EX7-5 - ', list(map(five, range(1, 11))))
EX7-4, 5 μ κ°μ΄ 5μ 1~10μ μ«μλ₯Ό κ³±νλ κ²κ³Ό λΉμ·ν μν©μμ νΈλ¦¬νκ² μ½λλ₯Ό 지 μ μλ€.
'νλ‘κ·Έλλ° μΈμ΄ > Python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[python μ¬ν] 10. copy & deep copy (0) | 2021.07.10 |
---|---|
[python μ¬ν] 9. λ³μ λ²μ, Closure, Decorator (0) | 2021.07.09 |
[python μ¬ν] 7. ν΄μν μ΄λΈ(hashtable), Dictionary, Set μ¬ν (0) | 2021.07.02 |
[python μ¬ν] 6. μλ£ν (μ§λ₯ν 리μ€νΈ, μ λλ μ΄ν°, κ°λ³λΆλ³, μ λ ¬) (0) | 2021.07.02 |
[python μ¬ν] 5. Special Method (Magic Method) (0) | 2021.07.02 |