Python generatorlari
Generatorlar
Generatorlar - bu ularning bajarilishini to‘xtatib turishi va davom ettirishi mumkin bo‘lgan funksiyalar.
Jeneratör funksiyasi chaqirilganda, u iterator bo‘lgan generator obyektini qaytaradi.
Funksiya ichidagi kod hali bajarilmagan, u faqat kompilyatsiya qilingan. Funksiya faqat generator ustida takrorlanganda ishlaydi.
Misol
Oddiy generator funksiyasi:
def my_generator():
yield 1
yield 2
yield 3
for value in my_generator():
print(value)
O‘zingiz sinab ko‘ring »
Generatorlar butun ma’lumotlar to‘plamini xotirada saqlamasdan ma’lumotlarni takrorlash imkonini beradi.
returndan foydalanish o‘rniga generatorlaryieldkalit so‘zidan foydalanadilar.
Yild kalit so‘zi
yieldkalit so‘zi funksiyani generatorga aylantiradi.
yieldga duch kelganda, funksiya holati saqlanadi va qiymat qaytariladi. Keyingi safar generator chaqirilganda, u to‘xtagan joydan davom etadi.
Misol
Raqamlarni chiqaradigan generator:
def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
for num in count_up_to(5):
print(num)
O‘zingiz sinab ko‘ring »
Funksiyani tugatadiganreturndan farqli o‘laroq,yielduni pauza qiladi va uni bir necha marta chaqirish mumkin.
Generatorlar xotirani saqlaydi
Generatorlar xotiradan tejamkor, chunki ular hamma narsani xotirada saqlash o‘rniga, o‘z vaqtida qiymatlarni hosil qiladi.
Katta ma’lumotlar to‘plami uchun generatorlar xotirani saqlaydi:
Misol
Katta ketma-ketliklar uchun generator:
def large_sequence(n):
for i in range(n):
yield i
# This doesn't create a million numbers in memory
gen = large_sequence(1000000)
print(next(gen))
print(next(gen))
print(next(gen))
O‘zingiz sinab ko‘ring »
Generatorlar bilan next() dan foydalanish
next() funksiyasidan foydalanib, generator orqali qo‘lda takrorlashingiz mumkin:
Misol
def simple_gen():
yield "Emil"
yield "Tobias"
yield "Linus"
gen = simple_gen()
print(next(gen))
print(next(gen))
print(next(gen))
O‘zingiz sinab ko‘ring »
Boshqa qiymatlar qolmaganda, generator StopIteration istisnosini keltirib chiqaradi:
Misol
def simple_gen():
yield 1
yield 2
gen = simple_gen()
print(next(gen))
print(next(gen))
print(next(gen)) # This will raise StopIteration
O‘zingiz sinab ko‘ring »
Generator ifodalari
Ro‘yxatdagi tushunchalarga o‘xshab, siz generatorlarni kvadrat qavslar o‘rniga qavslar bilan ifodalash orqali yaratishingiz mumkin:
Misol
Ro‘yxatni tushunish va generator ifodasi:
# List comprehension - creates a list
list_comp = [x * x for x in range(5)]
print(list_comp)
# Generator expression - creates a generator
gen_exp = (x * x for x in range(5))
print(gen_exp)
print(list(gen_exp))
O‘zingiz sinab ko‘ring »
Misol
sum bilan generator ifodasidan foydalanish:
# Calculate sum of squares without creating a list
total = sum(x * x for x in range(10))
print(total)
O‘zingiz sinab ko‘ring »
Fibonachchi ketma-ketlik generatori
Generatorlar Fibonachchi ketma-ketligini yaratish uchun ishlatilishi mumkin.
U xotira tugashisiz cheksiz qiymatlarni yaratishda davom etishi mumkin:
Misol
Generate 100 Fibonacci numbers:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
# Get first 100 Fibonacci numbers
gen = fibonacci()
for _ in range(100):
print(next(gen))
O‘zingiz sinab ko‘ring »
Generator usullari
Generatorlarda ilg‘or boshqaruvning maxsus usullari mavjud:
send() usuli
send() usuli generatorga qiymat yuborish imkonini beradi:
Misol
def echo_generator():
while True:
received = yield
print("Received:", received)
gen = echo_generator()
next(gen) # Prime the generator
gen.send("Hello")
gen.send("World")
O‘zingiz sinab ko‘ring »
close() usuli
close() usuli generatorni to‘xtatadi:
Misol
def my_gen():
try:
yield 1
yield 2
yield 3
finally:
print("Generator closed")
gen = my_gen()
print(next(gen))
gen.close()
O‘zingiz sinab ko‘ring »
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
