cb
codebamin
الفصل 9 · الدوال البرمجية (Functions)

تفاصيل متقدمة حول إرجاع القيم وإنهاء التنفيذ

قد تكون return مصدرًا لبعض الالتباس والأخطاء في البداية، لذلك سنفهم سلوكها بدقة أكبر.

شغّل الكود التالي:

__copyable__ __program_indented__

بمجرد تنفيذ تعليمة return تتوقف الدالة فورًا، ويُتجاهل ما تبقى من كود ذلك الاستدعاء. لذلك فإن أي كود يأتي مباشرة بعد return في الكتلة نفسها يكون غير قابل للوصول. مثلًا، إذا سبق return 2 سطر return آخر ينفذ دائمًا، فلن يصل التنفيذ إلى return 2 مهما استدعينا الدالة.

في كل استدعاء للدالة يمكن تنفيذ return واحدة فقط؛ وبعدها ينتهي الاستدعاء.

مع ذلك يمكن وجود عدة تعليمات return في تعريف واحد عندما تكون في فروع مختلفة، مثل:

if condition: return value1 else: return value2

من الأخطاء الشائعة أيضًا سوء فهم return داخل حلقات for. جرّب:

__copyable__ __program_indented__

قد يبدو لأول وهلة منطقيًا أن تستخدم return لإعادة قيمة في كل دورة من حلقة for، لكن return لا تعمل بهذه الطريقة. إذا تتبعت الكود سطرًا بسطر سترى أن الدالة تعيد القيمة في أول دورة ثم تنتهي فورًا.

حتى لو كان في التعريف سطر return واحد فقط، فإنه عند تنفيذه ينهي الاستدعاء ويعيد قيمة واحدة. إذا أردت إعادة عدة قيم معًا، يمكنك جمعها في قائمة ثم إعادة القائمة:

__copyable__ def double_numbers(numbers): doubles = [] for x in numbers: doubles.append(x * 2) return doubles

check_result(double_numbers([1, 2, 3]), [2, 4, 6])

وماذا يحدث مع الحلقات المتداخلة؟ جرّب الدالة التالية:

__copyable__ __program_indented__

كما رأيت، return توقف الدالة كلها، بما في ذلك أي حلقات موجودة بداخلها.

تعلمنا سابقًا كيف نوقف حلقة فقط باستخدام break. غيّر return letter إلى break وشغّل البرنامج، ثم لاحظ الفرق: break تنهي الحلقة التي توجد داخلها، بينما return تنهي استدعاء الدالة بالكامل.

على عكس return، فإن break توقف فقط الحلقة الداخلية التي توجد بداخلها. في المثال for number in range(3): يحدث الآتي بالتحديد:

  • عندما تكون letter = b يُنفذ السطر print(f"{letter} {number}") فقط عند number = 0.
  • بعد ذلك توقف break الحلقة الداخلية.
  • تواصل الحلقة الخارجية عملها وتنتقل إلى الحرف التالي c.
  • وعند c تُنفذ الحلقة الداخلية كاملة لأن شرط break لا يتحقق.
solution.py
1
2
3
4
5
6
7
8
9
10
الطرفية (shell)
>>>