Python'da generator va yield
Ro’yxat barcha elementni birdan xotirada saqlaydi. Ba’zan bu isrof: million son kerak bo’lsa-yu, siz ularni birma-bir ishlatib tashlasangiz? Generator shu muammoni yechadi: u qiymatlarni kerak bo’lganda birma-bir ishlab chiqaradi.
yield — qiymatni “uzatib” turish
Generator oddiy funksiya kabi yoziladi, lekin return
o’rniga yield ishlatiladi:
yield funksiyani to’xtatib turadi: bitta qiymat beradi, keyin keyingi
so’ralganda o’sha joydan davom etadi. return esa funksiyani butunlay
tugatardi — mana asosiy farq.
Nega generator — xotira tejaydi
Ro’yxat va generatorni solishtiring:
# Ro'yxat: million son XOTIRADA saqlanadi
sonlar = [x for x in range(1_000_000)]
# Generator: sonlar birma-bir hosil qilinadi, saqlanmaydi
sonlar = (x for x in range(1_000_000))
Qavs turi farq qiladi: [...] — ro’yxat, (...) — generator. Generator bir
paytda faqat bitta sonni xotirada tutadi. Katta ma’lumot bilan ishlaganda
bu katta farq.
Amaliy mashq
Generator bilan xotirani tejang:
- 1 dan 10 gacha sonlarni
yieldbilan qaytaradigan generator yozing; - uni
forbilan aylanib chiqing; next()bilan bittalab qiymat oling;- xuddi shu vazifani oddiy ro’yxat qaytaradigan funksiya bilan yozing;
- ikkalasini
sys.getsizeof()bilan solishtiring — 1 dan 100000 gacha qilib ko’ring.
Generator tugagach yana next() chaqirsangiz nima bo’ladi?
Qisqacha xulosa
- Generator qiymatlarni birma-bir, kerak bo’lganda ishlab chiqaradi.
yieldfunksiyani to’xtatib, bitta qiymat beradi va keyin davom etadi.(x for x in ...)— generator;[x for x in ...]— ro’yxat.- Generator xotira tejaydi: bir paytda bitta element saqlanadi.
- Generatorni faqat bir marta aylanish mumkin.
Keyingi darsda fayl o’qish va yozish — ma’lumotni diskda saqlashni ko’ramiz.