بيثون 3 ميزات يستحق استخدام

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



جميع الأمثلة في هذه المقالة مكتوبة باستخدام Python 3.7. يحتوي وصف كل ميزة على معلومات حول الحد الأدنى من إصدار Python اللازم لاستخدامه.

سلاسل التنسيق (3.6+)


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

 user = "Jane Doe" action = "buy" log_message = 'User {} has logged in and did an action {}.'.format( user, action ) print(log_message) # User Jane Doe has logged in and did an action buy. 

يدعم Python 3 ، إلى جانب طريقة format ، سلاسل التنسيق (سلاسل f ، سلاسل f). إنها أداة مرنة لتنفيذ العديد من عمليات التلاعب بالسلسلة. إليك ما يبدو عليه المثال السابق ، معاد كتابته باستخدام سلاسل التنسيق:

 user = "Jane Doe" action = "buy" log_message = f'User {user} has logged in and did an action {action}.' print(log_message) # User Jane Doe has logged in and did an action buy. 

وحدة Pathlib (3.4+)


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

 from pathlib import Path root = Path('post_sub_folder') print(root) # post_sub_folder path = root / 'happy_user' #    print(path.resolve()) # /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user 

كتابة التعليقات التوضيحية (3.5+)


أيهما أفضل - الكتابة الساكنة أو الديناميكية؟ ربما يكون لدى كل مبرمج تقريبًا إجابته الخاصة على هذا السؤال الصعب. أترك الأمر للقارئ كيف يصفون برامجهم بالضبط. لكنني أعتقد أنه من الجيد أن يعلم الجميع على الأقل أن Python 3 يدعم التعليقات التوضيحية على الكتابة .

 def sentence_has_animal(sentence: str) -> bool: return "animal" in sentence sentence_has_animal("Donald had a farm without animals") # True 

التحويلات (3.4+)


يدعم Python 3 ، بفضل فئة Enum ، آلية بسيطة للعمل مع التعدادات . تعد التعدادات ملائمة لتخزين قوائم الثوابت. الثوابت ، خلاف ذلك ، مبعثرة بشكل عشوائي في الكود.

 from enum import Enum, auto class Monster(Enum):   ZOMBIE = auto()   WARRIOR = auto()   BEAR = auto()  print(Monster.ZOMBIE) # Monster.ZOMBIE 

من وثائق Python 3 ، يمكنك معرفة أن التعداد عبارة عن مجموعة من الأسماء الرمزية (الأعضاء) مرتبطة بقيم فريدة وغير قابلة للتغيير. يمكن مقارنة أعضاء قائمة واحدة للهوية. يمكن تجاوز التعدادات.

 for monster in Monster:   print(monster) # Monster.ZOMBIE # Monster.WARRIOR # Monster.BEAR 

ذاكرة التخزين المؤقت المدمجة LRU (3.2+)


في الوقت الحاضر ، يتم استخدام آليات التخزين المؤقت في جميع أنظمة البرمجيات والأجهزة تقريبًا. يعمل Python 3 على تبسيط عملية التخزين المؤقت إلى حد كبير باستخدام أداة lru_cache decorator ، والتي تنفذ خوارزمية التخزين المؤقت LRU ( الأقل استخدامًا في الآونة الأخيرة ).

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

 import time def fib(number: int) -> int:   if number == 0: return 0   if number == 1: return 1     return fib(number-1) + fib(number-2) start = time.time() fib(40) print(f'Duration: {time.time() - start}s') # Duration: 30.684099674224854s 

الآن نستخدم lru_cache لتحسين هذه الوظيفة (تسمى تقنية التحسين هذه المذكرة ). نتيجة لذلك ، يتم الآن قياس وقت تنفيذ دالة تم قياسها مسبقًا بالثواني بالنانو ثانية.

 from functools import lru_cache @lru_cache(maxsize=512) def fib_memoization(number: int) -> int:   if number == 0: return 0   if number == 1: return 1     return fib_memoization(number-1) + fib_memoization(number-2) start = time.time() fib_memoization(40) print(f'Duration: {time.time() - start}s') # Duration: 6.866455078125e-05s 

تفريغ الكائنات القابلة للتكرار (3.0+)


عند تفريغ الكائنات القابلة للتكرار ، يمكنك استخدام المتغيرات التي تسبق أسماؤها علامة نجمية. كل ما لا يلائم المتغيرات الأخرى يحصل على مثل هذه المتغيرات. لذلك ، في المثال التالي ، تندرج القيمتان الأولى والأخيرة من القائمة المشكلة بواسطة الأمر range(5) في head المتغيرات tail . كل ما بين القيمة الأولى والأخيرة يدخل في متغير body .

 head, *body, tail = range(5) print(head, body, tail) # 0 [1, 2, 3] 4 py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split() print(py) print(filename) print(cmds) # python3.7 # script.py # ['-n', '5', '-l', '15'] first, _, third, *_ = range(10) print(first, third) # 0 2 

فئات البيانات (3.7+)


قدم بيثون 3 فئات البيانات . أنها تعطي للمبرمج الكثير من حرية العمل. يمكن استخدامها لتقليل مقدار رمز الغلاية. الحقيقة هي أن مصمم dataclass تلقائيًا بإنشاء طرق خاصة ، مثل __init__() و __repr__() . في النص الرسمي للاقتراح المقابل ، يتم وصفها على أنها "tuples المسماة قابلة للتغيير مع القيم الافتراضية." فيما يلي مثال على إنشاء فئة دون استخدام مصمم dataclass :

 class Armor:     def __init__(self, armor: float, description: str, level: int = 1):       self.armor = armor       self.level = level       self.description = description                  def power(self) -> float:       return self.armor * self.level  armor = Armor(5.2, "Common armor.", 2) armor.power() # 10.4 print(armor) # <__main__.Armor object at 0x7fc4800e2cf8> 

هنا هو نفسه ، ولكن مكتوب بالفعل باستخدام dataclass :

 from dataclasses import dataclass @dataclass class Armor:   armor: float   description: str   level: int = 1     def power(self) -> float:       return self.armor * self.level  armor = Armor(5.2, "Common armor.", 2) armor.power() # 10.4 print(armor) # Armor(armor=5.2, description='Common armor.', level=2) 

دعم مجلد الحزمة بدون ملف __init__.py (3.3+)


تتمثل إحدى طرق تكوين رمز Python في استخدام الحزم (يتم وضع الحزم في مجلدات تحتوي على ملف __init__.py ). فيما يلي مثال من الوثائق الرسمية:

 sound/                                 __init__.py                 sound     formats/                                   __init__.py             wavread.py             wavwrite.py             aiffread.py             aiffwrite.py             auread.py             auwrite.py             ...     effects/                                  __init__.py             echo.py             surround.py             reverse.py             ...     filters/                                 __init__.py             equalizer.py             vocoder.py             karaoke.py             ... 

عند استخدام Python 2 ، يجب أن يحتوي كل مجلد من المجلدات المذكورة في المثال على ملف __init__.py . بفضل هذا الملف ، يُنظر إلى المجلد كحزمة بيثون. في Python 3 ، مع ظهور ميزة حزم مساحة الاسم الضمنية ، لم تعد هناك حاجة لمثل هذه المجلدات.

 sound/                                 __init__.py                 sound     formats/                                   wavread.py             wavwrite.py             aiffread.py             aiffwrite.py             auread.py             auwrite.py             ...     effects/                                  echo.py             surround.py             reverse.py             ...     filters/                                 equalizer.py             vocoder.py             karaoke.py             ... 

تجدر الإشارة إلى أنه في الواقع ، كل شيء ليس بهذه البساطة. وهي ، وفقًا لهذه المواصفات الرسمية ، لا يزال ملف __init__.py ضروريًا للحزم العادية. إذا قمت بإزالته من المجلد ، فستتحول الحزمة إلى ما يسمى حزمة مساحة الاسم ، والتي تنطبق عليها قيود إضافية.

النتائج


لا يتم تغطية جميع ميزات Python 3 المثيرة للاهتمام في هذه المقالة ، لكننا نأمل أن تجد شيئًا مفيدًا هنا. يمكن العثور على نموذج التعليمة البرمجية في هذا المستودع.

أعزائي القراء! ما هي ميزات Python 3 التي تضيفها إلى القائمة هنا؟

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


All Articles