بناء جملة ودلالات لغة بايثون

مقتطف من كود بايثون يوضح البحث الثنائي

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

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

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

فلسفة التصميم

صُممت لغة بايثون لتكون سهلة القراءة للغاية . [ 1 ] تتميز بتصميم مرئي بسيط نسبيًا، وتستخدم الكلمات المفتاحية الإنجليزية بكثرة في حين تستخدم لغات أخرى علامات الترقيم . تهدف بايثون إلى البساطة والاتساق في تصميم تركيبها النحوي، وهو ما يتجسد في مبدأ "يجب أن تكون هناك طريقة واحدة - ويفضل أن تكون واحدة فقط - واضحة للقيام بذلك" ، من فلسفة بايثون . [ 2 ]

هذا الشعار يتعارض عمداً مع شعار Perl و Ruby ، " هناك أكثر من طريقة واحدة للقيام بذلك ".

الكلمات المفتاحية

تحتوي لغة بايثون 3 على 35 كلمة مفتاحية أو كلمة محجوزة ؛ لا يمكن استخدامها كمعرفات . [ 3 ] [ 4 ]

بالإضافة إلى ذلك، يحتوي بايثون 3 على 4 كلمات مفتاحية مرنة ، typeأُضيفت في بايثون 3.12. على عكس الكلمات المفتاحية الثابتة ، تُعدّ الكلمات المفتاحية المرنة كلمات محجوزة فقط في سياقات محدودة يكون فيها تفسيرها ككلمات مفتاحية منطقيًا من الناحية النحوية. يمكن استخدام هذه الكلمات كمعرّفات في أماكن أخرى، بمعنى آخر، تُعتبر كلمتا match و case اسمين صالحين للدوال والمتغيرات. [ 6 ] [ 7 ]

التعليقات التوضيحية للوظائف

تُعرَّف تعليقات الدوال (تلميحات الأنواع) في PEP 3107. [ 8 ] وهي تسمح بإرفاق بيانات بمعاملات الدالة وقيمتها المُعادة. لا تُحدد اللغة عملية التعليقات، بل تُترك لأطر عمل خارجية. على سبيل المثال، يمكن كتابة مكتبة للتعامل مع الكتابة الثابتة: [ 8 ]

دالة النقل ( العنصر : قابل للنقل ، * الوسائط : حيوان مُعَبِّب ) -> المسافة : # التنفيذ هنا

على الرغم من أن التعليقات التوضيحية اختيارية في بايثون، إلا أن بقية هذه المقالة ستستخدم التعليقات التوضيحية لتوفير الوضوح.

الوحدات النمطية وعبارات الاستيراد

في لغة بايثون، يُنظَّم الكود في ملفات تُسمى وحدات ، وتُعرَّف مساحات الأسماء بواسطة كل وحدة على حدة. وبما أن الوحدات يمكن أن تُضمَّن في حزم هرمية، فإن مساحات الأسماء تكون هرمية أيضًا. [ 9 ] [ 10 ] عمومًا، عند استيراد وحدة، تُعرَّف الأسماء المُحدَّدة فيها عبر مساحة اسم تلك الوحدة، ويتم الوصول إليها من الوحدات المُستدعِية باستخدام الاسم المؤهل بالكامل.

# لنفترض أن الوحدة النمطية A تُعرّف دالتين: func1() و func2() وفئة واحدة: Class1. استورد الوحدة النمطية AModuleA.func1 ( ) ModuleA.func2 ( ) a : ModuleA.Class1 = Modulea.Class1 ( )

يمكن استخدام هذا from ... import ...البيان لإدراج الأسماء ذات الصلة مباشرة في مساحة اسم الوحدة النمطية المستدعِية، ويمكن الوصول إلى هذه الأسماء من الوحدة النمطية المستدعِية بدون الاسم المؤهل:

# لنفترض أن الوحدة النمطية A تُعرّف دالتين: func1() و func2() وفئة واحدة: Class1 من الوحدة النمطية A استورد func1func1 () func2 () # سيفشل هذا بسبب اسم غير مُعرَّف، وكذلك الاسم الكامل ModuleA.func2() a : Class1 = Class1 () # سيفشل هذا بسبب اسم غير مُعرَّف، وكذلك الاسم الكامل ModuleA.Class1()

بما أن هذا يستورد الأسماء مباشرة (بدون تحديد)، فإنه يستطيع استبدال الأسماء الموجودة دون أي تحذيرات.

يُعدّ هذا شكلاً خاصاً من أشكال الاستيراد، from ... import *حيث يستورد جميع الأسماء المُعرّفة في الحزمة المُسماة مباشرةً إلى مساحة اسم الوحدة المُستدعِية. على الرغم من دعم اللغة لهذا الشكل من الاستيراد، إلا أنه يُنصح عموماً بتجنّبه لأنه يُلوّث مساحة اسم الوحدة المُستدعِية، وسيؤدي إلى استبدال الأسماء المُعرّفة مسبقاً في حالة تعارض الأسماء. [ 11 ] مع ذلك، ستعرض هذه الصفحة الكود كما لو from typing import *كان السطر " " مُضمّناً، وذلك للإشارة إلى أنواع المجموعات.

يتم توضيح عبارات الاستيراد المختلفة هنا:

# يستورد وحدة تحليل الوسائط import argparse # يستورد فئة Pattern من وحدة التعبيرات النمطية from re import Pattern # يستورد جميع الرموز داخل وحدة الكتابة from typing import *

يمكن أن يؤدي استخدام from importالعبارات في بايثون إلى تبسيط مساحات الأسماء المطولة، مثل مساحات الأسماء المتداخلة.

from selenium.webdriver import Firefox from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.remote.webelement import WebElementإذا كان __name__ يساوي " __main__ " : driver : Firefox = Firefox ( ) element : WebElement = driver.find_element ( By.ID , " myInputField " ) element.send_keys ( f " Hello World { Keys.ENTER } " ) action : ActionChains = ActionChains ( driver ) action.key_down ( Keys.CONTROL ) .send_keys ( " a " ) . key_up ( Keys.CONTROL ) .perform ( )

يدعم بايثون أيضًا import x as yتوفير اسم بديل أو اسم مستعار لاستخدامه من قبل الوحدة النمطية المستدعِية:

استورد numpy كـ np من numpy.typing استورد NDArray و float32أ : NDArray [ float32 ] = np . نطاق ( 1000 )

عند استيراد وحدة برمجية، يتحقق مترجم بايثون أولًا من وجودها في sys.modulesذاكرة التخزين المؤقت، ويعيد استخدامها إن كانت قد استُوردت سابقًا، وإلا فإنه يُحمّلها. عند التحميل، يبحث عنها في الذاكرة sys.path، ويُترجمها إلى رمز وسيط أو يُفسّر محتوياتها. يُنفّذ كل الكود الموجود في النطاق العام للوحدة. مع ذلك، يُمكن التخفيف من هذا باستخدام دالة رئيسية صريحة، والتي تعمل بشكل مشابه لنقطة الدخول في معظم اللغات المُترجمة، باستخدام أسلوب نقطة الدخول الموصوف أدناه.

نقطة الدخول

يمكن إنشاء نقطة دخول زائفة باستخدام الأسلوب التالي، والذي يعتمد على __name__تعيين المتغير الداخلي __main__عند تنفيذ البرنامج، ولكن ليس عند استيراده كوحدة نمطية (في هذه الحالة يتم تعيينه بدلاً من ذلك إلى اسم الوحدة النمطية)؛ وهناك العديد من المتغيرات لهذا الهيكل: [ 12 ] [ 13 ] [ 14 ]

استيراد sysdef main ( argv : list [ str ]) -> int : argc : int = len ( argv ) # الحصول على طول argv n : int = int ( argv [ 1 ]) print ( n + 1 ) return 0إذا كان __name__ يساوي " __main__ " : sys.exit ( main ( sys.argv ) )

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

المسافة البادئة

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

في لغات البرمجة "ذات التنسيق الحر" - التي تستخدم بنية الكتل المشتقة من لغة ALGOL - تُفصل كتل التعليمات البرمجية بأقواس معقوفة ( ) أو كلمات مفتاحية. وفي معظم اصطلاحات البرمجة لهذه اللغات، يقوم المبرمجون عادةً بوضع مسافة بادئة للتعليمات البرمجية داخل الكتلة، لتمييزها بصريًا عن التعليمات البرمجية المحيطة بها.{ }

يمكن تنفيذ دالة تكرارية باسم ، والتي يتم تمرير مُعامل واحد إليها ، وإذا كان المُعامل يساوي 0، فستستدعي دالة مختلفة باسم ، وإلا فستستدعي ، مع تمرير ، كما تستدعي نفسها بشكل تكراري، مع تمرير كمعامل، على النحو التالي في بايثون:fooxbarbazxx-1

دالة foo ( x : int ) -> None : إذا كان x == 0 : bar () وإلا : baz ( x ) foo ( x - 1 )

ويمكن كتابتها على هذا النحو في لغة C :

void foo ( int x ) { if ( x == 0 ) { bar (); } else { baz ( x ); foo ( x - 1 ); } }

قد يُساء فهم الكود ذي المسافات البادئة غير الصحيحة من قِبل القارئ البشري، على عكس تفسيره من قِبل المُصرّف أو المُفسّر. على سبيل المثال، إذا كانت مسافة بادئة استدعاء الدالة foo(x - 1)في السطر الأخير من المثال أعلاه خارج كتلة if/ بشكل خاطئ else:

دالة foo ( x : int ) -> None : إذا كان x == 0 : bar () وإلا : baz ( x ) foo ( x - 1 )

سيؤدي ذلك إلى تنفيذ السطر الأخير دائمًا، حتى عندما xتكون القيمة 0، مما ينتج عنه تكرار لا نهائي .

على الرغم من قبول كل من المسافات وعلامات الجدولة كأشكال للمسافة البادئة، وإمكانية استخدام أي عدد من المسافات، إلا أن استخدام المسافات يُوصى به [ 15 ] ، ويُوصى تحديدًا باستخدام أربع مسافات (كما في الأمثلة السابقة)، وهي الأكثر شيوعًا. [ 16 ] [ 17 ] لا يُسمح بخلط المسافات وعلامات الجدولة في أسطر متتالية بدءًا من بايثون 3 [ 18 لأن ذلك قد يُسبب أخطاءً يصعب اكتشافها، نظرًا لأن العديد من محررات النصوص لا تُميز بصريًا بين المسافات وعلامات الجدولة.

هياكل البيانات

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

my_list : list [ str ] = [ "a" , "b" , " c" ] def my_func ( l : list [ str ]) -> None : l.append ( "x " ) print ( l )print ( my_func ( my_list )) # يطبع ['a', 'b', 'c', 'x'] print ( my_list ) # يطبع ['a', 'b', 'c', 'x']

تُغيّر الدالة my_funcقيمة المتغير my_listباستخدام الوسيط الرسمي l، وهو اسم بديل لـ my_list. ومع ذلك، فإن أي محاولة لإجراء عملية (تعيين مرجع كائن جديد إلى) على الاسم البديل نفسه لن يكون لها أي تأثير على الكائن الأصلي.

my_list : list [ str ] = [ "a" , "b" , "c" ]def my_func ( l : list [ str ]) -> None : # l.append("x") l = l + [ "x" ] # تم إنشاء قائمة جديدة وتعيينها إلى l، مما يعني أن l لم تعد اسمًا بديلًا لـ my_list print ( l )print ( my_func ( my_list )) # يطبع ['a', 'b', 'c', 'x'] print ( my_list ) # يطبع ['a', 'b', 'c']

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

من بين لغات البرمجة الديناميكية، تُعتبر بايثون لغةً ذات تدقيق معتدل في أنواع البيانات. يُعرّف التحويل الضمني للأنواع العددية (وكذلك القيم المنطقية )، لذا يُمكن ضرب عدد مركب في عدد صحيح (على سبيل المثال) دون الحاجة إلى تحويل صريح . مع ذلك، لا يوجد تحويل ضمني بين، على سبيل المثال، الأعداد والسلاسل النصية ؛ فالسلسلة النصية تُعتبر وسيطًا غير صالح لدالة رياضية تتوقع عددًا.

أنواع البيانات الأساسية

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

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

أنواع المجموعات

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

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

أما الخرائط ، فهي أنواع (غالباً غير مرتبة) تُنفذ على شكل قواميس تربط مجموعة من المفاتيح الثابتة بالعناصر المقابلة لها (تماماً مثل الدالة الرياضية). على سبيل المثال، يمكن تعريف قاموس يربط سلسلة نصية "toast"بعدد صحيح 42أو العكس. يجب أن تكون مفاتيح القاموس من نوع بايثون ثابت، مثل عدد صحيح أو سلسلة نصية، لأنها تُنفذ باستخدام دالة تجزئة . هذا يُسرّع عملية البحث بشكل كبير، ولكنه يتطلب بقاء المفاتيح دون تغيير.

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

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

توفر لغة بايثون أيضًا إمكانيات واسعة لمعالجة المجموعات مثل فحص الاحتواء المدمج وبروتوكول التكرار العام.

نظام الكائنات

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

تدعم اللغة استكشافًا معمقًا للأنواع والفئات. يمكن قراءة الأنواع ومقارنتها: فالأنواع هي نسخ من الكائن type. ويمكن استخراج سمات الكائن كقاموس.

يمكن تحميل المعاملات بشكل زائد في بايثون عن طريق تعريف وظائف أعضاء خاصة - على سبيل المثال، تعريف طريقة باسم معين __add__في فئة ما يسمح باستخدام +المعامل على كائنات تلك الفئة.

حرفيًا

الأوتار

تحتوي لغة بايثون على أنواع مختلفة من السلاسل النصية الحرفية .

سلاسل نصية عادية

يمكن استخدام علامات الاقتباس المفردة أو المزدوجة لاقتباس النصوص. على عكس لغات يونكس، أو بيرل ، أو اللغات المتأثرة بها مثل روبي أو جروفي ، تعمل علامات الاقتباس المفردة والمزدوجة بنفس الطريقة، أي لا يوجد استيفاء للنصوص في تعبيرات $foo . مع ذلك، يمكن إجراء الاستيفاء بطرق مختلفة: باستخدام "سلاسل f" (منذ بايثون 3.6 [ 19 ] )، أو باستخدام الدالة ، أو عامل تنسيق السلسلة formatالقديم % .

على سبيل المثال، جميع عبارات بايثون التالية:

print ( f "لقد طبعت للتو { num } صفحة على الطابعة { printer } " )print ( " لقد طبعتُ {} صفحة على الطابعة {} " .format ( num , printer )) print ( "لقد طبعتُ {0} صفحة على الطابعة {1} " .format ( num , printer )) print ( " لقد طبعتُ {a} صفحة على الطابعة {b} " .format ( a = num , b = printer ) )print ( "لقد طبعتُ للتو %s صفحة على الطابعة %s " % ( num , printer )) print ( "لقد طبعتُ للتو %(a) صفحة على الطابعة %(b) " % { "a" : num , "b" : printer })

وهي تعادل عبارة بيرل التالية:

print "لقد طبعت للتو $num صفحة على الطابعة $printer\n"

يقومون بإنشاء سلسلة نصية باستخدام المتغيرات numو printer.

سلاسل نصية متعددة الأسطر

توجد أيضًا سلاسل متعددة الأسطر، والتي تبدأ وتنتهي بسلسلة من ثلاث علامات اقتباس مفردة أو مزدوجة وتعمل مثل المستندات هنا في Perl و Ruby .

مثال بسيط على استخدام الاستيفاء المتغير (باستخدام formatالطريقة) هو:

اطبع ( '''عزيزي {المستلم} ،أتمنى لك أن تغادر ساني ديل ولا تعود إليها أبداً.ليس تمامًا حبًا، {المرسل} ''' . format ( sender = "بافي قاتلة مصاصي الدماء" , recipient = "سبايك" ))

أوتار خام

أخيرًا، تأتي جميع أنواع السلاسل النصية المذكورة سابقًا بصيغ " خام " (يُشار إليها بوضع حرف r قبل علامة الاقتباس الافتتاحية)، والتي لا تستخدم الاستيفاء بالشرطة المائلة العكسية، وبالتالي فهي مفيدة جدًا للتعبيرات النمطية ؛ قارن بـ "@-quoting" في لغة C# . أُدرجت السلاسل الخام في الأصل خصيصًا للتعبيرات النمطية. نظرًا لقيود المُجزئ ، قد لا تحتوي السلاسل الخام على شرطة مائلة عكسية في نهايتها . [ 20 ] يتطلب إنشاء سلسلة خام تحتوي على مسار Windows ينتهي بشرطة مائلة عكسية حلًا بديلًا (عادةً، استخدام الشرطات المائلة الأمامية بدلًا من الشرطات المائلة العكسية، لأن Windows يقبل كليهما).

ومن الأمثلة على ذلك:

# مسار ويندوز، حتى السلاسل النصية الخام لا يمكن أن تنتهي بشرطة مائلة عكسية win_path : str = r "C:\Foo\Bar\Baz \"# خطأ: # الملف "<stdin>"، السطر 1 # win_path: str = r"C:\Foo\Bar\Baz\" # ^ # خطأ في بناء الجملة: نهاية سطر أثناء مسح سلسلة نصية حرفيةdos_path : str = r "C:\Foo\Bar\Baz\ " # يتجنب الخطأ بإضافة print ( dos_path . rstrip ()) # وإزالة المسافة الزائدة # prints('C:\\Foo\\Bar\\Baz\\')quoted_dos_path : str = r '" {} "' . format ( dos_path ) print ( quoted_dos_path ) # يطبع '"C:\\Foo\\Bar\\Baz\\ "'# تعبير نمطي يطابق سلسلة نصية مُقتبسة مع إمكانية استخدام علامات اقتباس مائلة عكسية print ( re . match ( r '"(([^" \\ ]| \\ .)*)"' , quoted_dos_path ) . group ( 1 ) . rstrip ()) # يطبع 'C:\\Foo\\Bar\\Baz\\'code : str = 'foo(2, bar)' # عكس ترتيب الوسائط في استدعاء دالة ذات وسيطين print ( re . sub ( r '\(([^,]*?),([^ ,]*?)\)' , r '(\2, \1)' , code )) # يطبع 'foo(2, bar)' # لاحظ أن هذا لن يعمل إذا كان أي من الوسيطين يحتوي على أقواس أو فواصل.

دمج السلاسل النصية المتجاورة

يُسمح باستخدام السلاسل النصية المتجاورة والمفصولة فقط بمسافات بيضاء (بما في ذلك الأسطر الجديدة باستخدام الشرطات المائلة العكسية)، ويتم تجميعها في سلسلة نصية واحدة أطول. [ 21 ] وبالتالي

العنوان : str = "عمل صالح واحد: " \ 'تاريخ طبيعي للمفك والبرغي'

يعادل

العنوان : str = "عمل صالح واحد: تاريخ طبيعي للمفك والبرغي"

يونيكود

منذ إصدار بايثون 3.0، أصبحت مجموعة الأحرف الافتراضية هي UTF-8 لكلٍ من شفرة المصدر والمفسر. في UTF-8، تُعامل سلاسل يونيكود كما تُعامل سلاسل البايت التقليدية. هذا المثال سيعمل:

s : str = "Γειά" # مرحباً باليونانية print ( s )

أرقام

تكون القيم العددية في بايثون من النوع العادي، على سبيل المثال 0، -1، ، 3.4، 3.5e-8.

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

يدعم بايثون الأرقام العشرية العادية ، والتي يتم إنشاؤها عند استخدام نقطة في حرف (على سبيل المثال 1.1)، أو عند استخدام عدد صحيح ورقم عشري في تعبير، أو نتيجة لبعض العمليات الرياضية ("القسمة الحقيقية" عبر المعامل /، أو الأس مع أس سالب).

يدعم بايثون أيضًا الأعداد المركبة بشكل أصلي. يُشار إلى الجزء التخيليJ من العدد المركب باللاحقة أو j، على سبيل المثال 3 + 4j.

القوائم، والصفوف، والمجموعات، والقواميس

يدعم بايثون بناء الجملة لإنشاء أنواع الحاويات.

القوائم (الفئة list) عبارة عن تسلسلات قابلة للتغيير من عناصر من أنواع عشوائية، ويمكن إنشاؤها إما باستخدام الصيغة الخاصة

my_list : list [ int | str ] = [ 1 , 2 , 3 , "a dog" ]

أو باستخدام إنشاء الكائنات العادية

my_second_list : list [ int ] = [ ] my_second_list.append ( 4 ) my_second_list.append ( 5 )

تُعدّ الصفوف (فئة tuple) تسلسلات غير قابلة للتغيير من عناصر ذات أنواع عشوائية. كما توجد صيغة خاصة لإنشاء الصفوف.

my_tuple : tuple [ int | str ] = 1 , 2 , 3 , "four" my_tuple : tuple [ int | str ] = ( 1 , 2 , 3 , "four" )

على الرغم من أن الصفوف تُنشأ بفصل العناصر بفواصل، إلا أن البنية الكاملة تُحاط عادةً بأقواس لزيادة سهولة القراءة. يُرمز للصف الفارغ بـ `<=>` ()، بينما يُمكن إنشاء صف يحتوي على قيمة واحدة باستخدام `<=>` (1,).

المجموعات (صنف set) هي حاويات قابلة للتغيير لعناصر قابلة للتجزئة [ 22 ] من أنواع عشوائية، بدون تكرار. العناصر غير مرتبة، لكن المجموعات تدعم التكرار على العناصر. يستخدم بناء جملة إنشاء المجموعة الأقواس المعقوفة.

my_set : set [ Any ] = { 0 , (), False }

تُشبه مجموعات بايثون إلى حد كبير المجموعات الرياضية ، وتدعم عمليات مثل تقاطع المجموعات واتحادها . كما توفر بايثون frozensetفئة للمجموعات غير القابلة للتغيير، انظر أنواع المجموعات .

القواميس (فئة dict) هي عبارة عن خرائط قابلة للتغيير تربط المفاتيح بالقيم المقابلة لها. يحتوي بايثون على صيغة خاصة لإنشاء القواميس ( {key: value}).

my_dictionary : dict [ Any , Any ] = { "key 1" : "value 1" , 2 : 3 , 4 : []}

يتشابه بناء جملة القاموس مع بناء جملة المجموعة؛ والفرق يكمن في وجود النقطتين الرأسيتين. {}ينتج عن القيمة الحرفية الفارغة قاموس فارغ بدلاً من مجموعة فارغة ، والتي يتم إنشاؤها باستخدام المُنشئ غير الحرفي set().

المشغلون

الحساب

تتضمن لغة بايثون عوامل التشغيل التالية +: القسمة الحقيقية، -والقسمة على أساس *الجزء الصحيح ، وباقي القسمة ، والأس ، مع أسبقيتها الرياضية المعتادة .///%**

في بايثون 3، x / yتقوم الدالة "بالقسمة الحقيقية"، مما يعني أنها دائمًا ما تُرجع قيمة عشرية، حتى لو كان كل من xو yأعدادًا صحيحة تقسم بالتساوي.

طباعة ( 4 / 2 ) يطبع 2.0

ويقوم //بإجراء القسمة الصحيحة أو القسمة على الجزء الصحيح ، ويعيد الجزء الصحيح من الناتج كعدد صحيح.

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

عوامل المقارنة

تُستخدم عوامل المقارنة، مثل ==` !=<t> <` >و <=... >=، و [ 23 ]` ، isعلى جميع أنواع القيم. يمكن مقارنة الأرقام والسلاسل النصية والمتتاليات والخرائط. في بايثون 3، لا يوجد ترتيب نسبي ثابت للأنواع المختلفة (مثل `<t>` و`<t>` ) ومحاولات مقارنة هذه الأنواع تُسبب استثناءً. مع أنه كان من الممكن مقارنة الأنواع المختلفة في بايثون 2 (على سبيل المثال، ما إذا كانت سلسلة نصية أكبر من أو أصغر من عدد صحيح)، إلا أن الترتيب كان غير مُحدد؛ واعتُبر هذا خللًا تصميميًا تاريخيًا وتمت إزالته نهائيًا في بايثون 3.is notinnot instrintTypeError

تتشابه تعابير المقارنة المتسلسلة، مثل `a`، a < b < cفي معناها مع معناها في الرياضيات، وليس في لغتي C وما شابهها. تُقيّم الحدود وتُقارن بالتسلسل. تتميز هذه العملية بدلالات الدائرة المختصرة ، أي أن التقييم يتوقف حتمًا بمجرد وضوح النتيجة: فإذا a < bكانت `a` خاطئة، cفلا تُقيّم `a` أبدًا لأن التعبير لا يمكن أن يكون صحيحًا بعد ذلك.

بالنسبة للتعبيرات التي لا تُسبب آثارًا جانبية، a < b < cفإنّ تُعادل a < b and b < c. ومع ذلك، يوجد فرق جوهري عندما يكون للتعبيرات آثار جانبية. a < f(x) < bسيتم تقييم f(x)مرة واحدة فقط، بينما a < f(x) and f(x) < bسيتم تقييم مرتين إذا كانت قيمة aأقل من f(x)ومرة ​​واحدة في غير ذلك.

عوامل التشغيل المنطقية

في جميع إصدارات بايثون، تتعامل عوامل التشغيل المنطقية مع القيم الصفرية أو الفارغة مثل ""` 0false` و` Nonefalse` 0.0و`false` []و`false` {}و`false` على أنها خاطئة، بينما تتعامل عمومًا مع القيم غير الفارغة وغير الصفرية على أنها صحيحة. أُضيفت القيمتان المنطقيتان `false` Trueو` Falsefalse` إلى اللغة في بايثون 2.2.1 كثوابت (مشتقة من `false` 1و`false` 0)، ثم أصبحتا كلمتين مفتاحيتين كاملتين في بايثون 3. تُرجع عوامل المقارنة الثنائية مثل `false` ==و` >false` إما `false` Trueأو ` Falsefalse`.

تستخدم المعاملات المنطقية andو تقييمًا بسيطًا . على سبيل المثال، لن يُثير استثناء القسمة على صفر أبدًا. تُعيد هذه المعاملات قيمة المعامل الأخير الذي تم تقييمه، بدلاً من أو . وبالتالي، يُقيّم التعبير إلى ، ويُقيّم إلى .ory == 0 or x/y > 100TrueFalse(4 and 5)5(4 or 5)4

عوامل التشغيل على مستوى البت

تستطيع لغة بايثون إجراء عمليات على مستوى البتات على الأعداد الصحيحة، أو الأعداد الثنائية المكتوبة بالبادئة 0b. تستخدم x << yلإزاحة الأعداد xإلى اليسار بمقدار yخانة، مع إضافة أصفار إلى اليمين. x >> yتقوم بنفس العملية ولكنها تُزيح الأعداد xإلى اليمين، مع إضافة نسخ من البت الأيسر إلى اليسار. يُجري المعامل x & yعملية AND على مستوى البتات، x | yويُجري عملية OR على مستوى البتات، ~ xويُعيد المتمم/NOT للبت x، x ^ yويُجري عملية XOR على مستوى البتات، على عكس ^الاستخدام المعتاد للرمز كمعامل أس. [ 24 ] [ 25 ]

البرمجة الوظيفية

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

فهم المقروء

أحد هذه البنى هو فهم القوائم ، والذي يمكن التعبير عنه بالصيغة التالية:

l : list [ Any ] = [ mapping_expression for element in source_list if filter_expression ]

استخدام فهم القوائم لحساب القوى الخمس الأولى للعدد اثنين:

قوى العدد اثنين : قائمة [ عدد صحيح ] = [ 2 ** ن لـ ن في النطاق ( 1 ، 6 )]

يمكن التعبير عن خوارزمية الفرز السريع بشكل أنيق (وإن كان غير فعال) باستخدام تراكيب القوائم :

T : TypeVar = TypeVar ( "T" )دالة qsort ( l : list [ T ]) -> list [ T ]: إذا كانت l == []: تُرجع [] pivot : T = l [ 0 ] تُرجع ( qsort ([ x for x in l [ 1 :] if x < pivot ]) + [ pivot ] + qsort ([ x for x in l [ 1 :] if x >= pivot ]))

يدعم بايثون 2.7+ [ 26 ] أيضًا فهم المجموعات [ 27 ] وفهم القواميس. [ 28 ]

وظائف من الدرجة الأولى

في لغة بايثون، تعتبر الدوال كائنات من الدرجة الأولى يمكن إنشاؤها وتمريرها ديناميكيًا.

يُعدّ دعم بايثون المحدود للدوال المجهولةlambda أحد أبرز عيوبها. ومن الأمثلة على ذلك الدالة المجهولة التي تربّع مُدخلاتها، والتي يتم استدعاؤها باستخدام الوسيط 5:

f : Callable [[ int ], int ] = lambda x : x ** 2 f ( 5 )

تقتصر دوال لامدا على احتواء تعبير بدلاً من عبارات ، على الرغم من أنه لا يزال من الممكن تنفيذ تدفق التحكم بشكل أقل أناقة داخل لامدا باستخدام الدوائر المختصرة، [ 29 ] وبشكل أكثر سلاسة باستخدام التعبيرات الشرطية. [ 30 ]

عمليات الإغلاق

يدعم بايثون الدوال المغلقة المعجمية منذ الإصدار 2.2. إليك مثال على دالة تُرجع دالة تُقارب مشتقة الدالة المُعطاة:

دالة المشتقة ( f : دالة قابلة للاستدعاء [[ float ], float ], dx : float ): """إرجاع دالة تُقارب مشتقة f  باستخدام فترة dx، والتي يجب أن تكون صغيرة بشكل مناسب.  """ دالة ( x : float ) -> float : إرجاع ( f ( x + dx ) - f ( x ) ) / dx إرجاع الدالة

مع ذلك، قد يدفع بناء جملة بايثون مبرمجي اللغات الأخرى أحيانًا إلى الاعتقاد بأن الدوال المغلقة غير مدعومة. يُحدد نطاق المتغير في بايثون ضمنيًا من خلال النطاق الذي تُسند فيه قيمة للمتغير، ما لم يُصرّح عن النطاق صراحةً باستخدام `include` globalأو `include` nonlocal. [ 31 ]

لاحظ أن ربط اسم بقيمة معينة في الدالة المغلقة غير قابل للتغيير من داخل الدالة. المعطيات:

دالة foo ( a : عدد صحيح ، b : عدد صحيح ) -> None : اطبع ( f "a: { a } " ) اطبع ( f "b: { b } " ) دالة bar ( c : عدد صحيح ) -> None : b = c اطبع ( f "b*: { b } " ) bar ( a ) اطبع ( f "b: { b } " )print ( foo ( 1 , 2 )) يطبع: a: 1 b: 2 b*: 1 b: 2

وكما تلاحظ bمن نطاق الإغلاق، يحتفظ المتغير بقيمته الأصلية؛ إذ bلم ينتقل تغيير الربط داخل الدالة الداخلية إلى خارجها. ولتجاوز هذه المشكلة، يُستخدم nonlocal bأمر `if` في `include` bar. في بايثون 2 (التي تفتقر إلى `include` nonlocal)، يتمثل الحل المعتاد في استخدام قيمة قابلة للتغيير وتغيير تلك القيمة، وليس الربط. على سبيل المثال، قائمة تحتوي على عنصر واحد.

مولدات كهربائية

تم تقديم المولدات في بايثون 2.2 كميزة اختيارية وتم الانتهاء منها في الإصدار 2.3، وهي آلية بايثون للتقييم الكسول للدالة التي من شأنها أن تُرجع قائمة ذات مساحة كبيرة أو تتطلب حسابات مكثفة.

هذا مثال لتوليد الأعداد الأولية بطريقة كسولة:

استيراد itertoolsدالة توليد الأعداد الأولية ( نقطة التوقف : اختياري [ عدد صحيح ] = لا شيء ) - > مُكرِّر [ عدد صحيح ]: الأعداد الأولية : قائمة [ عدد صحيح ] = [] لكل n في itertools.count ( start = 2 ): إذا كانت نقطة التوقف ليست لا شيء و n > نقطة التوقف : إرجاع # يثير استثناء StopIteration مركب : منطقي = خطأ لكل p في الأعداد الأولية : إذا لم يكن n % p : مركب = صحيح استراحة elif p ** 2 > n : استراحة إذا لم يكن مركب : الأعداد الأولية . append ( n ) yield n

عند استدعاء هذه الدالة، يمكن تكرار القيمة المُعادة كما لو كانت قائمة:

for i in generate_primes ( 100 ): # تكرار على الأعداد الأولية بين 0 و 100 print ( i )for i in generate_primes (): # تكرار على جميع الأعداد الأولية إلى ما لا نهاية print ( i )

يبدو تعريف المولد مطابقًا لتعريف الدالة، باستثناء yieldاستخدام الكلمة المفتاحية `generator` بدلًا من ` function` return. مع ذلك، فإن المولد كائن ذو حالة ثابتة، يمكنه الدخول والخروج من النطاق نفسه بشكل متكرر. بالتالي، يمكن استخدام استدعاء المولد بدلًا من القائمة، أو أي بنية أخرى يتم تكرار عناصرها. عندما forتتطلب الحلقة في المثال العنصر التالي، يتم استدعاء المولد، فيُنتج العنصر التالي.

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

تعبيرات المولد

تم تقديم تعابير المولدات في بايثون 2.4، وهي تُعدّ مكافئًا للتقييم الكسول لتعبيرات القوائم. باستخدام مولد الأعداد الأولية المذكور في القسم السابق، يمكننا تعريف مجموعة كسولة، ولكنها ليست لانهائية تمامًا.

استيراد itertoolsprimes_under_million : Iterator [ int ] = ( i for i in generate_primes () if i < 1000000 ) two_thousandth_prime : Iterator [ int ] = itertools . islice ( primes_under_million , 1999 , 2000 ) . next ()

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

primes_under_million : list [ int ] = [ i for i in generate_primes ( 2000000 ) if i < 1000000 ] two_thousandth_prime : int = primes_under_million [ 1999 ]

ستُنشئ عملية بناء القوائم قائمةً كبيرةً فورًا (تحتوي على 78498 عنصرًا في المثال، ولكنها تُنشئ مؤقتًا قائمةً بالأعداد الأولية التي تقل عن مليوني عنصر)، حتى لو لم يتم الوصول إلى معظم العناصر. أما عملية بناء المولدات فهي أكثر اقتصادًا.

فهم القواميس والمجموعات

بينما كانت القوائم والمولدات تحتوي على تعابير/تعبيرات، في إصدارات بايثون الأقدم من 2.7، كان لا بد من استخدام القوائم أو المولدات كحلول بديلة لأنواع المجموعات المضمنة الأخرى في بايثون (القواميس والمجموعات):

squares = dict (( n , n * n ) for n in range ( 5 )) # في بايثون 3.5 والإصدارات الأحدث، يكون نوع squares هو dict[int, int] print ( squares ) # يطبع {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

قامت إصدارات بايثون 2.7 و 3.0 بتوحيد جميع أنواع المجموعات من خلال تقديم فهم القواميس والمجموعات، على غرار فهم القوائم:

print ([ n * n for n in range ( 5 )]) # بناء قائمة عادية # يطبع [0, 1, 4, 9, 16] print ({ n * n for n in range ( 5 )}) # بناء مجموعة # يطبع {0, 1, 4, 9, 16} print ({ n : n * n for n in range ( 5 )}) # بناء قاموس # يطبع {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

أشياء

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

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

9. الفئات ، دليل بايثون 2.6 (2013)

لا تُفرض مبادئ البرمجة الكائنية، مثل استخدام دوال الوصول لقراءة عناصر البيانات، في لغة بايثون. فكما توفر بايثون بنيات البرمجة الوظيفية دون فرض الشفافية المرجعية ، فإنها توفر نظام كائنات دون فرض سلوك البرمجة الكائنية . علاوة على ذلك، من الممكن دائمًا إعادة تعريف الصنف باستخدام الخصائص (انظر الخصائص ) بحيث عند تعيين قيمة لمتغير معين أو استرجاعها في الكود المُستدعي، يتم spam.eggs = toastاستدعاء دالة فعلية spam.set_eggs(toast). هذا يُلغي الميزة العملية لدوال الوصول، ويبقى هذا سلوكًا كائنيًا لأن الخاصية eggsتُصبح جزءًا أساسيًا من واجهة الكائن: فهي لا تعكس بالضرورة تفاصيل التنفيذ.

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

مع بيان

تُعنى هذه withالعبارة بمعالجة الموارد، وتُمكّن المستخدمين من العمل مع بروتوكول إدارة السياق. [ 33 ]__enter__() يتم استدعاء دالة عند الدخول إلى النطاق، وأخرى __exit__()عند الخروج منه. يمنع هذا نسيان تحرير المورد، كما يُعالج حالات أكثر تعقيدًا، مثل تحرير المورد عند حدوث استثناء أثناء استخدامه. تُستخدم مديرات السياق غالبًا مع الملفات، واتصالات قواعد البيانات، وحالات الاختبار، وما إلى ذلك.

ملكيات

تتيح الخصائص استدعاء طرق مُعرَّفة خصيصًا على نسخة من كائن باستخدام نفس الصيغة المستخدمة للوصول إلى السمات. مثال على فئة تُعرِّف بعض الخصائص هو:

class MyClass : def __init__ ( self ) -> None : self . _a : int = 0@property def a ( self ) -> int : return self . _a@ a.setter # يجعل الخاصية قابلة للكتابة def a ( self , value : int ) - > None : self._a = value

الواصفات

يمكن استخدام فئة تُعرّف واحدة أو أكثر من الطرق الخاصة الثلاث __get__(self, instance, owner)كواصف __set__(self, instance, value). __delete__(self, instance)إنشاء نسخة من واصف كعضو في فئة ثانية يجعل تلك النسخة خاصية من خصائص الفئة الثانية. [ 34 ]

الأصناف والأساليب الثابتة

تتيح لغة بايثون إنشاء توابع الأصناف والتوابع الثابتة باستخدام مُزخرفات `include` و`@classmethod include` . الوسيط الأول لتابع الصنف هو كائن الصنف نفسه، وليس مرجعًا ذاتيًا إلى نسخة منه. أما التابع الثابت، فلا يحتوي على وسيط أول خاص، فلا يتم تمرير نسخة الكائن أو كائن الصنف إليه.@staticmethod

الاستثناءات

يدعم بايثون (ويستخدم على نطاق واسع) معالجة الاستثناءات كوسيلة لاختبار حالات الخطأ والأحداث "الاستثنائية" الأخرى في البرنامج.

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

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

تُستخدم الاستثناءات غالبًا كبديلٍ لـ ` if-block`، خاصةً في حالات تعدد الخيوط . ومن الشعارات الشائعة EAFP، أو "طلب المغفرة أسهل من طلب الإذن"، [ 35 ] وهو شعار يُنسب إلى غريس هوبر . [ 36 ] [ 37 ] أما البديل، المعروف باسم LBYL، أو "انظر قبل أن تُقدم"، فيختبر الشروط المسبقة بشكلٍ صريح. [ 38 ]

في نموذج التعليمات البرمجية الأول هذا، وباتباع نهج LBYL، يوجد فحص صريح للخاصية قبل الوصول إليها:

إذا كانت السمة "eggs" موجودة في البريد العشوائي : ham = spam.eggs وإلا : handle_missing_attr ( )

تتبع هذه العينة الثانية نموذج EAFP:

حاول : لحم الخنزير = سبام . بيض باستثناء خطأ السمة : معالجة السمة المفقودة ()

يُؤدي هذان المثالان البرمجيان إلى نفس النتيجة ، مع وجود اختلافات في الأداء . عند وجود spamالسمة ` _ ...eggsspameggs

التعليقات وسلاسل التوثيق

هناك طريقتان لإضافة تعليقات توضيحية إلى كود بايثون. الأولى هي استخدام التعليقات لتوضيح وظيفة جزء معين من الكود. تبدأ التعليقات أحادية السطر بعلامة التجزئة (# #) وتستمر حتى نهاية السطر. أما التعليقات الممتدة على أكثر من سطر، فتُكتب بإضافة سلسلة نصية متعددة الأسطر (مع استخدام الفاصلة (-) """أو '''الفاصلة (-) كفاصل في كل طرف) لا تُستخدم في عمليات الإسناد أو التقييم، بل تقع بين التعليمات البرمجية الأخرى.

التعليق على جزء من التعليمات البرمجية:

استيراد sysdef getline () - > str : return sys.stdin.readline ( ) # الحصول على سطر واحد وإعادته

التعليق على جزء من التعليمات البرمجية يحتوي على عدة أسطر:

def getline () -> str : """تحصل هذه الدالة على سطر واحد وتعيده. كمثال توضيحي، هذا نص توثيقي متعدد الأسطر. يمكن الوصول إلى هذه السلسلة الكاملة باستخدام getline.__doc__ . " "  " return sys.stdin.readline ( )

تُعرَّف سلاسل التوثيق ( Docstrings ) بأنها السلاسل النصية التي تظهر منفردةً دون إسناد، كأول سطر مُزاح داخل وحدة نمطية أو فئة أو دالة، وتُعيَّن محتوياتها تلقائيًا كخاصية تُسمى `docstrings` __doc__، والتي تهدف إلى تخزين وصف سهل القراءة لغرض الكائن وسلوكه واستخدامه. helpتُنشئ الدالة المدمجة `docstrings` مخرجاتها بناءً على __doc__هذه الخاصية. يمكن فصل هذه السلاسل باستخدام `<div>` "أو ` '<div>` للسلاسل أحادية السطر، أو يمكن أن تمتد على عدة أسطر إذا فُصلت باستخدام `<div>` """أو '''`<div>`، وهي صيغة بايثون لتحديد السلاسل متعددة الأسطر. مع ذلك، يُشير دليل أسلوب اللغة إلى تفضيل استخدام علامات اقتباس مزدوجة ثلاثية (` """<div>`) لكلٍّ من سلاسل التوثيق أحادية ومتعددة الأسطر. [ 40 ]

توثيق من سطر واحد:

دالة getline () - > str : """احصل على سطر واحد من الإدخال القياسي وأرجعه.""" return sys.stdin.readline ( )

توثيق متعدد الأسطر:

دالة getline () - > str : """احصل على سطر واحد من  الإدخال القياسي وأرجعه  .  """ return sys.stdin.readline ( )

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

تتوفر أدواتٌ لاستخراج سلاسل التوثيق من كود بايثون وإنشاء التوثيق. ويمكن الوصول إلى توثيق سلاسل التوثيق من المفسر باستخدام الدالة help()، أو من سطر الأوامر باستخدام الأمر pydocpydoc .

تستخدم وحدة doctest القياسية التفاعلات المنسوخة من جلسات Python shell إلى سلاسل التوثيق لإنشاء الاختبارات، بينما تستخدم وحدة docopt هذه التفاعلات لتحديد خيارات سطر الأوامر.

مصممو الديكور

المُزخرف هو أي كائن بايثون قابل للاستدعاء يُستخدم لتعديل تعريف دالة أو طريقة أو فئة. يُمرر إلى المُزخرف الكائن الأصلي المراد تعريفه، ويُعيد كائنًا مُعدَّلًا، ثم يُربط هذا الكائن بالاسم الموجود في التعريف. استُلهمت مُزخرفات بايثون جزئيًا من تعليقات جافا ، ولها بنية مشابهة؛ فبنية المُزخرف هي مجرد اختصار برمجي ، باستخدام @الرمز `_________. مع ذلك، وخلافًا للسمات العامة في معظم لغات البرمجة، والتي تُستخدم لإضافة بيانات وصفية إما للمُصرِّف أو للقراءة عند الانعكاس ، لا تُستخدم مُزخرفات بايثون لإضافة بيانات وصفية، بل كأغلفة تنفيذية.

@viking_chorus def menu_item () -> None : print ( "spam" )

يعادل

def menu_item () -> None : print ( "spam" ) menu_item = viking_chorus ( menu_item )

تُعدّ المُزخرفات شكلاً من أشكال البرمجة الوصفية ؛ فهي تُحسّن أداء الدالة أو الطريقة التي تُزخرفها. على سبيل المثال، في المثال أدناه، viking_chorusقد يؤدي ذلك menu_itemإلى تشغيل الدالة 8 مرات (انظر رسم Spam التخطيطي ) في كل مرة يتم استدعاؤها فيها:

R : TypeVar = TypeVar ( "R" )دالة `viking_chorus` ( myfunc : Callable [ ... , R ]) -> Callable [ ... , None ]: دالة ` inner_func` ( * args : tuple [ Any , ... ] , kwargs : Unpact [ dict [ str , Any ] ] ) -> None : for i in range ( 8 ): myfunc ( * args , kwargs ) return inner_func

تُستخدم مُزخرفات الدوال عادةً لإنشاء أساليب الفئات أو الأساليب الثابتة ، وإضافة سمات الدوال، والتتبع ، وتحديد الشروط المسبقة واللاحقة ، والمزامنة ، [ 41 ] ولكن يمكن استخدامها لأغراض أخرى كثيرة، بما في ذلك التخلص من الاستدعاءات التكرارية الذيلية ، [ 42 ] والتخزين المؤقت ، وحتى تحسين كتابة مُزخرفات أخرى. [ 43 ]

يمكن ربط عناصر الزينة معًا عن طريق وضع عدة عناصر على خطوط متجاورة:

@invincible @favourite_colour ( "Blue" ) def black_knight () -> None : pass

يعادل

دالة black_knight () -> None : pass black_knight = invincible ( favorite_colour ( "Blue" )( black_knight ))

أو باستخدام متغيرات وسيطة

دالة black_knight () -> None : pass blue_decorator = favorite_colour ( "Blue" ) decorated_by_blue = blue_decorator ( black_knight ) black_night = invincible ( decorated_by_blue )

في المثال أعلاه، تأخذ دالةfavourite_colour إنشاء الديكور وسيطًا. يجب أن تُعيد دوال إنشاء الديكور ديكورًا، والذي يتم استدعاؤه بعد ذلك مع الكائن المراد تزيينه كوسيط له:

دالة ` favorite_colour` تأخذ وسيطين : `colour` ( سلسلة نصية ) و` func` ( سلسلة نصية )، وتعيد كائنين من نوع ` Callable` . ثم تُعيد الدالة `coorator` التي تأخذ وسيطين من نوع ` Callable` و` R` . بعد ذلك، تُعيد الدالة `coorator` كائنين من نوع `Callable` و`R`. ثم تُعيد الدالة ` coorator` كائنين من نوع ` Callable` و` R` . ثم تُعيد الدالة `coorator` كائنين من نوع ` Callable` . ثم تُعيد الدالة `coorator` كائنين من نوع `Callable`.

سيؤدي هذا إلى تزيين الدالة بحيث تتم طباعة black_knightاللون قبل تشغيلها. يضمن الإغلاق إمكانية الوصول إلى وسيط اللون من قِبل الدالة المُغلِّفة الداخلية حتى عند إرجاعه وخروجه من نطاق التعريف، وهو ما يسمح للمُزيِّنات بالعمل."Blue"black_knight

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

بيض عيد الفصح

يتوقع مستخدمو لغات البرمجة التي تستخدم الأقواس المعقوفة ، مثل C أو Java ، أو يرغبون أحيانًا في أن تتبع لغة Python اصطلاحًا يعتمد على فواصل الكتل. وقد طُلب مرارًا وتكرارًا استخدام صيغة الكتل المفصولة بالأقواس، ولكن رفضها مطورو Python الأساسيون باستمرار. يحتوي مُفسِّر Python على ميزة خفية تُلخص آراء مطوريه حول هذه المسألة. from __future__ import bracesيُثير الكود استثناءً SyntaxError: not a chance. __future__تُستخدم هذه الوحدة عادةً لتوفير ميزات من الإصدارات المستقبلية لـ Python.

تظهر رسالة خفية أخرى، وهي "زين بايثون" (ملخص لفلسفة تصميم بايثونimport this )، عند محاولة القيام بذلك .

Hello world!تُطبع الرسالة عند import __hello__استخدام عبارة الاستيراد. في بايثون 2.7، Hello world!تُطبع بدلاً من ذلك Hello world....

يؤدي استيراد antigravityالوحدة إلى فتح متصفح الويب على الرسم الكاريكاتوري رقم 353 من سلسلة xkcd ، والذي يصور استخدامًا خياليًا فكاهيًا لهذه الوحدة، بهدف توضيح سهولة تمكين وحدات بايثون لوظائف إضافية. [ 44 ] في بايثون 3، تحتوي هذه الوحدة أيضًا على تطبيق لخوارزمية "geohash"، في إشارة إلى الرسم الكاريكاتوري رقم 426 من سلسلة xkcd . [ 45 ]

ملحوظات

  1. 1 2async وتمawaitتقديمهما في بايثون 3.5. [ 5 ]
  2. 1 2True وأصبحتFalseكلمات مفتاحية في بايثون 3.0. سابقًا كانت متغيرات عامة .
  3. تم تقديم ↑ في بايثون 3.0.nonlocal
  4. 1 2 3match ،caseوتم_تقديمها ككلمات مفتاحية في بايثون 3.10.

مراجع

  1. "سهولة القراءة مهمة." - PEP 20 - فن بايثون، مؤرشف بتاريخ 5 ديسمبر 2014 في أرشيف الإنترنت
  2. "PEP 20 - جوهر بايثون" . مؤسسة برمجيات بايثون. 23 أغسطس 2004. مؤرشف من الأصل في 3 ديسمبر 2008. تم الاطلاع عليه في 24 نوفمبر 2008 .
  3. "2. التحليل المعجمي" . وثائق بايثون 3. مؤسسة برمجيات بايثون . تم الاطلاع بتاريخ 11 مارس 2021 .
  4. "2. التحليل المعجمي" . وثائق بايثون الإصدار 2.7.18 . مؤسسة برمجيات بايثون . تم الاطلاع بتاريخ 11 مارس 2021 .
  5. "الكلمات المفتاحية الجديدة" . وثائق بايثون الإصدار 3.5 . Docs.python.org. مؤرشف من الأصل بتاريخ 18-06-2016 . تم الاطلاع عليه بتاريخ 01-06-2016 .
  6. "2. التحليل المعجمي" . وثائق بايثون 3. مؤسسة برمجيات بايثون . تم الاطلاع بتاريخ 22-01-2022 .
  7. "PEP 622 - مطابقة الأنماط الهيكلية" . 23-06-2020 . تم الاطلاع عليه بتاريخ 22-01-2022 .
  8. 1 2 "PEP 3107 -- تعليقات الدوال" . مؤرشف من الأصل بتاريخ 2015-01-06 . تم الاطلاع عليه بتاريخ 2014-08-15 .
  9. "6. الوحدات النمطية" . دليل بايثون التعليمي . مؤسسة برمجيات بايثون . تم الاطلاع عليه بتاريخ 25 أكتوبر 2010 .
  10. "نطاقات ومساحات أسماء بايثون" . Docs.python.org . تم الاطلاع عليه بتاريخ 26-07-2011 .
  11. https://docs.python.org/3/tutorial/modules.html "بشكل عام، يُستحسن تجنب استخدام * من وحدة أو حزمة"
  12. غيدو فان روسوم (15 مايو 2003). "دوال main() في بايثون" . مؤرشف من الأصل في 11 يوليو 2015. تم الاطلاع عليه في 29 يونيو 2015 .تعليقات
  13. البرمجة بأسلوب بايثون: لغة بايثون الاصطلاحية ( مؤرشفة بتاريخ ٢٧ مايو ٢٠١٤ على موقع Wayback Machine) — حول نصوص بايثون المستخدمة كوحدات نمطية
  14. نيد باتشيلدر (6 يونيو 2003). "دوال main() في بايثون" . مؤرشف من الأصل في 20 سبتمبر 2015. تم الاطلاع عليه في 29 يونيو 2015 .
  15. "PEP 8 -- دليل أسلوب كتابة كود بايثون" . Python.org . تم الاطلاع عليه بتاريخ 17-03-2021 .
  16. هوفا، فيليبي (26 يوليو 2017). "400,000 مستودع على GitHub، مليار ملف، 14 تيرابايت من التعليمات البرمجية: المسافات أم علامات الجدولة؟" . Medium . تم الاطلاع عليه بتاريخ 11 مارس 2021 .
  17. "علامات الجدولة أو المسافات" . ukupat.github.io . تم ​​الاطلاع عليه بتاريخ 11-03-2021 .
  18. "PEP 8 -- دليل أسلوب كتابة كود بايثون" . Python.org . تم الاطلاع عليه بتاريخ 11 مارس 2021 .
  19. "PEP 498 - استيفاء السلاسل النصية الحرفية" . ما الجديد في بايثون 3.6 . 23-12-2016. مؤرشف من الأصل في 30-03-2017 . تم الاطلاع عليه في 29-03-2017 .
  20. "2. التحليل المعجمي" . وثائق بايثون الإصدار 2.7.5 . Docs.python.org. مؤرشف من الأصل بتاريخ 23-10-2012 . تم الاطلاع عليه بتاريخ 16-08-2013 .
  21. "2. التحليل المعجمي" . وثائق بايثون الإصدار 2.7.5 . Docs.python.org. مؤرشف من الأصل بتاريخ 23-10-2012 . تم الاطلاع عليه بتاريخ 16-08-2013 .
  22. عادةً ما تكون العناصر القابلة للتجزئة غير قابلة للتغيير، ولكن ليس بالضرورة بحكم التعريف. انظر python.org/3/glossary.htm
  23. "6. التعبيرات — وثائق بايثون 3.9.2" . docs.python.org . تم الاطلاع عليه بتاريخ 17-03-2021 .
  24. "BitwiseOperators - Python Wiki" . wiki.python.org . تم الاطلاع عليه بتاريخ 2025-12-02 .
  25. "معاملات البت في بايثون" . www.w3schools.com . تم الاطلاع عليه بتاريخ 2025-12-02 .
  26. "إصدار بايثون 2.7.0" . مؤرشف من الأصل بتاريخ 27 يناير 2016. تم الاطلاع عليه بتاريخ 19 يناير 2016 .
  27. "5. هياكل البيانات - وثائق بايثون 2.7.18" . مؤرشف من الأصل بتاريخ 26 يناير 2016. تم الاطلاع عليه بتاريخ 19 يناير 2016 .
  28. "5. هياكل البيانات - وثائق بايثون 2.7.18" . مؤرشف من الأصل بتاريخ 26 يناير 2016. تم الاطلاع عليه بتاريخ 19 يناير 2016 .
  29. ديفيد ميرتز. "البرمجة الوظيفية في بايثون" . IBM developerWorks. مؤرشف من الأصل بتاريخ 20 فبراير 2007. تم الاطلاع عليه بتاريخ 27 أغسطس 2007 .
  30. "PEP 308 -- التعبيرات الشرطية" . مؤرشف من الأصل بتاريخ 13 مارس 2016. تم الاطلاع عليه بتاريخ 14 أبريل 2016 .
  31. تم اعتماد الكلمة المفتاحية بواسطةPEP 3104. مؤرشف بتاريخ 2014-12-02 في Wayback Machinenonlocal
  32. "دليل أسلوب بايثون" . docs.python-guide.org. مؤرشف من الأصل بتاريخ 9 مارس 2015. تم الاطلاع عليه بتاريخ 8 مارس 2015 .
  33. "PEP 343 -- عبارة "مع" . مؤرشف من الأصل بتاريخ 14-12-2014 . تم الاطلاع عليه بتاريخ 15-08-2014 .
  34. "مسرد المصطلحات - وثائق بايثون 3.9.2" . docs.python.org . تم الاطلاع عليه بتاريخ 23-03-2021 .
  35. EAFP مؤرشف بتاريخ 26-10-2012 في Wayback Machine ، مسرد مصطلحات بايثون
  36. هامبلين، ديان. "حدود خيالنا فقط: مقابلة حصرية مع الأدميرال غريس م. هوبر" . مجلة تكنولوجيا المعلومات التابعة لوزارة البحرية. مؤرشفة من الأصل في 14 يناير 2009. تم الاطلاع عليها في 31 يناير 2007 .
  37. 1 2 بايثون باختصار، أليكس مارتيلي ، ص 134
  38. LBYL مؤرشف بتاريخ 21 يناير 2018 في Wayback Machine ، مسرد مصطلحات بايثون
  39. أليكس مارتيلي (19 مايو 2003). "EAFP ضد LBYL" . قائمة بريدية بايثون . تم الاطلاع عليه في 18 يوليو 2011 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  40. "PEP 8 -- دليل أسلوب كتابة كود بايثون" . Python.org . تم الاطلاع عليه بتاريخ 23-03-2021 .
  41. "مُزخرفات بايثون 2.4: تقليل تكرار التعليمات البرمجية وتوحيد المعرفة" . دكتور دوبس . 1 مايو 2005. مؤرشف من الأصل في 6 فبراير 2007. تم الاطلاع عليه في 8 فبراير 2007 .
  42. "مُزخرف التكرار الذيل الجديد" . ASPN: كتاب طبخ بايثون . ١٤ نوفمبر ٢٠٠٦. مؤرشف من الأصل في ٩ فبراير ٢٠٠٧. تم الاسترجاع في ٨ فبراير ٢٠٠٧ .
  43. "وحدة التزيين" . مؤرشف من الأصل بتاريخ 10-02-2007 . تم الاطلاع عليه بتاريخ 08-02-2007 .
  44. سي بايثون: لغة برمجة بايثون ، بايثون، 15 أكتوبر 2017، مؤرشف من الأصل في 15 سبتمبر 2017 ، تم استرجاعه في 15 أكتوبر 2017
  45. "كنزٌ خفيٌّ آخر. · python/cpython@b1614a7" . GitHub . تم الاطلاع عليه بتاريخ 15-10-2017 .