else - not in python




لماذا لا يوجد++ و-المشغلين في بيثون؟ (12)

وضوح!

بيثون هو الكثير عن الوضوح وليس من المرجح أن يخمن مبرمج بشكل صحيح معنى --a ما لم يتعلم لغة لديها هذا البناء.

كما أن Python تهتم أيضًا بتجنب التركيبات التي تدعو الأخطاء ، ومن المعروف أن مشغلي ++ هم مصادر غنية بالعيوب. هذان السببان هما كفاية لعدم وجود هؤلاء المشغلين في بيثون.

يستند القرار الذي تستخدمه بايثون إلى استخدام المسافات البادئة لتمييز الكتل بدلاً من الوسائل التركيبية مثل شكل ما من أشكال قوس البداية / النهاية أو وضع علامة إلزامية على نفس الاعتبارات.

للتوضيح ، ألقِ نظرة على المناقشة حول إدخال عامل شرطي (في C: cond ? resultif : resultelse : cond ? resultif : resultelse ) إلى Python في عام 2005. اقرأ على الأقل الرسالة الأولى ورسالة قرار تلك discussion (التي كان لها العديد من السلائف على نفس الموضوع سابقا).

التوافه: PEP ذكرت في كثير من الأحيان في هذا هو "بيثون تمديد الاقتراح" PEP 308 . LC تعني الفهم بالقائمة ، وتعني GE التعبير عن المولدات (ولا تقلق إذا كان هؤلاء يربكونك ، ولا يمثلون أيًا من البقع المعقدة في بايثون).

لماذا لا يوجد ++ و -- المشغلين في بيثون؟


++ المشغل ليس بالضبط + المشغل. في الحقيقة ، النتيجة هي نفسها ولكن الاستخدامات لها بعض الاختلاف. على سبيل المثال ، يمكنك استخدام عامل التشغيل ++ في الشرطي الثلاثي ، للحلقة ، إلخ ، ولكن لا يمكن استخدام + =. في الأسفل ، نشعر بالحاجة ++ و - لهذا السبب.


أنا جديد جداً على الثعبان ولكني أظن أن السبب هو التشديد بين الأشياء المتغيرة وغير القابلة للتغيير في اللغة. الآن ، أعلم أن x ++ يمكن تفسيرها بسهولة على أنها x = x + 1 ، ولكنها تبدو وكأنها تزداد في مكان ما كائن غير قابل للتغيير.

فقط تخميني / شعور / حدس.


أولاً ، تتأثر بايثون بشكل غير مباشر بـ C ؛ تتأثر بشكل كبير من قبل ABC ، والتي يبدو أنها لا تملك هذه المشغلين ، لذلك لا ينبغي أن يكون أي مفاجأة كبيرة لعدم العثور عليها في بايثون أيضا.

ثانيًا ، كما قال الآخرون ، يتم دعم الزيادة والإنقاص بواسطة += و -= بالفعل.

ثالثًا ، يشتمل الدعم الكامل ++ و -- المشغلين عادةً على دعم إصدارات كل من البادئة واللاحقة. في C و C ++ ، يمكن أن يؤدي هذا إلى جميع أنواع البنى "الجميلة" التي تبدو (بالنسبة لي) ضد روح البساطة والاستقامة المباشرة التي تتبناها بايثون.

على سبيل المثال ، بينما عبارة C while(*t++ = *s++); قد تبدو بسيطة وأنيقة لمبرمج من ذوي الخبرة ، لشخص تعلم ذلك ، هو شيء بسيط. رمي في مزيج من البادئة والزيادات وتعديلات postfix ، وحتى العديد من الايجابيات يجب أن تتوقف والتفكير قليلا.


تعتبر فئة عوامل التشغيل ++ عبارة عن تعبيرات ذات تأثيرات جانبية. هذا شيء لا يوجد بشكل عام في بايثون.

لنفس السبب ، لا يكون التعبير تعبيرًا في Python ، وبالتالي يمنع الشائعة if (a = f(...)) { /* using a here */ } لغة if (a = f(...)) { /* using a here */ } .

أخيرًا أشك في أن المشغل لا يتطابق تمامًا مع دلالات بيثون المرجعية. تذكر ، ليس لدى بايثون متغيرات (أو مؤشرات) مع الدلالات المعروفة من C / C ++.


ربما يكون السؤال الأفضل هو التساؤل عن سبب وجود هؤلاء المشغلين في C.C & R المكالمات الزائدة وإنقاص المشغلين 'غير عادي (القسم 2.8 صفحة 46). وتصفها المقدمة بأنها "أكثر إيجازًا وكفاءة في كثير من الأحيان". أظن أن حقيقة أن هذه العمليات تأتي دائما في التلاعب مؤشر لعبت أيضا دورا في مقدمتها. في بايثون ، ربما تقرر أنه من غير المنطقي محاولة تحسين الزيادات (في الحقيقة لقد أجريت للتو اختبارًا في C ، ويبدو أن التجميع الذي تم إنشاؤه بواسطة gcc يستخدم addl بدلاً من incl في كلتا الحالتين) ولا يوجد مؤشر الحسبة لذلك كان يمكن أن يكون مجرد طريقة واحدة للقيام بذلك ونعرف أن بيثون تكره ذلك.


كما فهمت ذلك حتى لا تعتقد أنه تم تغيير القيمة في الذاكرة. في c عند القيام x ++ قيمة x في تغييرات الذاكرة. ولكن في python جميع الأرقام غير قابلة للتغيير ، وبالتالي فإن العنوان الذي يشير إلى x لا يزال لديه x لا x + 1. عندما تكتب x ++ قد تعتقد أن تغيير x ما يحدث هو أن يتم تحويل x refrence إلى موقع في الذاكرة حيث يتم تخزين x + 1 أو إعادة إنشاء هذا الموقع إذا كانت غير موجودة.


لأن الأعداد الصحيحة في Python غير قابلة للتغيير (int + = فعليًا تُرجع كائنًا مختلفًا).

أيضا ، مع ++ / - تحتاج إلى القلق بشأن ما بعد الزيادة / الزيادة اللاحقة ، ويستغرق ضغطة واحدة فقط أكثر من كتابة x+=1 . وبعبارة أخرى ، فإنه يتجنب الارتباك المحتمل على حساب كسب قليل جدا.


لطالما افترضت أن الأمر يتعلق بهذا الخط من ذرة الثعبان:

يجب أن يكون هناك طريقة واحدة - ويفضل أن تكون واحدة فقط - واضحة للقيام بذلك.

x ++ و x + = 1 يفعلون نفس الشيء بالضبط ، لذا لا يوجد سبب لوجود كليهما.


لقد تم تصميمه بهذه الطريقة. تعتبر مشغلات الزيادة والإنقاص اختصارات لـ x = x + 1 . اعتمدت بيثون عادةً إستراتيجية تصميم تقلل من عدد الوسائل البديلة لتنفيذ العملية. المهمة المعززة هي أقرب شيء إلى مشغلي الزيادة / التناقص في بايثون ، ولم تتم إضافتها حتى بيثون 2.0.


ما أفهمه لماذا لا يكون python مشغل ++ هو التالي: عندما تكتب هذا في python a=b=c=1 ستحصل على ثلاثة متغيرات (تسميات) تشير إلى نفس الكائن (أي القيمة 1). يمكنك التحقق من ذلك باستخدام وظيفة id التي ستقوم بإرجاع عنوان ذاكرة كائن:

In [19]: id(a)
Out[19]: 34019256

In [20]: id(b)
Out[20]: 34019256

In [21]: id(c)
Out[21]: 34019256

تشير كل المتغيرات الثلاثة (التسميات) إلى نفس الكائن. الآن قم بزيادة متغير واطلع على كيفية تأثيره على عناوين الذاكرة:

In [22] a = a + 1

In [23]: id(a)
Out[23]: 34019232

In [24]: id(b)
Out[24]: 34019256

In [25]: id(c)
Out[25]: 34019256

يمكنك رؤية أن المتغير a يشير الآن إلى كائن آخر كمتغيرات b و c . نظرًا لأنك استخدمت a = a + 1 ، فستكون واضحة تمامًا. بمعنى آخر ، يمكنك تعيين كائن آخر تمامًا لتصنيفه. تخيل أن بإمكانك كتابة a++ فإنه يشير إلى أنك لم تخصص متغيرًا جديدًا ولكن قم بتكرار الزيادة القديمة. كل هذه الأشياء هي IMHO لتقليل الارتباك. للحصول على فهم أفضل ، انظر كيف تعمل متغيرات بيثون:

في Python ، لماذا يمكن أن تقوم إحدى الوظائف بتعديل بعض الحجج كما يراها المتصل ، ولكن ليس غيرها؟

هل كلمة بايثون Call-by-value أو call-by-reference؟ لا هذا ولا ذاك.

هل تمر بايثون بالقيمة ، أم بالرجوع إليها؟

هل تتحول بايثون كمرجع أو تمر بالقيمة؟

بايثون: كيف يمكنني تمرير متغير من خلال الإشارة؟

فهم متغيرات بايثون وإدارة الذاكرة

مضاهاة سلوك المرور بالقيمة في بيثون

بيثون وظائف استدعاء حسب المرجع

رمز مثل Pythonista: Python اصطلاحية


يمكنك استخدام

element = iter(data_list)
a = next(element)
b = next(element)
c = next(element)




operators