شرح مهمة بايثون مع مقابلات العمل

تحية ، الخبروفيت! تحسبا لإطلاق موضوع جديد في الدورة التدريبية "مطور الويب في بيثون" ، نريد مشاركة ترجمة مفيدة جديدة. دعنا نذهب!



بعد أن ذهبت إلى عدة مقابلات مرة أخرى واجتازت مهام الاختبار ، لاحظت أن من يجرون المقابلات يحبون المهام مثل ما يلي.

def f(x, l=[]): for i in range(x): l.append(i * i) return l >>> f(2) >>> f(3, [0, 1, 2]) >>> f(3) 


السؤال: ما سوف يخرج هذا الرمز؟

إخراج السطرين الأولين واضح تمامًا ، لكن نتيجة السطر الثالث f(3) لم تكن واضحة جدًا بالنسبة لي. دعونا نرى ما يحدث بعد تهيئة الوظيفة f . لتشغيل هذا الرمز ، سأستخدم IPython .

 >>> f <function __main__.f(x, l=[])> >>> f.__defaults__ ([],) 


القائمة الفارغة التي نراها من نتيجة تنفيذ f.__defaults__ هي المتغير l في رمز الوظيفة.

 >>> f(2) [0, 1] 


لا شيء خاص.

 >>> f <function __main__.f(x, l=[0, 1])> >>> f.__defaults__ ([0, 1],) 


ولكن! الآن نرى أن المتغير l له القيمة [0, 1] بسبب تباين كائن القائمة في Python وتمرير وسيطات الدالة كمرجع.

 >>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1])> 


لا شيء خاص أيضا. مجرد تمرير كائن list كمتغير l .

 >>> f(3) [0, 1, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1, 0, 1, 4])> 


والآن الأكثر إثارة للاهتمام. عند تشغيل f(3) ، لا يستخدم Python القائمة الفارغة التي تم تعريفها في رمز الوظيفة ، ويستخدم المتغير l مع القيم من f.__defaults__ ([0, 1]) .

PS

إذا كنت بحاجة إلى وظيفة تستخدم قائمة فارغة بعد كل مكالمة ، فيجب عليك استخدام شيء من هذا القبيل (عيّن قيمة 'l' إلى 'None' ).

 def f(x, l=None): if l is None: l = [] for i in range(x): l.append(i * i) return l >>> f(2) [0, 1] >>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f(3) [0, 1, 4] 


استنتاج


لذلك قمت بإجراء واحدة من المهام الأكثر شعبية اختبار للمقابلة. يهدف هذا المنشور إلى إظهار أنه لا يمكنك دائمًا الاعتماد على حدسك ، كما أفعل بنفسي :-).

نأمل أن تكون هذه الترجمة مفيدة لك. تقليديا ، نحن في انتظار التعليقات ونراكم في الدورة .

Source: https://habr.com/ru/post/ar459518/


All Articles