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:

Python

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. 1 dan 10 gacha sonlarni yield bilan qaytaradigan generator yozing;
  2. uni for bilan aylanib chiqing;
  3. next() bilan bittalab qiymat oling;
  4. xuddi shu vazifani oddiy ro’yxat qaytaradigan funksiya bilan yozing;
  5. 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.
  • yield funksiyani 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.

Bu dars foydali bo'ldimi?

marta ko'rildi