0Pricing
Python Academy · درس

yield from والتفويض

كوّن المُولّدات

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

المشكلة التي يحلّها yield from

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

def manual():
    for x in [1, 2, 3]:
        yield x

print(list(manual()))

مقدمة إلى yield from

يفوّض yield from iterable التنفيذ إلى ذلك الكائن القابل للتكرار، وينتج كل قيمة من قيمه بالتتابع. وهو أقصر وأوضح من حلقة تمرير القيم.

def delegate():
    yield from [1, 2, 3]

print(list(delegate()))

دمج مصادر متعددة

يمكنكم تسلسل عدة عبارات yield from لضمّ التسلسلات بطريقة كسولة.

def chained():
    yield from 'ab'
    yield from [1, 2]
    yield from range(2)

print(list(chained()))

التفويض إلى مولّد آخر

يمكن أن يكون الكائن القابل للتكرار المفوَّض إليه مولّدًا بحد ذاته، مما يتيح لكم تركيب المولّدات لإنشاء مولّدات أكبر.

def evens(n):
    for i in range(n):
        if i % 2 == 0:
            yield i

def report(n):
    print('evens:')
    yield from evens(n)

print(list(report(6)))

تسطيح القوائم المتداخلة

من الاستخدامات الكلاسيكية لـ yield from التسطيح التكراري: إنشاء مولّد يفوّض التنفيذ إلى نفسه عند معالجة القوائم الفرعية.

def flatten(items):
    for item in items:
        if isinstance(item, list):
            yield from flatten(item)
        else:
            yield item

print(list(flatten([1, [2, [3, 4]], 5])))

yield from مقابل الحلقة

ينتج الإصداران أدناه المخرجات نفسها. ويُفضَّل yield from لوضوحه، ولأنه يمرّر أيضًا ميزات متقدمة مثل إرسال القيم ونتائج الإرجاع.

def with_loop(src):
    for x in src:
        yield x

def with_yield_from(src):
    yield from src

print(list(with_loop(range(3))))
print(list(with_yield_from(range(3))))

التقاط القيمة المُعادة من المولّد الفرعي

عندما يعيد مولّد مفوَّض إليه قيمة باستخدام return، تكون نتيجة yield from هي تلك القيمة. ويتيح ذلك للمولّدات الفرعية الإبلاغ عن نتيجة.

def counter(n):
    count = 0
    for i in range(n):
        yield i
        count += 1
    return count

def driver():
    total = yield from counter(3)
    print('subgen yielded', total, 'items')

list(driver())

إنشاء مسار

يسهّل التفويض تقسيم المسار إلى مراحل مسمّاة وتركيبها.

def source():
    yield from range(5)

def only_odd(src):
    for x in src:
        if x % 2 == 1:
            yield x

def pipeline():
    yield from only_odd(source())

print(list(pipeline()))

التفويض إلى أي كائن قابل للتكرار

يعمل yield from مع أي كائن قابل للتكرار، وليس مع المولّدات فقط: القوائم، والصفوف، والمجموعات، والسلاسل النصية، ومفاتيح القواميس، وغير ذلك.

def mixed():
    yield from {1, 2, 3}
    yield from ('a', 'b')

result = list(mixed())
print(sorted(str(x) for x in result))

دمج المولّدات بالترتيب

يمكنكم إنشاء مولّد يمرّ على عدة مصادر بالتتابع، وهو أمر مفيد لضمّ تدفقات البيانات.

def concat(*iterables):
    for it in iterables:
        yield from it

print(list(concat([1, 2], [3], [4, 5])))

وضوح القراءة أولًا

بالنسبة إلى البيانات المتداخلة بعمق أو الشبيهة بالأشجار، يحافظ yield from على قِصر المولّدات التكرارية ويجعل الغرض منها واضحًا.

def walk(tree):
    yield tree['name']
    for child in tree.get('children', []):
        yield from walk(child)

tree = {'name': 'root', 'children': [
    {'name': 'a'},
    {'name': 'b', 'children': [{'name': 'c'}]}
]}
print(list(walk(tree)))

اختبار سريع

اختبروا مدى فهمكم لـ yield from.

مراجعة

لقد تعلمتم yield from والتفويض:

  • يمرّر كل قيمة من كائن قابل للتكرار داخلي.
  • يركّب المولّدات ويدعم تسطيح البيانات تكراريًا.
  • يلتقط القيمة المُعادة من المولّد الفرعي.
  • وهو أوضح من حلقة يدوية لتمرير القيم.

المقرر التالي: التزامن باستخدام threading وmultiprocessing.

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

هل درس «yield from والتفويض» مجاني؟

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

ماذا ستتعلم في «yield from والتفويض»؟

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

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

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

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

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

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

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

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

  1. بروتوكول المكرّر
  2. دوال المُولّد
  3. تعبيرات المُولّد
  4. yield from والتفويض
← العودة إلى Python Academy