Faragiri
العربية

كل اللغات

تعلم أساسيات بايثون بايثون

ثمانية أساليب مقابل النسخة التي يكتبها المبتدئ أولا، منها f-string التي تطبع تعبيرها بنفسها والإسناد داخل الشرط.

4الأقسام
3دقائق القراءة
4العمق

الصفوف الثلاثة نفسها، مرتين

النسخة التي تعمل، والنسخة التي لا مكان فيها لعلة تختبئ

العمودان يعملان ويعطيان الجواب نفسه. العمود الأيمن لا يحمل فهرسا واحدا، وهناك يكمن الفرق فعلا.

مكتوبة بلغة أخرىفهارس وعدادات وقائمة مؤقتة
مكتوبة ببايثونتفكيك، والحلقة تصرّح بشكلها بنفسها
قراءة الحقول الثلاثةr[0], r[1], r[2]for code, stock, price in rows
الحاجة إلى الموضعi = 0، ثم i += 1enumerate(rows, start=1)
إقران قائمتينحلقة على range(len(codes))dict(zip(codes, prices))
الترشيح إلى قاموسقاموس فارغ وif داخل حلقة{c: s for c, s, _ in rows if s}
طباعة تصحيحprint("total", total)f"{total=}"

العمود الأيمن مُعلَّم لأن هذه الصفوف الخمسة لها جواب صحيح. هذا ليس صحيحا في كل زوج في هذه اللغة، وشكل يُعلِّم فائزا يتخذ موقفا لا يقارن فحسب.

بنية بايثون صغيرة وأساليبها ليست كذلك، والفجوة بين بايثون التي تعمل وبايثون المتقنة نحو ثمانية من هذه الأساليب. خذي ملف أدوية بثلاثة صفوف، ("PRC-14", 3, 12.5) واثنين مثله، فوق أساس المتغيرات والأنواع الذي تفترضه هذه الصفحة، والفرق يظهر في كل سطر.

  • تفكيك في رأس الحلقة: for code, stock, price in rows بدل r[0], r[1], r[2]
  • enumerate(rows, start=1) حين يُحتاج إلى الموضع، فتعطي (1, 'PRC-14') بلا عداد يُصان
  • dict(zip(codes, prices)) يبني {'PRC-14': 12.5, 'PRC-15': 8.0, 'PRC-16': 4.25} في سطر واحد
  • first, *rest = codes تجيب 'PRC-14' و['PRC-15', 'PRC-16']
  • codes[::-1] يعكس دون لمس الأصل
  • استيعاب قاموس مع ترشيح: {c: s for c, s, _ in rows if s} يسقط الصنف الناقد ويجيب {'PRC-14': 3, 'PRC-16': 7}

شيئان أحدث من أغلب الدروس

f-string تنتهي بعلامة يساوي تطبع التعبير مع قيمته: f"{total=}" تعطي total=24.75. هذه طباعة تصحيح لا يمكن أن تنحرف عن الاسم الذي تُبلغ عنه، ووصلت في بايثون 3.8. التنسيق يضيف: f"{revenue:,} دينار عبر {len(branches)} فروع" يضع فواصل الآلاف فتعطي 118,000 دينار عبر 3 فروع.

عامل المشي يسند داخل شرط، فتُحسب القيمة مرة واحدة وتبقى: if (comma := line.find(",")) != -1: ثم line[:comma]. بدونه يعمل find مرتين أو يُربط اسم في السطر الأعلى ويعيش أطول مما ينبغي. يستحق هذا القدر بالضبط ولا أكثر، ولهذا القاعدة أن يُستخدم فقط حين يكون البديل نداء متكررا.

مفتاح فرز يحمل اتجاهين

الفرز حسب شيئين حين يكون أحدهما تنازليا لا يحتاج دالة مقارنة ولا تمريرتين. انفي المفتاح العددي: sorted(rows, key=lambda r: (-r[1], r[0])) يضع الأعلى مخزونا أولا ويفض التعادل أبجديا، فيتقدم PRC-16 بسبعة على PRC-14 بثلاثة. المقارنة بين الصفوف تتم من اليسار إلى اليمين، وهذه هي القاعدة كلها.

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

ما تشغّلينه في 2026

Ruff يحمل معظم هذا آليا، مجاني ومفتوح المصدر، وهو الفاحص الافتراضي في مشاريع بايثون اعتبارا من 2026. قواعده تسمّي الحلقة التي كان ينبغي أن تكون استيعابا، وrange(len(x)) الذي كان ينبغي أن يكون enumerate، والفهرس اليدوي الذي كان ينبغي أن يكون تفكيكا. حلّ محل تعلّم هذه الأساليب واحدة تلو الأخرى من مراجعة الكود، وهو ما يعمل ويستغرق نحو سنتين.

بايثون 3.14 هو الإصدار الذي ينبغي العمل عليه، مجاني، ورسائل خطئه هي السبب العملي لا أي ادعاء سرعة. حلّ محل بايثون 3.13، ولهذه الأساليب الإصدار الذي يهم هو 3.8 من أجل f-string والعامل walrus، وهو قديم بما يكفي ليكون أي شيء ما زال يعمل بدونهما قيدا يستحق أن يُذكر لا تفضيلا.

أين تضيع الساعتان الأوليان

العطل أن تصلي من لغة أخرى وتكتبي تلك اللغة بصياغة بايثون، فيعمل بلا عيب وتُوصف في المراجعة بأنها غير بايثونية دون أن يشرح أحد التكلفة. التكلفة حقيقية: for i in range(len(rows)) متبوعا بسطر rows[i][0] هو ثلاث فرص لإخطاء الفهرس في كل سطر، والنسخة المفككة بلا فهرس على الإطلاق.

الفحص الذي يختصر السنتين: كلما ظهر فهرس مرتين في سطر واحد، هناك أسلوب بديل. وكلما بُنيت قائمة مؤقتة لتُطاف عليها فقط، هناك استيعاب أو مولّد. راجعي المكتبة القياسية قبل أن تكتبي ما هو مبني فيها أصلا، ثم الفرز حين يتجاوز الترتيب ما يفعله مفتاح واحد.

بجانب هذه العقدة

فوق هذه العقدة