تفاصيل متقدمة حول إرجاع القيم وإنهاء التنفيذ
قد تكون return مصدرًا لبعض الالتباس والأخطاء في البداية، لذلك سنفهم سلوكها بدقة أكبر.
شغّل الكود التالي:
def foo():
return 1
return 2
print(foo())
بمجرد تنفيذ تعليمة return تتوقف الدالة فورًا، ويُتجاهل ما تبقى من كود ذلك الاستدعاء. لذلك فإن أي كود يأتي مباشرة بعد return في الكتلة نفسها يكون غير قابل للوصول. مثلًا، إذا سبق return 2 سطر return آخر ينفذ دائمًا، فلن يصل التنفيذ إلى return 2 مهما استدعينا الدالة.
في كل استدعاء للدالة يمكن تنفيذ return واحدة فقط؛ وبعدها ينتهي الاستدعاء.
مع ذلك يمكن وجود عدة تعليمات return في تعريف واحد عندما تكون في فروع مختلفة، مثل:
if condition:
return value1
else:
return value2
من الأخطاء الشائعة أيضًا سوء فهم return داخل حلقات for. جرّب:
def double_numbers(numbers):
for x in numbers:
return x * 2
check_result(double_numbers([1, 2, 3]), [2, 4, 6])
قد يبدو لأول وهلة منطقيًا أن تستخدم return لإعادة قيمة في كل دورة من حلقة for، لكن return لا تعمل بهذه الطريقة. إذا تتبعت الكود سطرًا بسطر سترى أن الدالة تعيد القيمة في أول دورة ثم تنتهي فورًا.
حتى لو كان في التعريف سطر return واحد فقط، فإنه عند تنفيذه ينهي الاستدعاء ويعيد قيمة واحدة. إذا أردت إعادة عدة قيم معًا، يمكنك جمعها في قائمة ثم إعادة القائمة:
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])
وماذا يحدث مع الحلقات المتداخلة؟ جرّب الدالة التالية:
def foo():
for letter in 'abc':
for number in range(3):
print(f'{letter} {number}')
if letter == 'b':
return letter
foo()
كما رأيت، 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لا يتحقق.