دوال المُولّد
أنتج القيم كسولًا باستخدام yield
دوال المُولّد درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.
ما المولّد؟
تبدو الدالة المولّدة كدالة عادية، لكنها تستخدم yield بدلاً من return أو إلى جانبه. لا يؤدي استدعاؤها إلى تنفيذ جسمها؛ بل يعيد كائنًا مولّدًا، وهو مكرّر.
def gen():
yield 1
yield 2
yield 3
g = gen()
print(type(g).__name__)
print(list(g))يوقِف yield التنفيذ مؤقتًا
في كل مرة تستدعون فيها next()، تُنفّذ الدالة حتى تصل إلى yield، ثم تعيد تلك القيمة وتجمّد حالتها. ويستأنف الاستدعاء التالي التنفيذ مباشرةً بعد yield.
def steps():
print('start')
yield 'a'
print('resumed')
yield 'b'
g = steps()
print(next(g))
print(next(g))التكرار على مولّد
بما أن المولّد مكرّر، فإن حلقة for تقوده تلقائيًا وتتوقف عند انتهاء الدالة، وهو ما يرفع StopIteration داخليًا.
def countdown(n):
while n > 0:
yield n
n -= 1
for x in countdown(4):
print(x)التقييم الكسول
المولّدات كسولة: لا تُنتَج القيم إلا عند طلبها. وهذا يعني أن بإمكانكم تمثيل تسلسلات ضخمة جدًا أو لا نهائية من دون استهلاك قدر كبير من الذاكرة.
def naturals():
n = 1
while True:
yield n
n += 1
g = naturals()
print(next(g), next(g), next(g))الحالة بين مواضع yield
تحافظ المتغيرات المحلية على قيمها بين مواضع yield. ويتذكر المولّد تلقائيًا الموضع الذي توقف عنده، من دون الحاجة إلى إدارة فهرس يدويًا.
def fib():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
g = fib()
print([next(g) for _ in range(7)])المولّدات مقابل إنشاء قائمة
تبني الدالة العادية القائمة كاملة وتعيدها دفعة واحدة. أما المولّد فينتج العناصر عند الطلب. استخدموا مولّدًا عندما يكون التسلسل كبيرًا أو عندما قد تتوقفون قبل الوصول إلى نهايته.
def squares_list(n):
result = []
for i in range(n):
result.append(i * i)
return result
def squares_gen(n):
for i in range(n):
yield i * i
print(squares_list(5))
print(list(squares_gen(5)))التوقف مبكرًا
بما أن الإنتاج كسول، يمكنكم الخروج من الحلقة، وعندها لن يحسب المولّد بقية العناصر ببساطة.
def naturals():
n = 1
while True:
print('producing', n)
yield n
n += 1
for x in naturals():
if x > 3:
break
print('got', x)استخدام return داخل مولّد
ينهي return المجرد داخل المولّد عمله ببساطة، إذ يرفع StopIteration. وتصبح أي قيمة تعيدونها سمة value للاستثناء، لكن معظم الحلقات تتجاهلها.
def up_to(stop):
i = 0
while True:
if i >= stop:
return
yield i
i += 1
print(list(up_to(4)))المولّدات أحادية الاستخدام
مثل جميع المكرّرات، يُستهلك المولّد مرة واحدة. وبعد استنفاده لا ينتج أي شيء. استدعوا الدالة مرة أخرى للحصول على مولّد جديد.
def gen():
yield 1
yield 2
g = gen()
print(list(g))
print(list(g))
print(list(gen()))التصفية باستخدام المولّدات
تتيح المولّدات إنشاء مسارات واضحة لمعالجة البيانات. ننتج هنا الأعداد الزوجية فقط، واحدًا تلو الآخر.
def evens(numbers):
for n in numbers:
if n % 2 == 0:
yield n
print(list(evens(range(10))))تسلسل المولّدات
يمكن لمولّد أن يستهلك مولّدًا آخر، وبذلك ينشئ مسارًا متعدد المراحل تكون كل مرحلة فيه كسولة.
def numbers(n):
for i in range(n):
yield i
def doubled(src):
for x in src:
yield x * 2
print(list(doubled(numbers(5))))اختبار سريع
اختبروا مدى فهمكم للدوال المولّدة.
مراجعة
لقد تعلمتم الدوال المولّدة:
- يوقِف
yieldالتنفيذ مؤقتًا ويستأنفه مع الحفاظ على الحالة المحلية. - يعيد استدعاء الدالة كائنًا مولّدًا كسولًا.
- توفّر الذاكرة وتناسب المسارات وتدفقات البيانات اللانهائية.
- هي أحادية الاستخدام، مثل أي مكرّر.
التالي: تعبيرات المولّدات الأكثر اختصارًا.
الأسئلة الشائعة
هل درس «دوال المُولّد» مجاني؟
نعم — نص درس «دوال المُولّد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «دوال المُولّد»؟
أنتج القيم كسولًا باستخدام yield تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «دوال المُولّد»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- بروتوكول المكرّر
- دوال المُولّد
- تعبيرات المُولّد
- yield from والتفويض