Итераторлор жана генераторлор
Маанилерди бирден, талап боюнча чыгарыңыз, бүт тизмени түзбөстөн
return'ду yield'ге алмаштырасыз, ошондо Python сизге жалкоо, эс тутумга үнөмдүү маанилер агымын берет.
- итератор протоколун түшүндүрүү (
__iter__,__next__,StopIteration), - итерациялануучу объектти итератордон айырмалоо,
yieldменен генератор-функция жазуу жана анын кантип токтоп, кайра иштээрин байкоо,- жалкоо эсептөө жөнүндө ой жүгүртүү жана эмне үчүн ал эс тутумду үнөмдөгөнүн түшүнүү,
- ыкчам генератордук туюнтмаларды колдонуу жана алар тизмелик түзүлүштөн качан жакшы экенин билүү.
1. for циклинде чындыгында эмне болот
Сиз for x in items: дегенди жүздөгөн жолу жаздыңыз. Чындыгында Python эки кадамдуу бий бийлейт. Адегенде ал итератор алуу үчүн iter(items) чакырат. Андан кийин ар бир өтүүдө ошол итератордон бир маани тартып алуу үчүн next() чакырат. Итератордо эч нерсе калбаганда, ал атайын өзгөчө кырдаалды — StopIteration — көтөрөт, ошондо цикл тынч аяктайт.
Бул бийди кол менен аткарса болот:
nums = [10, 20, 30]
it = iter(nums) # тизмеден итератор алуу
print(next(it)) # 10
print(next(it)) # 20
print(next(it)) # 30
print(next(it)) # StopIteration көтөрөт
for цикли — так ушул ыкма, бирок StopIteration сиз үчүн кармалат. Муну түшүнүү бул темадагы дээрлик бардык нерсени түшүндүрөт.