8 حيل بايثون يستخدمها المبرمجون ذوو الخبرة

صورة



إليك ثمانية حيل رشيقة لبيثون أنا متأكد أنك لم ترها بعد. قم بتطبيق هذه الحيل في كود Python لجعلها أكثر إيجازًا وفعالية!



1. فرز الأشياء بعدة مفاتيح



افترض أننا نريد فرز قائمة القواميس التالية:



people = [
{ 'name': 'John', "age": 64 },
{ 'name': 'Janet', "age": 34 },
{ 'name': 'Ed', "age": 24 },
{ 'name': 'Sara', "age": 64 },
{ 'name': 'John', "age": 32 },
{ 'name': 'Jane', "age": 34 },
{ 'name': 'John', "age": 99 },
]


لكننا لا نريد فقط تصنيفها حسب الاسم أو العمر ، بل نريد تصنيفها حسب الحقلين. في SQL ، سيكون هذا استعلامًا مثل هذا:



SELECT * FROM people ORDER by name, age


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



لتحقيق التصنيف حسب الاسم والعمر ، يمكننا القيام بذلك:



import operator
people.sort(key=operator.itemgetter('age'))
people.sort(key=operator.itemgetter('name'))


لاحظ كيف قمت بتغيير الترتيب. أولاً نقوم بالفرز حسب العمر ، ثم بالاسم. باستخدام operator.itemgetter()نحصل على حقول العمر والاسم من كل قاموس في القائمة.



هذا يعطينا النتيجة التي أردناها:



[
 {'name': 'Ed',   'age': 24},
 {'name': 'Jane', 'age': 34},
 {'name': 'Janet','age': 34},
 {'name': 'John', 'age': 32},
 {'name': 'John', 'age': 64},
 {'name': 'John', 'age': 99},
 {'name': 'Sara', 'age': 64}
]


يتم فرز الأسماء أولاً ، ويتم فرز العمر إذا تطابق الاسم. وهكذا ، يتم تجميع جميع جونز حسب العمر.



مصدر الإلهام - سؤال من StackOverflow .



2. إدراج القائمة (List Generator)



إدراج القائمة يمكن أن يحل محل الحلقات القبيحة المستخدمة لتعبئة القائمة. البنية الأساسية لإدراج القائمة:



[ expression for item in list if conditional ]


مثال بسيط للغاية لملء قائمة بتسلسل أرقام:



mylist = [i for i in range(10)]
print(mylist)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


وبما أنه يمكنك استخدام تعبير ما ، يمكنك إجراء بعض الحسابات أيضًا:



squares = [x**2 for x in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


أو حتى استدعاء وظيفة خارجية:



def some_function(a):
    return (a + 5) / 2
    
my_formula = [some_function(i) for i in range(10)]
print(my_formula)
# [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0]


وأخيرًا ، يمكنك استخدام "إذا" لتصفية القائمة. في هذه الحالة ، نحفظ فقط تلك القيم المقسمة على 2:



filtered = [i for i in range(20) if i%2==0]
print(filtered)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


3. تحقق من استخدام ذاكرة الأشياء الخاصة بك



باستخدام sys.getsizeof () يمكنك التحقق من استخدام الذاكرة لكائن ما:



import sys

mylist = range(0, 10000)
print(sys.getsizeof(mylist))
# 48


نجاح باهر ... انتظر ... لماذا هذه القائمة الضخمة 48 بايت فقط؟

وذلك لأن دالة النطاق تُرجع فئة تتصرف فقط مثل القائمة. النطاق أقل من الذاكرة الفعلية بكثير من قائمة الأرقام.

يمكنك أن ترى بنفسك باستخدام تضمين القائمة لإنشاء قائمة حقيقية بالأرقام من نفس النطاق:



import sys

myreallist = [x for x in range(0, 10000)]
print(sys.getsizeof(myreallist))
# 87632


لذلك ، من خلال اللعب مع sys.getsizeof()، يمكنك معرفة المزيد عن Python واستخدام الذاكرة الخاصة بك.



4. فئات البيانات



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



  • تتطلب فئة البيانات الحد الأدنى من التعليمات البرمجية
  • يمكنك مقارنة فئات البيانات لأن هناك __eq__
  • يمكنك بسهولة الاستدلال على فئة البيانات لتصحيح الأخطاء لأن هناك __repr__
  • تتطلب فئات البيانات تلميحًا من النوع ، مما يقلل من فرصة حدوث أخطاء


فيما يلي مثال لفئة بيانات قيد التشغيل:



from dataclasses import dataclass

@dataclass
class Card:
    rank: str
    suit: str
    
card = Card("Q", "hearts")

print(card == card)
# True

print(card.rank)
# 'Q'

print(card)
Card(rank='Q', suit='hearts')


يمكن العثور على دليل مفصل هنا .



5. حزمة attrs



يمكنك استخدام attrs بدلاً من فئات البيانات . هناك سببان للاختيار attrs:



  • أنت تستخدم إصدار Python أقدم من 3.7
  • تريد المزيد من الميزات


attrsتدعم الحزمة جميع الإصدارات الرئيسية من Python ، بما في ذلك CPython 2.7 و PyPy. بعض السمات الإضافية المقدمة attrsمقارنة بفئات البيانات العادية هي المصادقات والمحولات. دعنا نلقي نظرة على بعض الأمثلة البرمجية:



@attrs
class Person(object):
    name = attrib(default='John')
    surname = attrib(default='Doe')
    age = attrib(init=False)
    
p = Person()
print(p)
p = Person('Bill', 'Gates')
p.age = 60
print(p)

# Output: 
#   Person(name='John', surname='Doe', age=NOTHING)
#   Person(name='Bill', surname='Gates', age=60)


attrsعمل المؤلفون بالفعل في PEP الذي قدم فئات البيانات. يتم تخزين فئات البيانات عن قصد بشكل أسهل (أسهل في الفهم) ، بينما توفر Attrs مجموعة كاملة من الوظائف التي قد تحتاج إليها!



يمكن العثور على المزيد من الأمثلة في صفحة أمثلة attrs .



6. الجمع بين القواميس (Python 3.5+)



منذ بايثون 3.5 ، من الأسهل الجمع بين القواميس:



dict1 = { 'a': 1, 'b': 2 }
dict2 = { 'b': 3, 'c': 4 }
merged = { **dict1, **dict2 }
print (merged)
# {'a': 1, 'b': 3, 'c': 4}


إذا كانت هناك مفاتيح متداخلة ، فسيتم استبدال المفاتيح من القاموس الأول.



في Python 3.9 ، يعد الجمع بين القواميس أنظف. يمكن إعادة كتابة الدمج أعلاه في Python 3.9 على النحو التالي:



merged = dict1 | dict2


7. ابحث عن المعنى الأكثر شيوعًا



للعثور على القيمة الأكثر شيوعًا في قائمة أو سطر:



test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]
print(max(set(test), key = test.count))
# 4


هل تفهم لماذا يعمل هذا؟ حاول اكتشاف ذلك بنفسك قبل قراءة المزيد.



لقد حاولت حتى ، أليس كذلك؟ سأخبرك على أي حال:



  • max()سيُرجع أكبر قيمة في القائمة. حجة keyيأخذ وظيفة حجة واحدة لتخصيص ترتيب، في هذه الحالة test.count. يتم تطبيق الوظيفة على كل عنصر من عناصر التكرار.
  • test.count- وظيفة قائمة مدمجة. يستغرق الأمر حجة وسيحسب عدد مرات حدوث تلك الحجة. وبالتالي ، فإنها test.count(1)ترجع 2 ، test.count(4)وترجع 4.
  • set(test) بإرجاع جميع القيم الفريدة من الاختبار ، لذلك {1 ، 2 ، 3 ، 4}


لذا ، في هذا السطر الوحيد من التعليمات البرمجية ، نقبل جميع القيم الفريدة للاختبار {1, 2, 3, 4}. بعد ذلك ، سيتم maxتطبيق دالة عليهم list.countوإرجاع القيمة القصوى.



ولا - لم أخترع هذه البطانة الواحدة.



تحديث: أشار عدد من المعلقين عن حق إلى أن هناك طريقة أكثر فعالية للقيام بذلك:



from collections import Counter
Counter(test).most_common(1)
# [4: 4]


8. إعادة قيم متعددة



يمكن أن تعرض الدالات في Python أكثر من متغير واحد بدون قاموس أو قائمة أو فئة. يعمل مثل هذا:



def get_user(id):
    # fetch user from database
    # ....
    return name, birthdate

name, birthdate = get_user(4)


هذا جيد لعدد محدود من قيم الإرجاع. ولكن يجب وضع أي شيء يزيد عن 3 قيم في فئة (البيانات).



صورة



تعرف على تفاصيل كيفية الحصول على مهنة رفيعة المستوى من الصفر أو المستوى الأعلى في المهارات والراتب من خلال الحصول على دورات SkillFactory المدفوعة عبر الإنترنت:











All Articles