"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يعمل العائد والعائد معًا في مولدات Python 3.3؟

كيف يعمل العائد والعائد معًا في مولدات Python 3.3؟

تم النشر بتاريخ 2024-11-01
تصفح:350

How Do Return and Yield Work Together in Python 3.3 Generators?

استخدام الإرجاع والعائد معًا في مولدات بايثون

في بايثون 2، عبارة الإرجاع داخل دالة المولد التي تستخدم أيضًا العائد قد تؤدي إلى خطأ. ومع ذلك، حدث تغيير طفيف في Python 3.3.

عرض الكود

خذ بعين الاعتبار كود Python 3.3 التالي:

def f():
  return 3
  yield 2
  
x = f()
print(x.__next__())

شرح

في هذا الكود، تتضمن الدالة f كلا من بيان الإرجاع وبيان العائد. عند استدعاء الدالة، يتم تنفيذ عبارة الإرجاع أولاً، ويتم إرجاع القيمة 3. ونتيجة لذلك، لا يتم تنفيذ بيان العائد.

عندما يتم تكرار المولد x عن طريق استدعاء الأسلوب

التالي الخاص به، يتم رفع استثناء StopIteration بقيمة 3. وهذا يعني أن تم استنفاد مُكرِّر المولد، والقيمة التي تم إرجاعها بواسطة عبارة الإرجاع متاحة كسمة قيمة للاستثناء.

آلية جديدة في Python 3.3

وفقًا لـ PEP 380 هذا السلوك هو ميزة جديدة تم تقديمها في Python 3.3. وهو يعادل كتابة:

def f():
  yield 3
  raise StopIteration

مثال مع العائد من يوضح المثال التالي كيف يؤثر هذا السلوك على المولدات المفوضة باستخدام العائد من بناء الجملة:

def و (): العودة 1 العائد 2 مواطنه ز (): س = العائد من f () طباعة (خ) لا يزال # g مولدًا لذا نحتاج إلى التكرار لتشغيله: ل _ في ز (): pass
def f():
    return 1
    yield 2

def g():
    x = yield from f()
    print(x)

# g is still a generator so we need to iterate to run it:
for _ in g():
    pass
بيان الافراج أعيد طبع هذه المقالة على: 1729747611 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3