0Pricing
Python Academy · درس

الكلمة المفتاحية yield

اكتب دوال مولّدات باستخدام yield لإنشاء مكرّرات مخصصة

الكلمة المفتاحية yield درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Python Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Python Academy 4 دروس في المجموع.

مقدمة

تستخدم دوال المولّدات yield لإنتاج تسلسل من القيم بشكل كسول، مع إيقاف التنفيذ مؤقتًا بين كل yield.

ما هو yield؟

الدالة التي تحتوي على yield هي دالة مولّد. تستأنف كل عملية استدعاء لـ next() التنفيذ من آخر yield.
def count_up(n):
    for i in range(n):
        yield i
for x in count_up(3):
    print(x)

دالة المولّد مقابل الدالة العادية

يعيد استدعاء دالة مولّد كائن مولّد، ولا ينفّذ أي شفرة بعد. تُنفّذ الشفرة أثناء التكرار.
def gen():
    print('start')
    yield 1
    print('middle')
    yield 2
g = gen()  # no print yet
print(next(g))  # 'start', then 1

المولّد اللانهائي

‏def naturals(n=0): while True: yield n; n+=1 هو تسلسل لا نهائي. استخدمه مع islice أو break.
def naturals(n=0):
    while True:
        yield n
        n += 1
import itertools
print(list(itertools.islice(naturals(), 5)))

yield from

تفوض yield from sub_gen() التنفيذ إلى مولّد فرعي، وتمرّر جميع القيم. وهي مكافئة لـ for x in sub: yield x.
def chain(*iters):
    for it in iters:
        yield from it
print(list(chain([1,2], [3,4], [5])))

إرسال القيم باستخدام send()

تستأنف gen.send(value) المولّد، وتمرّر أيضًا قيمة تصبح ناتج تعبير yield.
def accumulator():
    total = 0
    while True:
        n = yield total
        if n is None: break
        total += n
g = accumulator()
next(g)  # prime
print(g.send(10))
print(g.send(5))

حالة المولّد

يتوقف المولّد مؤقتًا عند كل yield ويحتفظ بمتغيراته المحلية بين الاستدعاءات، فيعمل كروتين تعاوني طبيعي.
def stateful():
    seen = set()
    while True:
        item = yield
        seen.add(item)
        yield len(seen)
g = stateful()
next(g); g.send('a'); print(next(g)); g.send('b'); print(next(g))

إغلاق مولّد

تُلقي gen.close() الاستثناء GeneratorExit داخل المولّد. استخدم try/finally داخل المولّد لإجراء التنظيف.
def resource_gen():
    try:
        while True:
            yield
    finally:
        print('cleaned up')
g = resource_gen()
next(g)
g.close()

StopIteration وreturn

تعيّن return value في المولّد قيمة السمة value لاستثناء StopIteration. ويستخدم yield from هذه القيمة لاستردادها.
def gen_with_return():
    yield 1
    yield 2
    return 'done'
g = gen_with_return()
try:
    while True: print(next(g))
except StopIteration as e:
    print('returned:', e.value)

مولّد فيبوناتشي

تتفوّق المولّدات في إنشاء التسلسلات الرياضية اللانهائية: yield a; a, b = b, a+b
def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
import itertools
print(list(itertools.islice(fibonacci(), 10)))

المولّدات مقابل الفئات التي تستخدم __iter__

المولّدات أبسط من كتابة فئة تستخدم __iter__ و__next__. استخدم المولّدات للتسلسلات المباشرة.
# Generator is simpler than:
# class Counter:
#     def __iter__(self): return self
#     def __next__(self): ...
print('generators simplify iterators')

تحقق سريع

ماذا تفعل yield from sub() داخل دالة مولّد؟

مراجعة

توقِف `yield` الدالة المولّدة مؤقتًا. تُعيد الدوال المولّدة كائنًا مولّدًا. تفوّض `yield from` التنفيذ إلى مولّدات فرعية. تمرّر `send()` القيم إلى الداخل. وتفعّل `close()` إجراءات التنظيف.

واصل التقدم

ممتاز! تابع إلى الدرس التالي لتعميق مهاراتك.

الأسئلة الشائعة

هل درس «الكلمة المفتاحية yield» مجاني؟

نعم — نص درس «الكلمة المفتاحية yield» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.

ماذا ستتعلم في «الكلمة المفتاحية yield»؟

اكتب دوال مولّدات باستخدام yield لإنشاء مكرّرات مخصصة تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟

لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «الكلمة المفتاحية yield»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟

نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. اختصارات القوائم البرمجية
  2. اختصارات المجموعات والقواميس
  3. تعبيرات المولّدات
  4. الكلمة المفتاحية yield
← العودة إلى Python Academy