بيثون مثيرة للاهتمام ومفيدة

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

كما هو الحال في العديد من اللغات في python ، فإن 1 تعادل True ، و 0 هي False ، أي

1 == True. 

يبدو ، وما هو الخطأ في ذلك؟ ومع ذلك ، فإن هذا له بعض الآثار الجانبية المرتبطة بحقيقة أن نفس الكائنات يجب أن يكون لها نفس التجزئة ، لذلك لن تتمكن من حشر المفتاح 1 و True في قاموس واحد.

  >>> a = {1: "one", 0: "zero", True: "true", False: "false"} # -> {1: 'true', 0: 'false'} 

كما يسمح بالعمليات التالية:

  >>> print(2 * False + True) # -> 1 

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

  >>> {"one": 1, "two": 2, "three": 3} == dict(one=1, two=2, three=3) # -> True 

بالإضافة إلى ذلك ، لا يتم إنشاء القواميس فقط ، ولكن أيضًا مجموعات (مجموعة) باستخدام أقواس متعرجة.

  >>> a = {1, 2, 3} 

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

 a = {1, 2, 3} b = {0, 2, 4} print(a & b) # -> {2} print(a | b) # -> {0, 1, 2, 3, 4} print(a ^ b) # -> {0, 1, 3, 4} print(a - b) # -> {1, 3},    #     

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

www.python.org/downloads/release/python-370
mail.python.org/pipermail/python-dev/2017- ديسمبر 151283.html

 d = dict(zero='Cero', one='Uno', two='Dos', three='Tres', four='Cuatro', five='Cinco', six='Seis', seven='Siete', eight='Ocho', night='Nueve') for index, (key, value) in enumerate(d.items()): print(f"{index} is {key} in England and {value} in Spain") 

انتبه إلى خط الإخراج ، فهو يبدأ بالبادئة f - هذا هو نوع خاص من الخطوط المقدمة في python 3.6 .

هناك ثلاثة أنواع من السلاسل في اللغة: عادية ، يشار إليها بعلامات اقتباس بدون بادئات ، خام \ غير معالج (خام) ، حيث لا تتم معالجة الأحرف الخاصة ، مثل \ n وإدراجها كنص وخطوط f نفسها.

تم إنشاؤها لتبسيط الإخراج ، ويدعم الثعبان عددًا كبيرًا من طرق الإخراج:

 print("result" + str(2)) #   , python   #      #  ,     print("result", 2) # print      , #        , #        , #      print("result %d" % 2) # %-,      C. print("result %d %.2f" % (2, 2)) # https://docs.python.org/3.4/library/string.html#formatspec print("result %(name)s" % {"name": 2}) #      print("{}".format(2)) #      format() #       print("{0} {1} {0}".format(1, 2)) #          #     #     #        ,    print("{} {}".format(2)) # -> IndexError: tuple index out of range print("{0} {0}".format(2, 3)) # -> 2 2       #     from math import pi #         print("{:.2f}".format(pi)) # -> 3.14 from string import Template #      s = Template("result $res") #       print(s.substitute(res = [3, 4])) 

وأضاف الآن المزيد وخطوط-. تتوفر فيها أي متغيرات من النطاق ، يمكنك استدعاء الوظائف ، والحصول على العناصر حسب المفتاح ، بالإضافة إلى أنها تدعم سلاسل التنسيق.

 from math import pi result = 4 name = "user" print(f"{name:84s} pi= {pi:.2f}, result={result}, {name[2]}") # -> user pi= 3.14, result=4, e from datetime import datetime print(f"{datetime.now():%Y:%m-%d}") 

إنها أسرع من جميع طرق الإخراج الأخرى ، لذلك إذا كان python3.6 متاحًا لك ، فمن المستحسن استخدامه.

واحدة من أروع قطع الثعبان - لا يتم تعبئة الأشياء والأوليات وتفكيكها ، ولكن المعلمات والمجموعات.

 def func(*argv, **kwargs) 

ومع ذلك ، هناك عيب معماري واحد في التنفيذ:

  • argv - مجموعة ، لا يمكن تغيير قيمها ، لا يمكن إضافة القيم أو حذفها
  • kwargs هو قاموس قابل للتغيير ، لذا لا يمكن التخزين المؤقت

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

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

ناقشوا إنشاء نوع frozendict ، لكنهم لم يضيفوه بعد (على الرغم من أنه يحتوي بالفعل على تطبيق واحد على الأقل - مثل kwargs). لقاموس غير قابل للتغيير ، يجب أن ينتفخ المسمى tuple. وأيضًا للملاحظات والطبقات المتواضعة.

من الذي كتب في سنوات دراسته / دراسته دورات لعرض قيم الصفيف وكان غاضبًا من الفاصلة في النهاية ، في كل مرة قرر أن يسجل أو يعيد الكتابة ليكون جميلًا ، وفي الدورة 2-3 فقط تعلم عن طريقة الانضمام؟ أم أنا الوحيد؟

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

 a = list(range(5)) print(" ".join(a)) # -> TypeError: sequence item 0: expected str instance, int found print(" ".join(str(i) for i in a)) # -> 0 1 2 3 4 print(*a) # -> 0 1 2 3 4 

نظرًا لأن السلاسل عبارة عن مجموعات ، فيمكن أيضًا "ربطها".

 print('-'.join("hello")) # -> hello 

خذ بعين الاعتبار السطر من المثال السابق.

 print(" ".join(str(i) for i in a)) # -> 0 1 2 3 4 

يتم تمرير تعبير المولد إلى دالة الصلة بدون أي أقواس ؛ يمكن حذف الأقواس لتبسيط قراءة التعليمات البرمجية. تهتم بايثون بالتعبير.

 print(sum(i**2 for i in range(10))) # -> 285 

بالإضافة إلى ذلك ، يمكن حذف الأقواس عند إنشاء الصفوف:

 article = "python", 2018, "LinearLeopard" #   theme, year, author = "python", 2018, "LinearLeopard"#   theme, year, _ = "python", 2018, "LinearLeopard" #     #    # ,  , #  -   , #    #  theme, _, _ = "python", 2018, "LinearLeopard" #    theme, *, author = "python", 2018, "LinearLeopard" #    # ,   #  , # ,  #   #   

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

 def sortwords(*wordlist, case_sensitive=False): 

يمكنك تمرير العديد من المعلمات كما تريد دون خوف من أن يُنظر إلى أحدها على أنه قيمة المعلمة case_sensitive.

من الممكن وهكذا.

 def func(first, second, *, kwonly): 


سنلقي نظرة فاحصة على كيفية اختلافها ببساطة عن اختلافات *.

 def func(first, second, *, kwonly=True): print(first, second, kwonly) def func2(first, second, *args, kwonly=True): print(first, second, *args, kwonly) func(1) #-> TypeError: func() missing 1 required positional argument: 'second' func(1, 2) #-> 1 2 True func(1, 2, False) #-> TypeError: func() takes 2 positional arguments but 3 were given #  *    ,  #        #   func(1, 2, kwonly=False) #-> 1 2 False func2(1, 2, False) #-> 1 2 False True # *args      # ,       #    (>2)  #  


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

 def add_to(elem, collection=[]): collection.append(elem) return collection a = ["a", "c"] print(add_to("b", a)) # -> ['a', 'c', 'b'] print(add_to("a")) # -> ['a'] print(add_to("b")) # -> ['a', 'b']   'a'? 

يتم تخزين القيم الافتراضية في حقل __الافتراضات__ ، يمكنك معرفة ما هو موجود في أي وقت.

 print(add_to.__defaults__) # -> (['a', 'b'],) 

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

يمكنك إصلاح هذا السلوك إذا جعلت القيمة الافتراضية نوعًا غير قابل للتغيير ، وأنشأت قائمة في نص الوظيفة:

 def add_to(elem, collection=None): collection = collection or [] collection.append(elem) return collection 

انتبه للأمر

 collection = collection or [] 

هذا تناظري أقصر (وأقل وضوحًا ، وإن لم يكن للجميع)

 collection = collection if collection else [] 


رابط للجزء التالي

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


All Articles