Pythonda generator va yield dan foydalanish
Biror marta sistemangizning xotirasini to'ldirib qo'yadigan darajada yirik dataset bilan ishlaganmisiz ? Balki sizda har doim chaqirilgan tizimning ichgi xolatidan xabar berib turuvchi komplex funksiya yozgandursiz, lekin funksiyaning o'ziga class yaratish uchun funksiyaning hajmi arzimas bo'lgandur. Shunday vaziyatlarda generator va yield sizga yordam beradi.
Ushbu maqoladagi misollarni o'zingzda sinash uchun bu yerdan datasetni yuklab oling
Generatorlardan foydalanish
PEP 255 da tafsif berilgan, generatorlar lazy iterator qaytaradigan maxsus funksiyalardir. Ular iteratsiya qilsa bo'ladigan listga o'xshagan obyektlardir. Listlardan farqi, gerator o'zining kontentini xotirada saqlamaydi.
import sys
# Generatorlar bilan data pipeline yasash
# Biz yirik malumotlar ustida ishlaganimizda, generatordan foydalanishimiz mumkin
# Sababi generator kontentini list kabi xotirada saqlamaydi
try:
file_name = sys.argv[1]
except:
print("Iltimos fayl nomini kiriting: \> python file_name.py file_name.csv")
sys.exit()
# Faylning har bir qatorini o'qiydigan generator
lines = (line for line in open(file_name))
# Har bir qatorning valuelarini vergul bilan bo'lib olib listga
# qo'shib beradigan generator
list_line = (s.strip().split(",") for s in lines)
# bir marta next() ni chaqirib ustunlarning nomlarini o'zgaruvchiga
# biriktirib olamiz
cols = next(list_line)
# data = next(list_line) # ikkinchi qatordagi datani olamiz
# print(dict(zip(cols, data))) # ustun nomlari va dataning qiymatlari # yordamida dictionary yasaydi.
# zip() ni chaqirib columt nomlari bilan datani birlashitirib
# olamizda keyin undan dictionary yasaymiz:
# 1. keylar column nomlar bo'ladilar cols o'zgaruvchisiga biriktirilgan
# 2. valuelar esa list_line o'zgaruvchisiga generator orqali ketma ket biriktiriladigan malumotlar bo'ladi
company_dicts = (dict(zip(cols, data)) for data in list_line)
# Seriasi aga teng bo'lgan har bir kompaniyani filterlaydi.
# va shu kompaniyalarni raisedAmt sini generatorning yield
# statementidagi elementi qilib belgilaydi.
funding = (
int(company_dict['raisedAmt'])
for company_dict in company_dicts
if company_dict['round'] == "a"
)
# CSV fayldagi A seriaga ega kompaniyalarning raisedAmt fondining
# yig'indisini olish uchun sum() ni chaqirib generatordagi
# iteratsiyani ishga tushiramiz.
total_series = sum(funding)
print(f"A seriadagai umumiy fond miqdori: ${total_series}")