مثيرة للاهتمام وفائدة الثعبان. الجزء 2

في المقالة السابقة ، درسنا عدة نقاط مثيرة للاهتمام من لغة الثعبان ، بالطبع ، لا تقتصر على مقال واحد ، لذلك سنستمر.

فحص أحد التعليقات الكود التالي:

SEX = 'Female', 'Male' sex = SEX[True] # -> Male sex = SEX[False] # -> Female 

وهو يعمل لأن نوع البيانات المنطقية يعادل 0 و 1 ، علاوة على ذلك ، في البداية لم يكن هناك نوع خاص وتم استخدام القيم 0 و 1. وعندما تم إدخاله ، قررنا أن نرث من الكل.

 print(int.__subclasses__()) # -> [<class 'bool'>] 

ولكن بالعودة إلى الحصول على قيم القائمة ، فلنفترض أن لدينا البيانات التالية:

 books = [["Sherlock Holmes", "Arthur Conan Doyle", 1986, True, 12.51], ["The Lost World", "Arthur Conan Doyle", 2015, False, 5.95], ["The Art of Computer Programming", "Donald E. Knuth ", 2017, True, 190.54] ] 

بالطبع ، إن الإشارة إلى القيم بواسطة المؤشرات المشفرة ليست طريقنا. يمكنك إنشاء ثابت ، على سبيل المثال AUTHOR وتحديده ، ولكن يمكنك الذهاب إلى أبعد من ذلك:

 TITLE_AUTHOR = slice(0, 2) PRICE_IN_STOCK = slice(3, 5) print(books[0][TITLE_AUTHOR]) print([book for book in books if book[PRICE_IN_STOCK] > [True, 10.0]]) 

يمكننا إنشاء كائن شريحة والإشارة إليه في أي الفهارس الموجودة في الحقول ذات الأهمية. يمكننا أن نكون شجعان بما يكفي لكتابة شيء مشابه للسطر الأخير في هذه الكتلة ، والذي يعرض الكتب المتاحة في المستودع وأكثر تكلفة من 10 أي شيء. ستعمل هذه الشفرة ، نظرًا لأن المقارنة بين القوائم والصفوف تحدث بشكل معجمي: أولاً تتم مقارنة العناصر الأولى ، ثم الثاني وهكذا ، أي أن أي كائن يكون حقل "in_stock" الخاص به خاطئًا سيكون أصغر من القائمة [True، 10.0] ، حيث صحيح> خطأ.

ملاحظة: بالطبع ، لا ينبغي استخدام هذا الرمز في المشاريع ، ولكن من الأفضل أن تقتصر فقط على الحصول على بعض القيم للشريحة ، فمن الأفضل إجراء التحديدات في قاعدة البيانات ، إما في Pandas أو كطريقة لفئة الكتاب. يمكنك استخدام المسماةtuple وكتابة وحدة صغيرة لوضع الأساليب مع تحديدات مماثلة.

لقد نظرنا بالفعل في الحجج التي يمكن تمريرها إلى الوظيفة فقط عن طريق المفتاح. في الآونة الأخيرة ، أثناء دراسة وثائق وظيفة bool ، وجدت منخفضًا:
تم التغيير في الإصدار 3.7: x الآن معلمة موضعية فقط.
الآن PEP 570 قيد التطوير ، مما سيفتح إمكانية تعيين هذه المعلمات ، يمكن أن يكون هذا مفيدًا عندما لا يهم اسم المعلمة ، مثل bool () ، pow () ، إلخ.

تبدو صيغة المسودة كما يلي:

 def name(positional_only_parameters, /, positional_or_keyword_parameters, *, keyword_only_parameters): 

العودة إلى وظيفة bool ، التي تعمل تمامًا مثل التحقق من الظروف والتكرار عند تنفيذ التعليمات البرمجية

 if obj: #  while obj: 

يقوم بايثون بإجراء مثير للاهتمام إلى حد ما لإخراج قيمة منطقية:

  1. إذا قام الكائن بتطبيق طريقة __bool __ () ، فسيتم إرجاع نتيجة استدعاء هذه الطريقة
  2. خلاف ذلك ، يتم التحقق مما إذا تم تنفيذ طريقة __len __ () ، إذا كان الأمر كذلك ، ثم يتم التحقق من أنها تعود ، إذا كان 0 ، فستكون النتيجة خطأ.
  3. إذا لم يتم تنفيذ أي من الطريقتين ، فسيتم إرجاع True.

 class A: pass a = A() print(bool(a)) # -> True 

تطبق الأعداد الصحيحة طريقة __bool__ ، ولا تطبقها المجموعات القياسية ، ولكنها تطبق طريقة __len__:

 print(dir(int)) # -> ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', ... print(dir(list)) # -> ['__add__', '__class__', '__contains__', ... 

في تعليق آخر ، تم إعطاء السلوك "غير القياسي" لسمات الصف:

 class Example: arr=[] def __init__(self): pass a = Example() b = Example() a.arr.append(1) print(a.arr) # -> [1] print(b.arr) # -> [1] print(Example.arr) # -> [1] 

من المهم جدًا التمييز بين سمات الفئة والكائن ؛ يتم إنشاء سمات الكائن ، بشكل مفاجئ ، من الكائن.
من المهم أن نفهم أن أي مجالات وأساليب معلن عنها في جسم الفصل تنتمي إلى الفصل. لإنشاء سمة لكائن ، تحتاج إلى تعيينه للكائن ، في أسلوب الفئة من خلال الذات أو في نص البرنامج ، من خلال متغير الكائن.

إذا كنت مرتبكًا ، فلنقم بتحليل الرمز السابق ، يتم إنشاء مثيلين من الفئة فيه ، وبعد ذلك تتم إضافة 1 إلى حقل arr من خلال أحد الكائنات. ولكن لا يوجد مثل هذه السمة في الكائن ، المُنشئ فارغ ، لذلك يبحث python عن هذه السمة في الفصل ويجدها ، ومع ذلك يتم مشاركتها من قبل جميع مثيلات الفئة. يمكنك التحقق من أن هذه هي سمة الفئة في السطر الأخير ، لأن الوصول إلى الفئة باسم هذه السمة لم يولد أي خطأ.

عند تعلم لغة جديدة ، من المهم أن نفهم أن كل لغة لها فلسفتها الخاصة ، ولا يجب أن تحتوي جميع اللغات على الكلمة الأساسية الثابتة. في بعض الأحيان يتم توفير آلية مماثلة بواسطة آليات أخرى.

بشكل أوضح ، فإن فكرة أن الثعبان ليس جافا توضح أن إضافة الحقول في الأشياء والفئات يتم من خلال المهمة المعتادة:

 def make_title(self): if self.title == 'Mister': return 'Mr. ' + self.surname class Person: pass john = Person() john.title = 'Mister' john.name = 'John' john.surname = 'Peterson' john.age = 33 Person.make_title = make_title print(john.make_title()) 

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

على سبيل المثال ، من السهل جدًا إنشاء فصل يقوم بتخزين الارتباطات لكافة حالاته:

 class RememberAll(): instances = [] def __init__(self): self.instances.append(self) a = RememberAll() b = RememberAll() print(RememberAll.instances) #-> [<__main__.RememberAll object at 0x7faa4a5ab7b8>, <__main__.RememberAll object at 0x7faa4a523c88>] 

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

حسنًا ، بما أننا تطرقنا إلى الفيزياء ، أريد أن أذكر عامل @. نعم ، هناك واحد . تم تقديمه لضرب المصفوفة ، وهو الأكثر تسلية ، ولكن يبدو أنه لم يتم تنفيذه لأي من أنواع البيانات القياسية ، أي أنه تم تقديمه في الأصل فقط لمكتبات الطرف الثالث. ولكن لا شيء يمنعك من إضافة دعمه لأنواع البيانات الخاصة بك عن طريق تطبيق الأساليب __matmul__ ، __rmatmul__ ، __imatmul__

 class Person: def __init__(self, name): self.name = name def __matmul__(self, msg): return "@" + self.name + " " + msg john = Person("John") print(john @ "hello") # -> @John hello 

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


All Articles