استخدام الإرجاع والعائد معًا في مولدات بايثون
في بايثون 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
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3