5 الأخطاء الشائعة للمبتدئين بيثون

في الأيام الأولى من العمل كمبرمج بيثون ، نواجه جميعًا أنواعًا مختلفة من الأخطاء في نظامنا ، والتي بعد بضع ساعات مؤلمة في StackOverflow ليست خطأً ، لكن ميزات بيثون. فيما يلي الأخطاء الخمسة الأكثر شيوعًا التي يرتكبها المبرمجون الجدد في بيثون. دعونا نتعرف عليهم قليلاً من أجل توفير عدة ساعات من خلال طرح أسئلة على الصفحات والمجموعات على Facebook.

1. نسخ القواميس أو القوائم


عندما تحتاج إلى عمل نسخة من قاموس أو قائمة ، فإن استخدام عامل التشغيل ببساطة لا يكفي.

خطأ:

>>> dict_a = {"name": "John", "address":"221B Baker street"} >>> dict_b = dict_a 

الآن ، إذا قمت بتغيير أو تحديث dict_b ، فسيتم أيضًا تغيير dict_a - وكل هذا بفضل مشغل المهمة. باستخدام عامل التشغيل هذا ، تحاول أن تقول أن dict_b سيشير إلى نفس الكائن مثل dict_a.

 >>> dict_b["age"] = 26 >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> 

صحيح: استخدم أساليب copy () أو deepcopy ().

 >>> dict_c = dict_b.copy() >>> dict_c["location"] = "somewhere" >>> dict_c {'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'} >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> 

نرى الفرق بين نسخة و deepcopy.

2. مفاتيح القاموس


دعنا نحاول إضافة قيم إلى القاموس:

 >>> dict_a = dict() >>> dict_a {} >>> dict_a[1] = "apple" >>> dict_a[True] = "mango" >>> dict_a[2] = "melon" 

إذا حاولنا عرض القاموس على الشاشة ، فما الذي سنراه؟

 >>> dict_a {1: 'mango', 2: 'melon'} 

ماذا حدث ، أين هو المفتاح الحقيقي؟

يجب أن نتذكر أن الطبقة المنطقية ترث من عدد صحيح (أعداد صحيحة). و عدد صحيح مكافئ لـ True هو 1؛ المكافئ False هو 0. لذلك ، يتم ببساطة استبدال قيمة المفتاح 1.

 >>> isinstance(True, int) True >>> isinstance(False, int) True >>> True == 1 True >>> False == 0 True 

3. تحديث القوائم أو القواميس


افترض أنك تريد إضافة عنصر إلى قائمة.

 >>> list_a = [1,2,3,4,5] >>> list_a = list_a.append(6) >>> list_a >>> # prints nothing 

أو محاولة تحديث القاموس.

 >>> dict_a = {"a" : "b"} >>> dict_a = dict_a.update({"c" : "d"}) >>> dict_a >>> # prints nothing 

الآن دعونا نحاول ترتيب القائمة.

 >>> list_b = [2,5,3,1,7] >>> list_b = list_b.sort() >>> list_b >>> # prints nothing 

لماذا لا يخرج شيء ، ماذا نفعل خطأ؟

يتم تحسين معظم أساليب الحاوية (مثل الفرز والتحديث والإلحاق والإضافة وما إلى ذلك) لأغراض الأداء - وتجنب إنشاء نسخ منفصلة دون داع.

لا تحاول تعيين قيمة الإرجاع لهذه الأساليب إلى متغير.

صحيح:

 >>> list_a = [1,2,3,4,5] >>> list_a.append(6) >>> dict_a = {"a" : "b"} >>> dict_a.update({"c" : "d"}) >>> dict_a {'c': 'd', 'a': 'b'} >>> list_a.sort() >>> list_a [1, 2, 3, 4, 5, 6] 

4. سلاسل المتدرب


في بعض الحالات ، يحاول Python إعادة استخدام الأشياء غير القابلة للتغيير الحالية. سلسلة التدرب هي واحدة من هذه الحالة.

 >>> a = "gmail" >>> b = "gmail" >>> a is b True 

هنا حاولنا إنشاء كائنين مختلفين - الأوتار. لكن عندما اختبرناهم من أجل التكافؤ ، اتضح أنهم تزامنوا تمامًا. هذا لأن بيثون لم ينشئ كائنًا آخر ب ، ولكنه جعل النقطة ب تشير إلى القيمة الأولى لـ "gmail".
جميع سلاسل طول 1 يتم interned. لن يتم اختبار الخطوط التي تحتوي على شيء آخر غير أحرف ASCII والأرقام والشرطات السفلية.
دعونا التحقق من ذلك.

 >>> a = "@gmail" >>> b = "@gmail" >>> a is b False 

تذكر أيضًا أن == يختلف عن المشغل. يتحقق العامل == ما إذا كانت القيم متكافئة أم لا ، بينما يتحقق المشغل من أن كلا المتغيرين يشيران إلى نفس الكائن.

 >>> a = "@gmail" >>> b = "@gmail" >>> a is b False >>> a == b True 

لذلك ضع ذلك في اعتبارك عند استخدام سلاسل غير قابلة للتغيير أو = = وهو عامل.

5. يتم تقييم الوسائط الافتراضية مرة واحدة.


النظر في مثال:

 def func(a, lst=[]): lst.append(a) return lst print(func(1)) print(func(2)) 

ما رأيك سيتم عرضه بعد طبعتين؟

لنقم بتشغيل الكود.

 >>> def func(a, lst=[]): ... lst.append(a) ... return lst ... >>> print(func(1)) [1] >>> print(func(2)) [1, 2] 

لماذا يتم إخراج الحالة الثانية [1 ، 2]؟ لا ينبغي أن يكون مجرد [2]؟

لذلك ، فإن الخلاصة هي أن الوسائط الافتراضية يتم تقييمها مرة واحدة فقط ، وفي المرة الأولى التي تم فيها استدعاء الدالة ، func (1) ، تم تقييم القائمة وأدركت أنها فارغة. هذا يعني أنه يمكنك إضافة 1. ولكن في المكالمة الثانية - func (2) - يوجد بالفعل عنصر واحد في القائمة ، لذلك [1 ، 2] يتم عرضها.

المكافأة: لا حاجة لخلط المساحات وعلامات التبويب. فقط لا.

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


All Articles