تعرف على كيف يمكن أن يساعدك هذا النوع البديل من الوظائف في تقليل أثر الذاكرة.

إذا كنت تقرأ سطورًا من ملف سجل أو تعالج قائمة طويلة من العناصر، فأحد الخيارات هو تحميل البيانات بأكملها إلى الذاكرة. ومع ذلك، يمكن أن يستخدم هذا الأسلوب قدرًا كبيرًا من الذاكرة ويعوق الأداء. تقدم المولدات حلا قيما.

تلغي المولدات الحاجة إلى تحميل جميع البيانات في الذاكرة في وقت واحد. إنها مفيدة عند التعامل مع مجموعات البيانات الكبيرة أو التسلسلات اللانهائية أو أي سيناريو تكون فيه كفاءة الذاكرة أمرًا بالغ الأهمية.

ما هي المولدات؟

المولد هو وظيفة خاصة تتيح لك التكرار عبر سلسلة من القيم. وبدلاً من إرجاع مجموعة كاملة من البيانات، فإنها تنشئ - أو تنتج - قيمة واحدة في كل مرة. وهذا يجعلها فعالة في التعامل مع تسلسلات كبيرة أو غير محدودة من البيانات.

أ وظيفة بايثون العادية عادةً ما يحسب القيمة ويعيدها. لكن المولدات تعمل بشكل مختلف. يمكنهم الحصول على قيم متعددة بمرور الوقت عن طريق إيقاف التنفيذ مؤقتًا واستئنافه بين كل عائد.

الفرق الرئيسي بين الوظائف العادية والمولدات هو أنه بدلاً من استخدام يعود الكلمة الأساسية لإنتاج نتيجة، استخدام المولدات أَثْمَر.

instagram viewer

كيفية إنشاء مولد

لإنشاء مولد، بدلا من يعود بيان، استخدم أ أَثْمَر بيان داخل الوظيفة. ال أَثْمَر لا تقوم الكلمة الأساسية بتوجيه الوظيفة لإرجاع قيمة فحسب، بل تتيح لها أيضًا حفظ حالتها، مما يسمح بالاستئناف في المستقبل.

فيما يلي مثال لوظيفة مولد بسيطة:

defnumeric_generator():
yield1
yield2
yield3

gen = numeric_generator()

تنتج وظيفة المولد هذه قيمًا رقمية من 1 إلى 3.

ال أَثْمَر يحفظ البيان حالة الوظيفة، مع الحفاظ على المتغيرات المحلية بين الاستدعاءات، لاستئنافها عند طلب القيمة التالية.

يؤدي تعيين دالة مولد لمتغير إلى إنشاء كائن مولد يمكنك العمل معه.

العمل مع المولدات

المولدات لديها تطبيقات متعددة. يمكنك استخدامها في للحلقات أو ضمن قائمة الفهم، بالإضافة إلى الهياكل التكرارية الأخرى. يمكن للمولدات أيضًا أن تكون بمثابة وسيطات للوظائف.

بمجرد إنشاء المولد، يمكنك التكرار عليه باستخدام حلقة for:

for i in numeric_generator():
print(i)

يمكنك أيضًا استخدام التالي وظيفة لاسترداد القيم واحدة تلو الأخرى:

print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3

يمنحك هذا مزيدًا من التحكم في كائن المولد.

يمكن للمولدات تتبع حالتها. كل عبارة عائد في دالة تعمل كنقطة تفتيش. عندما تتصل ب التالي() على كائن المولد، يبدأ التنفيذ من نقطة العائد السابقة.

يمكنك أيضًا تمرير القيم إلى المولد باستخدام يرسل():

defgenerator_with_send():
# First yield: Receive a value
x = yield
print(f"Received: {x}")

# Second yield: Receive another value
y = yield
print(f"Received: {y}")

# Third yield: Yield the sum
yield x + y

gen = generator_with_send()

# Start generator and reach first yield
next(gen)

# Send 10 into generator, received at first yield
result = gen.send(10)

# Send 5 into generator, received at second yield
result = gen.send(5)

# Print result of third yield
print(result)

ال يرسل() تتيح لك هذه الطريقة استرداد القيم من المولد وإرسال القيم مرة أخرى إلى وظيفة المولد، وإيقافها مؤقتًا بشكل فعال، والسماح لك بالتحكم في تنفيذها. ال يرسل() هذه الطريقة مفيدة عند كتابة coroutines أو استخدام المولدات لأغراض متقدمة.

استخدام تعبيرات المولدات

توفر تعبيرات المولد طريقة مختصرة لإنشاء مولد بسيط ومجهول. وهي تشبه قائمة الفهم ولكنها تستخدم الأقواس بدلاً من الأقواس.

هنا مثال:

gen = (i**2for i in range(10))

for x in gen:
print(x)

يقوم الكود بإنشاء تعبير منشئ ينتج عنه مربعات الأرقام من 0 إلى 9. تعتبر تعبيرات المولدات مثالية لتوليد سلسلة من القيم بتكاسل.

استخدام المولدات لمعالجة البيانات

تعد مولدات Python طريقة ملائمة لوصف تدفقات البيانات وإنشاء التكرارات دون الاحتفاظ بكل شيء في الذاكرة. يمكنك تحسين برمجتك بشكل كبير من خلال تعلم استخدام المولدات، مما يسهل التعامل مع مهام معالجة البيانات الصعبة.

في المرة القادمة التي تعمل فيها مع مجموعات كبيرة من البيانات، ضع المولدين في الاعتبار وقم بتفويض المهام كثيفة العمالة إليهم، بحيث تظل التعليمات البرمجية الخاصة بك سريعة الاستجابة وفعالة.