لقد قمت بالبرمجة في بيثون لعدة سنوات ، ومع ذلك ، أدركت مؤخرًا أن الكثير من الحيل المفيدة واللحظات المثيرة للاهتمام قد مرت بي ، ربما لست الوحيد ، لذلك قررت سردها هنا ، آمل أن تكون هذه الحيل مفيدة لشخص ما في العمل أو تجعلني أتعرف على بعضنا البعض مع هذه اللغة أقرب.
كما هو الحال في العديد من اللغات في python ، فإن 1 تعادل True ، و 0 هي False ، أي
1 == True.
يبدو ، وما هو الخطأ في ذلك؟ ومع ذلك ، فإن هذا له بعض الآثار الجانبية المرتبطة بحقيقة أن نفس الكائنات يجب أن يكون لها نفس التجزئة ، لذلك لن تتمكن من حشر المفتاح 1 و True في قاموس واحد.
>>> a = {1: "one", 0: "zero", True: "true", False: "false"}
كما يسمح بالعمليات التالية:
>>> print(2 * False + True)
في هذا المثال ، تم استخدام السلاسل كقيم قاموس ، ومع ذلك ، غالبًا ما أريد استخدامها كمفاتيح قاموس ، لقد كنت منزعجًا دائمًا من أنه عند إنشاء قاموس باستخدام الأقواس المتعرجة ، فأنت بحاجة إلى تحديد السلاسل في علامات الاقتباس ، وأود حذفها ، وهذا ممكن إذا قمت بإنشاء القاموس من خلال منشئ dict ().
>>> {"one": 1, "two": 2, "three": 3} == dict(one=1, two=2, three=3)
بالإضافة إلى ذلك ، لا يتم إنشاء القواميس فقط ، ولكن أيضًا مجموعات (مجموعة) باستخدام أقواس متعرجة.
>>> a = {1, 2, 3}
لدمج المجموعتين ، لسبب ما ، أريد استخدام عامل التشغيل + ، ربما بسبب الطريقة المتسلسلة للأوتار. ومع ذلك ، لا يدعم بايثون هذا العامل للمجموعات. ولكن بالطبع ، هذا لا يعني أنه يجب علينا دائمًا استخدام الوظائف ، فقد تعامل المبدعون مع هذه المشكلة بشكل أكثر منهجية وأضافوا دعمًا للعمليات الأساسية على المجموعات (وليس فقط النقابات) إلى اللغة و
"علقها" على عوامل التشغيل المنطقية .
a = {1, 2, 3} b = {0, 2, 4} print(a & b)
استمرار المحادثة حول القواميس ، بدءًا من الإصدار 3.7 ، تضمن مواصفات اللغة أن القواميس تحافظ على ترتيب إدخال العناصر ، لم تعد هناك حاجة إلى OrderedDict.
www.python.org/downloads/release/python-370mail.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))
وأضاف الآن المزيد وخطوط-. تتوفر فيها أي متغيرات من النطاق ، يمكنك استدعاء الوظائف ، والحصول على العناصر حسب المفتاح ، بالإضافة إلى أنها تدعم سلاسل التنسيق.
from math import pi result = 4 name = "user" print(f"{name:84s} pi= {pi:.2f}, result={result}, {name[2]}")
إنها
أسرع من جميع طرق الإخراج الأخرى ، لذلك إذا كان python3.6 متاحًا لك ، فمن المستحسن استخدامه.
واحدة من أروع قطع الثعبان - لا يتم تعبئة الأشياء والأوليات وتفكيكها ، ولكن المعلمات والمجموعات.
def func(*argv, **kwargs)
ومع ذلك ، هناك عيب معماري واحد في التنفيذ:
- argv - مجموعة ، لا يمكن تغيير قيمها ، لا يمكن إضافة القيم أو حذفها
- kwargs هو قاموس قابل للتغيير ، لذا لا يمكن التخزين المؤقت
العيب ، بالطبع ، ليس كبيرًا ، ولكن لا يزال من المزعج أنه لا يمكنك نقل kwargs مباشرة إلى ذاكرة التخزين المؤقت المستندة إلى القاموس ، من ناحية أخرى ، إذا قمت بإضافة قائمة إلى مجموعة ، فلا يمكن إضافة مثل هذه المجموعة إلى القاموس أيضًا.
يتم إنشاء المجموعات أيضًا على أساس جدول التجزئة ، مما يعني أنه يجب تجزئة القيم ، بالإضافة إلى أن المجموعة نفسها هي نوع قابل للتغيير وغير مجزأ ، وهناك نوع خاص من frozenset - مجموعة ثابتة (لا تسألني عن سبب الحاجة إليها).
ناقشوا إنشاء نوع frozendict ، لكنهم لم يضيفوه بعد (على الرغم من أنه يحتوي بالفعل على تطبيق واحد على الأقل - مثل kwargs). لقاموس غير قابل للتغيير ، يجب أن
ينتفخ المسمى tuple. وأيضًا للملاحظات والطبقات المتواضعة.
من الذي كتب في سنوات دراسته / دراسته دورات لعرض قيم الصفيف وكان غاضبًا من الفاصلة في النهاية ، في كل مرة قرر أن يسجل أو يعيد الكتابة ليكون جميلًا ، وفي الدورة 2-3 فقط تعلم عن طريقة الانضمام؟ أم أنا الوحيد؟
واحدة من الميزات غير السارة لطريقة الربط للسلاسل هي أنها تعمل فقط مع عناصر السلسلة ، إذا كانت المجموعة تحتوي على واحدة غير سلسلة ، عليك استخدام تعبير مولد ، والذي يبدو حلًا معقدًا لمثل هذه المهمة البسيطة ، ومع ذلك ، هناك طريقة لتبسيط إخراج قيم القائمة (بدون أقواس) .
a = list(range(5)) print(" ".join(a))
نظرًا لأن السلاسل عبارة عن مجموعات ، فيمكن أيضًا "ربطها".
print('-'.join("hello"))
خذ بعين الاعتبار السطر من المثال السابق.
print(" ".join(str(i) for i in a))
يتم تمرير تعبير المولد إلى دالة الصلة بدون أي أقواس ؛ يمكن حذف الأقواس لتبسيط قراءة التعليمات البرمجية. تهتم بايثون بالتعبير.
print(sum(i**2 for i in range(10)))
بالإضافة إلى ذلك ، يمكن حذف الأقواس عند إنشاء الصفوف:
article = "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)
ترتبط إحدى الميزات المثيرة للاهتمام بالمعلمات الافتراضية: يتم حسابها في مرحلة تجميع الوحدة النمطية إلى رمز ثانوي ، لذلك من الأفضل عدم استخدام أنواع قابلة للتغيير هناك. نعلن عن وظيفة تضيف عنصرًا إلى نهاية القائمة ، إذا تم حذف الوسيطة الثانية ، فإن الدالة ترجع قائمة جديدة تحتوي فقط على هذا العنصر.
def add_to(elem, collection=[]): collection.append(elem) return collection a = ["a", "c"] print(add_to("b", a))
يتم تخزين القيم الافتراضية في حقل __الافتراضات__ ، يمكنك معرفة ما هو موجود في أي وقت.
print(add_to.__defaults__)
نظرًا لأن الوسيطة الافتراضية (قائمة فارغة) تم إنشاؤها في وقت بدء البرنامج ولم تتم إعادة إنشائه في كل مرة مرة أخرى ، فقد حصلنا على هذا السلوك بالضبط.
يمكنك إصلاح هذا السلوك إذا جعلت القيمة الافتراضية نوعًا غير قابل للتغيير ، وأنشأت قائمة في نص الوظيفة:
def add_to(elem, collection=None): collection = collection or [] collection.append(elem) return collection
انتبه للأمر
collection = collection or []
هذا تناظري أقصر (وأقل وضوحًا ، وإن لم يكن للجميع)
collection = collection if collection else []
رابط للجزء التالي