Функционалдык программалоо паттерндери
Таза функциялар, өзгөрбөстүк жана functools менен itertools аркылуу курала турган конвейерлер
functools, itertools, камтуулар жана генераторлор. Аңдап колдонгондо алар текшерүүгө, кешке жана түшүнүүгө жеңил кодду берет — ойлонбой колдонгондо окулбай турган бир саптык коддор чыгат. Бул тема ФПни пайда келтирген жерде колдонуу тууралуу.
- таза функцияга аныктама берип, шилтемелик тунуктукту түшүндүрүү,
- өзгөрбөс структураларды тандоо (
tuple,frozenset, тоңдурулганdataclass) жана жалпы өзгөрмө абалдын каталарынан алыс болуу, functoolsдон керектүү куралды алуу:reduce,partial,lru_cache,singledispatch,itertoolsменен маалымат агымын жалкоо иштетүү (chain,islice,groupby,accumulate,takewhile),- кичине өзгөртүүлөрдү окулган конвейерге куруу,
- Python'до ФП окулуучулукка зыян келтирген учурду чынчылдык менен таануу.
1. Таза функциялар жана шилтемелик тунуктук
Функция эки эрежени аткарса таза болот: (1) анын кайтарган мааниси гана аргументтерине көз каранды жана (2) ал эч кандай байкала турган каптал эффект жаратпайт — тышкы абалды өзгөртпөйт, кириш-чыгышты жасабайт, сааттан же кокус сандардан окубайт. Бирдей кириштер дайыма бирдей натыйжа берет.
# ТАЗА: натыйжа гана кириштерге көз каранды, тышкы эч нерсе өзгөрбөйт
def add_tax(price: float, rate: float) -> float:
return round(price * (1 + rate), 2)
# ТАЗА ЭМЕС: глобалды окуйт, глобалды өзгөртөт жана кириш-чыгыш жасайт
TOTAL = 0.0
def add_tax_bad(price: float) -> float:
global TOTAL
result = price * 1.2
TOTAL += result # каптал эффект: тышкы абалды өзгөртөт
print(result) # каптал эффект: кириш-чыгыш
return result
Шилтемелик тунуктук дегени — таза функцияга ар кандай чакырууну анын натыйжасы менен алмаштырса болот, программа өзгөрбөйт. add_tax(100, 0.2) бардык жерде 120.0 мааниси менен алмашат. Дал ушул касиет таза функцияларды жеңил текшерилчү (фикстурасыз, моксуз), кешке коопсуз жана параллель иштетүүгө коопсуз кылат — бузула турган жалпы абал жок.