Professional Documents
Culture Documents
تأليف
ليزا تاغليفيري
ترجمة
محمد بغات
عبد اللطيف ايمش
تحرير
جميل بيلوني
تصميم الغالف
فرج الشامي
أكاديمية حسوب © النسخة األولى 2020
صنف -غير
الم َّ
مرخص بموجب رخصة المشاع اإلبداعي :نَ سب ُ
َّ هذا العمل
أكاديمية حسوب
تهدف أكاديمي ة حس وب إلى توف ير مق االت ودروس
عربية فصيحة.
عالية الجودة.
Academy.hsoub.com
شركة حسوب
ً
افة إلى موق ع بعي د ،وكم ا أنه ا ت وفر خ دمات وخمس ات؛ إض
موقع صور.
Hsoub.com
▲
جدول المحتويات
تقديم 15..............................................
.1كيفية استخدام هذا الكتاب17..................................
.5خالصة الفصل27..................................................
.2أوبنتو41.............................................................
.3دبيان 47.............................................................
54..........................................................CentOS .4
60...........................................................macOS .5
.4استيراد الوحدات75..............................................
.7خالصة الفصل79..................................................
.2التعليقات الكتلية83...............................................
.3التعليقات السطرية84............................................
.5خالصة الفصل87..................................................
المتغيرات واستخداماتها88.......................
.1فهم المتغيرات89..................................................
.6خالصة الفصل102................................................
.2األعداد105..........................................................
.3القيم المنطقية107................................................
.4السالسل النصية109..............................................
.5القوائم (110................................................)Lists
.6الصفوف (111...........................................)Tuples
.7القواميس ( 112..................................)Dictionaries
.9خالصة الفصل125................................................
.9خالصة الفصل146................................................
.2عالمات االقتباس148.............................................
.4تهريب المحارف150..............................................
نسقات 153..........................................
.6استخدام المُ ِّ
.9استخدام المتغيرات165..........................................
.10خالصة الفصل166...............................................
.2الجمع والطرح170.................................................
.6القوة (174................................................)Power
.10خالصة الفصل186...............................................
.2العامالت المنطقية191............................................
.5خالصة الفصل197................................................
.9خالصة الفصل223................................................
.6خالصة الفصل236................................................
.2تعديل القواميس243.............................................
.4خالصة الفصل249................................................
.2التعليمة 253..................................................else
.5خالصة الفصل262................................................
.4خالصة الفصل287................................................
.5إعادة قيمة296.....................................................
رئيسية299.............................
ً ً
دالة .6استخدام )(main
.8ترتيب الوسائط310...............................................
.10خالصة الفصل313...............................................
.2استيراد الوحدات317.............................................
.7خالصة الفصل329................................................
.2الكائنات332........................................................
.3الباني (334........................................)Constructor
.7خالصة الفصل344................................................
.2األصناف األساسية348...........................................
.7خالصة الفصل360................................................
.5خالصة الفصل368................................................
.3نقاط التوقف376..................................................
.9خالصة الفصل403................................................
.2بايثون 405........................................................3
.3بايثون 406.....................................................2.7
.8تحديث الشيفرة417..............................................
.10خالصة الفصل419...............................................
تقديم
ت
في الص دارة وذاك لمزاي ا ه ذه اللغ ة ال تي ال تنحص ر أوله ا س هولة كتاب ة وق راءة ش يفراتها ح تى
أضحت الخيار األول بين يدي المؤسسات األكاديمية والتدريبية لتدريسها للطالب الجدد الراغ بين
في الدخول إلى مجال علوم الحاسوب والبرمجة .أضف إلى ذلك أن بايثون ً
لغة متع َّددة األغ راض
واالس تخدامات ،ل ذا فهي دومً ا الخي ار األول في ش تى مج االت عل وم الحاس وب الص اعدة مث ل
ال ذكاء الص نعي وتعلم اآلل ة وعل وم البيان ات وغيره ا ،كم ا َّ
أنه ا مطلوب ة بش دة في س وق العم ل
جاء هذا الكتاب المترجم عن كتاب « »How to code in Pythonلصاحبته ل يزا ت اغليفيري
( )Lisa Tagliaferriليش رح المف اهيم البرمجي ة األساس ية بلغ ة ب ايثون ،ونأم ل أن يك ون إض ً
افة
ً
منطلق ا لل دخول إلى ع الم البرمج ة من العربية وأن يفيد القارئ العربي في أن يك ون
َّ ً
نافعة للمكتبة
أوسع أبوابه.
هذا الكتاب مرخص بموجب رخصة المش اع اإلب داعي « Creative Commonsنس ب المُ ص نَّف -
مفتوحا.
ً تعليميا
ًّ وهو متاح الستخدامه مصدرًا
نظ رًا لكون ه مت وفرُ ا على هيئ ة كت اب إلك تروني ،فبإمكان ك اس تخدام كت اب «البرمج ة بلغ ة
واء في
ً ً
مفتوح ا ،وبالت الي يمكن اس تخدامه في أي فص ل دراس ي س تعليمي ا
ً ب ايثون» مرجعً ا
المدرسة أو الجامعة ،كما يمكن توفير هذا الكتاب اإللكتروني للعامة في المكتبات.
كيفية
َّ يمكن استخدام هذا الكتاب اإللكتروني بع دة طرائ ق ،وس وف نوض ح في ه ذا التق ديم
التعام ل م ع الكت اب ،وكي ف يمكن للمعلمين والطالب اس تخدام الكت اب في فص ولهم الدراس ية،
وكي ف يمكن ألمن اء المكتب ات العام ة والجامعي ة توف ير ه ذا الكت اب اإللك تروني ليك ون مرجعً ا
ً
الحق ا، ً
توجيه ا ح ول م ا يجب أن يتعلم ه تعليميا .أخ يرًا ،بالنس بة للق ارئ ال ذي أنهى الكت اب ويري د
ًّ
إال َّ
أنه ليس علي ك التقي د ب الترتيب :اب دأ حيث ش ئت ،وأق رأه ب الترتيب ال ذي يناس ب احتياجات ك.
إذا ق رأت الكت اب ب الترتيب ،فس تبدأ رحلت ك في ب ايثون من مقدم ة عام ة ح ول اللغ ة لمن ال
يعرفه ا ،بع د ذل ك ،س تتعلم إع داد بيئ ة برمج ة على الجه از المحلي أو على الخ ادم ،وس تبدأ تعلم
البني ة العام ة لش يفرة ب ايثون ،وص ياغتها ،وأن واع البيان ات فيه ا .في ثنِيِّ ات الطري ق ،س تتعلم
أساس يات المنط ق الحس ابي في ب ايثون ،وهي مه ارات مفي دة ح تى في لغ ات البرمج ة األخ رى.
سنركز في بداية الكتاب على كتاب ة الس كربتات في ب ايثون ،ثم س ِّ
نقدم بالت دريج مف اهيم البرمج ة
الكائني ة لمس اعدتك على كتاب ة ش يفرات أك ثر مرون ة وتعقي ًدا ،م ع تجنب التك رار .وفي نهاي ة
الكت اب ،س تتعلم كيفي ة تنقيح ش يفرة ب ايثون ،وس نختم بفص ل عن االختالف ات الرئيس ية بين
بايثون 3واإلصدارات السابقة وكيفية ترحيل شيفرة بايثون من اإلصدار بايثون 2إلى بايثون .3
اإللك تروني المج اني .ق د يوج د في مدرس تك أو جامعت ك مس تودعً ا أو مكتب ًة مفتوح ًة للمراج ع
ً
أيض ا مش اركة ه ذا التعليمي ة وال تي يمكن ك فيه ا إتاح ة ه ذا الكت اب للطالب أو المعلمين .يمكن ك
الكت اب اإللك تروني م ع األندي ة والمجموع ات ال تي تنتمي إليه ا وال تي ق د تك ون مهتم ة بتعلم
البرمج ة بلغ ة ب ايثون .وإض افة إلى األندي ة وال برامج الخاص ة بعل وم الحاس وب ،يمكن أن يس تفيد
ً
أيض ا من هذا الكتاب األشخاص الذين يدرسون علم البيانات واإلحصاء والعلوم اإلنسانية الرقمية.
ً
مجان ا م ع طالب ك .يمكن ك اتب اع ت رتيب فص ول الكت اب ،أو يمكن ك ه ذا الكت اب التعليمي المفت وح
ً
أيض ا تكمي ل انتقاء الفصول التي تناس ب المُ ق رَّ ر ال ذي ُت ِّ
درس ه وف ق ال ترتيب المناس ب ل ك .يمكن ك
ً
أيض ا هذا الكتاب الرقمي ب الكثير من ال دروس والمق االت من أكاديمي ة حس وب أو غيره ا ،ويمكن ك
إذا كنت أمين مكتب ة ،فيمكن ك إض افة كت اب «البرمج ة بلغ ة ب ايثون» إلى فه رس مكتبت ك.
الرقمية.
َّ األمية
َّ مفي ًدا في الحياة المهنية ،ويساعد على تخفيض
حسوب .أثناء ذلك ،يمكنك التنقل بين توثيق بايثون في موسوعة حسوب وفصول هذا الكتاب.
ألي شخص ملم بالبرمجة أن يس اهم في المش اريع مفتوح ة المص در .ال برامج مفتوح ة
يمكن ِّ
المصدر هي برامج متاحة لالس تخدام وإع ادة التوزي ع والتع ديل دون قي ود .تس اعد المس اهمة في
المش اريع مفتوح ة المص در على تحس ين ال برامج ،ع بر ض مان تمثيله ا لقاع دة عريض ة من
المس تخدمين .عن دما يس اهم المس تخدمون في المش اريع مفتوح ة المص در ،س واء ع بر كتاب ة
الش يفرة ،أو التوثي ق ،أو ص يانة المجل دات ،ف إنهم ي وفرون قيم ة مض افة للمش روع ،ومجتم ع
للحص ول على مراج ع إض افية عن ب ايثون ،أو للمش اركة في نقاش ات م ع اآلخ رين ،يمكن ك
إذا كنت مهتمً ا بتعلم تطوير تطبيقات الويب أو تطبيقات الجوال ،أو تعلم لغ ات مح َّددة مث ل
روبي وجافاس كربت ،ف اطلع على قس م ال دورات في األكاديمي ة ،كم ا يمكن ك تص فح موس وعة
حسوب ألجل قراءة توثيقات عدد كبير من لغات البرمجة باللغة العربية.
جميل بيلوني
ب ايثون لغ ٌة س هلة الق راءة للغاي ة ومتنوع ة ومتع ددة االس تخدامات ،واس مها مس توحى من
مجموع ة كوميدي ة بريطاني ة باس م « ،»Monty Pythonوك ان أح د األه داف األساس ية لفري ق
وتعطي ك تقري رًا مباش رًا عن د ح دوث أخط اء ،وهي خي ارٌ ممت ٌ
از للمبت دئين والواف دين الج دد على
البرمج ة .لغ ة ب ايثون هي لغ ة متع ِّددة االس تعماالت ،وت دعم مختل ف أنم اط البرمج ة مث ل كتاب ة
في مجال إرسال مركبات فضائية وتتعاقد معها ناسا) و « ( »Industrial Light & Magicأستوديو
برمجة جديدة.
أنها ٌ
نشط للغاية في المجتمع .وتع ُّد بايثون على َّ بايثون من قِ بل ،Guido van Rossumوهو عضوٌ
( )exception handlingوال دوال واألص ناف ( )classesم ع إمكاني ة الوراث ة فيه ا .وع دما ُأ ِ
نش ئ
وخصوصا لتطوير
ً بايثون بالنمو ،مما ّ
مهد الطريق لها لتصبح واحدة من أكثر لغات البرمجة شيوعً ا
.1تاريخ بايثون
ظهرت لغة بايثون في أواخر الثمانينيات على يد غيدو فان روسوم (،)Guido van Rossum
وق د عُ َّدت خليف ًة للغ ة .ABCكم ا اس تفادت ب ايثون من الكث ير من اللغ ات الس ابقة له ا ،مث ل
ُن ِش ر اإلص دار 2.0من لغ ة ب ايثون ع ام ،2000وق د ق َّدم العدي د من الم يزات الجدي دة ،مث ل
ً
متوافق ا تمامً ا م ع بي د َّ
أنه لم يكن رة في اللغ ةْ ، في عام 2008اإلصدار بايثون ،3.0والذي َّ
شكل طف ً
اإلص دارات الس ابقة ،ل ذلك ق رر فري ق التط وير االس تمرار في دعم إص دار أخ ير من سلس لة ب ايثون
المفتاحية،
َّ ُّ
التعلم :يس هل تعلم لغ ة ب ايثون ،إذ تت ألف من ع دد قلي ل من الكلم ات س))هولة •
وتتميز بصياغة بسيطة وواضحة.
مكتب ))ة قياس ))ية واس)))عة :تحت وي مكتب ة ب ايثون القياس ية على ع دد كب ير من الح زم •
المحمولة التي تتوافق مع أنظمة يونكس وويندوز وماك.
متع) ِّ
)ددة المنص))ات :يمكن تش غيل لغ ة ب ايثون على طي ف واس ع من المنص ات واألجه زة، •
مع االحتفاظ بنفس الواجهة على جميع تلك المنصات.
التوس) )عية :من أهم مم يزات ب ايثون ،ه و توفره ا على ع دد هائ ل من الوح دات ،ال تي
ُّ •
يمكنها توسيع قدرات اللغ ة في ك ل مج االت التط وير ،مث ل تحلي ل البيان ات والرس وميات
ثنائي ة وثالثي ة األبع اد ،وتط وير األلع اب ،واألنظم ة المدمج ة ،والبحث العلمي ،وتط وير
المواقع وغيرها من المجاالت.
ِّ
توفر بايثون واجهات لجميع قواعد البيانات األساسية. قواعد البيانات: •
الرسومية.
َّ الرسوميات :تدعم بايثون التطبيقات •
َّ
والمعقدة. دعم البرامج الكبيرة :بايثون مناسبة للبرامج الكبيرة •
ستخدم بايثون؟
َ .3أين ُت
ُتس تخ َدم لغ ة ب ايثون في ك ل المج االت ،فهي لغ ة برمج ة متع ِّددة األغ راض ،ومن مج االت
اس تخدامها :تحلي ل البيان ات ،والروبوت ات ،وتعلم اآلل ة ،وتطبيق ات ،RESTوتط وير المواق ع
واأللع اب ،والرس وم ثالثي ة األبع اد ،واألتمت ة وبرمج ة األنظم ة المدمج ة ،والكث ير من المج االت
تس تخدم الكث ير من المواق ع والش ركات العمالق ة لغ ة ب ايثون ،ومنه ا Spotifyو Google
و ،Amazonإض افة إلى Facebookال تي تس تخدم ب ايثون لمعالج ة الص ور .وفي ك ل ي وم تتح ول
ش ركات جدي دة إلى اس تخدام ب ايثون ،مث ل Instagramال تي ق ررت م ؤخ ًرا اس تخدامها وفض لتها
األمريكية ناسا ،والتي لها مستودع خاص بالمشاريع المُ طورة ببايثون.
البرمج ة ال تي يجب تعلمه ا ،فستحص ل على ع دة إجاب ات ،ويكفي أن ت دخل على جوج ل وتكتب
ال أريد أن أبدأ حرب لغات البرمجة هنا ،ولكني سأحاول تقديم بعض الحجج لتبرير لماذا أرى
وأن تعلم لغ ة ب ايثون مث الي للمبت دئين ال ذين يري دون دخ ول ع الم
َّ أن ب ايثون هي لغ ة المس تقبل،
َّ
ا .الشعبية
تمكنت سنة 2019من التفوق على جاف ا ِبع ِّدها أك ثر لغ ة برمج ة متع ددة األغ راض اس تخدامً ا ،كم ا
أنه ا راب ع أك ثر لغ ة تكنولوجي ا برمج ة اس تخدامً ا وراء JavaScriptو CSS/HTMLو ،SQLكم ا َّ
أنه ا َّ
متع ِّددة األغ راض اس تخدامً ا ،ب ل هي ف وق ذل ك محبوب ة من قب ل الم برمجين ،وه ذا مؤش ر على
در: برمجين (المص دى الم ةل ة المحبوب ات البرمج ثر لغ أك •
)https://insights.stackoverflow.com/survey/2019
يس تخدم ب ايثون بعض أك بر الش ركات في مج ال التكنولوجي ا ،مث ل Uberو PayPal
ذا، ً
افة إلى ه و Googleو Facebookو Instagramو Netflixو Dropboxو .Redditإض
ُتس تخ َدم ب ايثون بكثاف ة في مج ال ال ذكاء االص طناعي والتعلم اآللي وتحلي ل البيان ات وأنظم ة
يق در موق ع ،stackoverflowال دخل الس نوي لمط وري ب ايثون المح ترفين بح والي 63أل ف
ج .الدعم
المفض لة للمبت دئين ،فهن اك قن اطير من المراج ع والم واد وال دورات التعليمي ة ال تي تش رح مف اهيم
س واء كنت هاويً ا ،وتحب تعلم البرمج ة هواي ًة ،أو ألج ل اس تخدامها في مج ال عمل ك ،مث ل
تدخل سوق العمل وتحق ق دخاًل من البرمج ة ،ففي جمي ع ه ذه الح االت ،س يكون تعلم لغ ة ب ايثون
مثاليا لك.
ً خيا ًرا
.5خالصة الفصل
وكائنية ،وواح دة
َّ بايثون هي لغة برمجة عالية المستوى ،ومُ ترجمَ ة ( )interpretedوتفاعلية
ُّ
والتعلم اآللي. الفيديو ومعالجة اللغات ،وحتى تحليل البيانات
أضف إلى ذلك أنها تتمتع بمقروئي ة عالي ة ،إذ تس تخدم كلم ات إنجليزي ة بس يطة ،على خالف
ياغية
َّ اإلمالئية والص
َّ أن قواع دها
اللغ ات األخ رى ال تي تس تخدم الرم وز والكلم ات المختص رة ،كم ا َّ
ً
موازنة مع لغ ات برمجي ة أخ رى .وه ذا ه و الس بب الرئيس ي العتم اد بسيطة ،ما يجعل تعلمها سهاًل
الجامعات ومختلف دورات البرمج ة التدريبي ة تدريس ها في البداي ة لمن يري د ال دخول إلى مج ال
خصوصا.
ً علوم الحاسوب عمومً ا والبرمجة
بع د أن أخ ذت فك رة عام ة عن لغ ة البرمج ة ب ايثون وتع رفت على تاريخه ا وإص داراتها -في
الفصل السابق -سيرشدك هذا الفصل إلى كيفي ة تث بيت ب ايثون على نظ ام تش غيلك وإع داد البيئ ة
األم ور ال تي سنس لط الض وء عليه ا هي :تث بيت ب ايثون 3ثم إع داد بيئته ا البرمجي ة ال تي
ِّ
تمكن ك من إنش اء مس احة معزول ة في حاس وبك مخصص ة لمش اريع وهمية َّ
تتمثل بإع داد بيئ ة
َّ
بسيطا يعرض العبارة "!( "Hello Worldأهاًل بالعالم!) الشهيرة ،وبهذا س نتحقق من
ً ً
برنامجا بعدئذٍ
ً
مألوفة لديك مم ا ً
صحيحا ،وستصبح آنذاك طريقة إنشاء برامج بايثون وتنفيذها عمل البيئة عماًل
ِّ
يمهد الطريق لكتابة وتنفيذ مشاريع بايثون الالحقة.
اخ تر مم ا يلي القس م الخ اص بنظ ام تش غيل حاس وبك (حاولن ا ش مل أش هر أنظم ة التش غيل،
لينكس وويندوز وماك) وانتقل إليه التباع الخطوات الالزمة لتنفيذ ما سبق.
ويندوز •
لينكس •
أوبنتو ◦
دبيان ◦
سينتوس ◦
ماك •
.1ويندوز
خطوة بخطوة إلى كيفية تثبيت بايثون 3في ويندوز ،10وتثبيت بيئة
ً رش ُدك هذا القسم
سي ِ
ُ
(.)administrative access
سنجري معظم أطوار التثبيت واإلعدادات عبر سطر األوامر ،والذي ه و طريق ٌة غ يرُ رس وميةٍ
للتعام ل م ع الحاس وب ،فب داًل من الض غط على األزرار ،س تكتب ًّ
نص ا وتعطي ه للحاس وب لينف ذه،
ً
أيضا .يمكن أن يساعدك سطر األوامر على تعديل أو أتمتة مختلف المه ام نصيا
ً ً
ناتجا ظهر لك
وسي ِ
ُ
ٌ
أساسية لمطوري البرمجيات. ٌ
أداة يوميا ،وهو
ً التي تنجزها على الحاسوب
PowerShellهي برن امج من ميكروس وفت ي وفر واجه ة س طر األوام ر .يمكن إج راء المه ام
من اإلط ار .NETيمكنه ا تنفي ذ العملي اتُ .جعِ لت PowerShellمفتوح ة المص در من ذ أغس طس
،2016وصارت متوفرة اآلن عبر ويندوز وأنظمة يونكس (بما في ذلك ماك ولينكس).
س تعثر على PowerShellب النقر األيمن على أيقون ة Startفي ال ركن األيس ر الس فلي من
الشاش ة .عن دما تنبث ق القائم ة ،انق ر على " ،"Searchثم اكتب " "PowerShellفي ش ريط البحث.
عند تقديم خيارات لك ،انقر بالزر األيمن على تطبيق سطح المكتب "."Windows PowerShell
?Do you want to allow this app to make changes to your PC
انقر على " ."Yesبمجرد إتمام ذلك ،سترى واجهة نصية تبدو كما يلي:
~ cd
لمتابع ة عملي ة التث بيت ،س نع ّد بعض األذون ات من خالل .PowerShellتم إع داد
ً
أمانا بشكل افتراضي. PowerShellلتعمل في الوضع األكثر
هناك عدة مستويات لألذونات ،والتي يمكنك إعدادها بوصفك مدي ًرا (:)administrator
:Restrictedيمث ل سياس ة التنفي ذ االفتراض ية ،وبم وجب ه ذا الوض ع ،لن تتمكن من •
ًة (أي ً
دفة تفاعلي فها ص تعمل PowerShellبوص كربتات ،وس ذ الس تنفي
)interactive shellوحسب.
وقع ة من قب ل جه ة ِّ
سيمكنك من تنفيذ جميع السكربتات وملفات اإلعداد المُ َّ :AllSigned •
موثوق ة ،مم ا يع ني أن ه من المحتم ل أن ُتع ِّرض جه ازك لخط ر تنفي ذ س كربتات ض ارة إن
َّ
موقعة من جهة غير موثوقة. كانت
:Unrestrictedتس مح بتنفي ذ جمي ع الس كربتات وملف ات اإلع داد المُ َّ
نزل ة من الش بكة •
نز ٌ
ل من الش بكة .في ه ذه الحال ة ،التوقيع ات الرقمي ة أن المل ف ُم َّ بمجرد تأكي د َّ
أنك ت درك ّ
غير الزمة ،مما يعني أ َن ه من المحتمل تعريض جهازك لخطر تنفيذ سكربتات غير موثوق ة
منزلة من الشبكة قد تكون ضارة.
سنس تخدم سياس ة التنفي ذ RemoteSignedلتع يين اإلذن للمس تخدم الح الي ،وهك ذا
،RemoteSignedفسنكتب:
RemoteSigned
اكتب الح رف yالختي ار "نعم" ،واعتم اد التغي يرات .يمكنن ا التحق ق من نج اح العملي ة عن طري ق
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine Undefined
أن المس تخدم الح الي يمكن ه تنفي ذ الس كربتات الموثوق ة ال تي ِّ
نُزلت من الش بكة. ه ذا يؤك د َّ
يمكننا اآلن تنزيل الملفات التي سنحتاج إليها إلعداد بيئة برمجة بايثون.
أتمت ة عملي ات التث بيت ،بم ا في ذل ك التث بيت األولي لل برامج ،وترقيته ا ،وإع دادها ،وإزالته ا
عند الحاجة.
تحف ظ ه ذه األدوات التثبيت ات في موق ع مرك زي ،ويمكنه ا ص يانة جمي ع ح زم ال برامج على
يع د Chocolateyم دير ح زم مفت وح المص در يعم ل من س طر األوام ر ،ص ِّمم لنظ ام وين دوز،
. ويمكنه مس اعدتك على تث بيت التطبيق ات واألدوات بس رعة، الخاص بلينكسapt-get وتحاكي
سننش ئ. في ناف ذة الطرفي ةChocolatey لتنزي ل وع رض الس كربت.NET سنستخدم إط ار العم ل
في$ (يمكن ك تس ميته كم ا تري د طالم ا ستس تخدم المح رف$script يُ س مىWebClient كائ ًن ا
دعن ا نلقي نظ رة على الخي ارات المتاح ة لن ا من خالل توص يل الك ائن إلى الص نف
$script | Get-Member
. . .
DownloadFileAsync Method void DownloadFileAsync(uri
address, string fileName), void DownloadFileAsync(ur...
DownloadFileTaskAsync Method System.Threading.Tasks.Task
DownloadFileTaskAsync(string address, string fileNa...
DownloadString Method string DownloadString(string
address), string DownloadString(uri address) # هذا التابع
DownloadStringAsync Method void DownloadStringAsync(uri
address), void DownloadStringAsync(uri address, Sy...
DownloadStringTaskAsync Method
System.Threading.Tasks.Task[string]
DownloadStringTaskAsync(string address), Sy…
. . .
▲ | 33
البرمجة بلغة بايثون تثبيت بايثون وإعداد بيئة العمل
عن د النظ ر إلى المخرج ات ،يمكنن ا تحدي د الت ابع DownloadStringال ذي يمكنن ا اس تخدامه
)"$script.DownloadString("https://chocolatey.org/install.ps1
بعد مطالعة السكربت ،يمكننا تثبيت Chocolateyعن طريق كتابة ما يلي في :PowerShell
الش بكة .س يؤدي ه ذا إلى تمري ر الس كربت إلى iexأو ،Invoke-Expressionوال ذي س ينفذ
اسمح لبرنامج PowerShellبتث بيت .Chocolateyبمج رد تثبيت ه بالكام ل ،يمكنن ا الب دء في
بعد تثبيت مدير الحزم ،يمكننا متابعة تثبيت ما نحتاجه لبيئة البرمجة خاصتنا.
استخدامه لكتابة البرامج مباشرة داخل .PowerShellه ذه ليس ت خط وة إلزامي ة ،إذ يمكن ك ب دال
من ذلك استخدام محرر نص وص بواجه ة مس تخدم رس ومية مث ل ،Notepadلكن م يزة nanoأنه
س ُي ِّ
عودك على اس تخدام .PowerShellدعن ا نس تخدم Chocolateyلتث بيت nanoوذل ك بتنفي ذ
األمر التالي:
،nanoسنكون قادرين على استخدام األمر nanoإلنشاء ملف ات نص ية جدي دة ،وسنس تخدمه بع د
س تثبِّت PowerShellاآلن ب ايثون ،3م ع ع رض بعض المخرج ات أثن اء العملي ة .بع د اكتم ال
بعد االنتهاء من التث بيت ،س تحتاج إلى التحق ق من تث بيت ب ايثون وجهوزيته ا للعم ل .لرؤي ة
التغي يرات ،اس تخدم األم ر refreshenvأو أغل ق PowerShellثم أع د فتحه ا بص الحيات م دير
python -V
المثبت.
َّ ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون
Python 3.7.0
ٌ
أداة تعم ل م ع لغ ة ب ايثون ُت َثبِّ ت وت دير الح زم س نثبِّ ت األداة ،pipإلى ج انب ب ايثون ،وهي
البرمجي ة ال تي ق د نحت اج إلى اس تخدامها في تط وير مش اريعنا (س نتعلم المزي د عن الوح دات
المخصص للوحدات).
َّ والحزم التي يمكنك تثبيتها باألداة pipفي الفصل
ِّ
سنحدث pipعبر األمر التالي:
الوحدة كأنها سكربت ،وإنهاء قائمة الخيارات ،ومن ثمَّ نستخدم pipلتثبيت اإلصدار األحدث.
بع د تث بيت ب ايثون وتح ديث ،pipفنحن ج اهزون إلع داد بيئ ة افتراض ية لمش اريع
التطوير خاصتنا.
اآلن بع د تث بيت Chocolateyو nanoوب ايثون ،يمكنن ا المض ي ق دمً ا إلنش اء بيئ ة البرمج ة
ُت ِّ
مكن ك البيئ ات االفتراض ية من إنش اء مس احة معزول ة في حاس وبك مخصص ة لمش اريع
دارات
ٍ ي ِّ
وفر لن ا ض بط بيئ ةٍ برمجي ةٍ تحكمً ا أك بر بمش اريع ب ايثون ،وإمكاني ة التعام ل م ع إص
مختلفةٍ من حزم بايثون .وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
أي ع ددٍ تش اء من البيئ ات االفتراض َّية ،وك ل بيئ ة س تكون ممثل ة بمجل د في
يمكن ك ض بط ِّ
اختر المجلد الذي تريد أن تضع فيه بيئات ب ايثون ،أو يمكن ك إنش اء مجل د جدي د باس تخدام
mkdir environments
cd environments
َ
انتقلت إلى المجلد الذي تريد احت واء البيئ ات في ه ،تس تطيع اآلن إنش اء بيئ ة جدي دة بعد أن
س ِّ
ننفذ باس تخدام األم ر pythonالوح دة venvإلنش اء البيئ ة االفتراض ية ال تي أطلقن ا عليه ا
ستنش ئ venvمجل ًدا جدي ًدا يحت وي على بعض العناص ر ال تي يمكن عرض ها باس تخدام
األمر :ls
ls my_env
تعم ل ه ذه الملف ات م ع بعض ها لض مان أن تك ون مش اريعك معزول ٌة عن س ياق اآلل ة المحلي ة،
لكي ال تختلط ملفات النظ ام م ع ملف ات المش اريع .وه ذا أم رٌ حس ٌن إلدارة اإلص دارات ولض مان َّ
أن
عليك تفعيل البيئة الستخدامها ،وذلك بكتاب ة األم ر الت الي ال ذي س ُي ِّ
نفذ س كربت التفعي ل في
المجلد :Scripts
my_env\Scripts\activate
ٌ
ابقة ( )prefixفي المِ َحث ( )promptوال تي هي اس م البيئ ة يجب أن تظه ر اآلن س
>(my_env) PS C:\Users\Sammy\Environments
ِ
لننش ئ برنامج ا بس يطا يع رض العب ارة «مرحب ا بع د أن أكملن ا ض بط بيئتن ا االفتراض ية،
أن البيئ ة تعم ل بالش كل الص حيح ،ولكي تتع وَّ د على إنش اء ب رامج
بالع الم!» ،وبه ذا س نتحقق من َّ
)"!print("Hello, World
أغلق محرر nanoبالضغط على Ctrl+xثم اضغط على yعندما يسألك عن حفظ الملف.
بعد أن يُ َ
غلق المُ ِّ
حرر nanoوتعود إلى سطر األوامر ،حاول تنفيذ البرنامج:
َ
أنشأته إلى طباعة الناتج التالي في الطرفية: سيؤدي برنامج hello.pyالذي
!Hello, World
للخروج من البيئة ،اكتب األمر deactivateوستعود إلى مجلدك األص لي .ح ان اآلن ال وقت
للتعم ق بلغ ة ب ايثون وإنش اء ب رامج رائع ة! انتق ل إلى الفص ل الت الي ،اس تخدام س طر أوام ر
بايثون التفاعلي.
.2أوبنتو
وة بخط وة إلى كيفي ة تث بيت ب ايثون 3على خ ادم أوبنت و ،20.04
رش ُدك ه ذا القس م خط ً
سي ِ
ُ
البرمجة على الخوادم لها العديد من الميزات ،كما تدعم المشاريع التعاونية.
أن ه ذا القس م يش رح عملي ة التث بيت على خ ادم أوبنت و ،20.04إال َّ
أن المف اهيم حيح َّ
ٌ ص
األساسية فيه تنطبق على جميع توزيعات دبيان لينكس (.)Debian Linux
يجب أن تملك ص الحيات مس تخدم غ ير ج ذري ( ) non-root userم ع امتي ازات sudoعلى
خ ادم أوبنت و .20.04إذا لم تكن ل ك خ برة في التعام ل م ع بيئ ة الناف ذة الطرفي ة ،فيمكن ك مطالع ة
مثبت ة مس ً
بقا. َّ في أوبنتو 20.04واإلصدارات األخ رى من دبي ان لينكس ،س تجد أن ب ايثون 3
األمر aptللعمل مع أداة التحزيم المتقدمة من أوبنتو ( :)Ubuntu’s Advanced Packaging Tool
تأكي د ذل ك عن د تح ديث النظ ام وذل ك اعتم ا ًدا على الح زم ال تي س ُتح َّدث ،ونس خة نظام ك .بع د
python3 -V
ً
شبيها بما يلي: بناء على النسخة المثبتة في توزيعتك ،لكن يجب أن يكون
ً الرقم
Python 3.8.2
ٌ
أداة تعم ل م ع لغ ة ب ايثون ُت َثبِّت إلدارة الحزم البرمجي ة الخاص ة بب ايثون ،س نثبِّ ت ،pipوهي
وتدير الح زم البرمجي ة ال تي ق د نحت اج إلى اس تخدامها في تط وير مش اريعنا (س نتعلم المزي د عن
المخصص للوحدات):
َّ الوحدات والحزم التي يمكنك تثبيتها باألداة pipفي الفصل
بع د أن انتهين ا من ض بط ب ايثون وتث بيت ،pipيمكنن ا اآلن إنش اء «بيئ ة افتراض ية»
ُت ِّ
مك نك البيئات االفتراضية من إنشاء مساحة معزولة في خادمك مخصصة لمشاريع ب ايثون،
دارات
ٍ ي ِّ
وفر لن ا ض بط بيئ ةٍ برمجي ةٍ تحكمً ا أك بر بمش اريع ب ايثون ،وإمكاني ة التعام ل م ع إص
مختلفةٍ من حزم بايثون .وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
أي ع ددٍ تش اء من البيئ ات االفتراض ية ،وك ل بيئ ة س تكون ممثل ة بمجل د في
يمكن ك ض بط ُّ
هناك عدة طرق إلعداد بيئة برمجية في بايثون ،لكننا سنس تخدم وح دة ( )moduleبرمجي ة
زء من مكتب ة ب ايثون 3القياس ية .س نثبِّت venvعلى نظامن ا بتنفي ذ
باس م ،venvوهي ج ٌ
األمر التالي:
بعد إتمام التثبيت ،فنحن جاهزون إلنشاء البيئ ات االفتراض ية ،يمكنن ا اآلن إمَّ ا اختي ار مجل د
نضع فيه بيئات بايثون ،أو إنشاء مجلد جديد باستخدام األمر mkdirكما يلي:
mkdir environments
cd environments
َ
انتقلت إلى المجلد الذي تريد احت واء البيئ ات في ه ،تس تطيع اآلن إنش اء بيئ ة جدي دة بعد أن
نش ئ األم ر pyvenvمجل ًدا جدي ًدا في ه بعض الملف ات ال تي يمكن عرض ها باس تخدام
سي ِ
ُ
األمر :ls
ls my_env
لكي ال تختلط ملفات النظ ام م ع ملف ات المش اريع .وه ذا أم رٌ حس ٌن إلدارة اإلص دارات ولض مان َّ
أن
ً
أيض ا ،Python Wheelsوال تي هي الحزم ال تي يحت اج إليه ا .تت وافر
ٍ كل مشروع يملك وصواًل إلى
زم مبني ة ( )built-package formatلب ايثون ،وال تي يمكن أن ُتس ِّرع من تط وير ال برامج
ص يغة ح ٍ
ٌ
ودة في بتقلي ل ع دد الم رات ال تي تحت اج فيه ا إلى تص ريف ( )compileالمش روع ،وهي موج
سي ِّ
نفذ سكربت التفعيل: عليك تفعيل البيئة الستخدامها ،وذلك بكتابة األمر التالي الذي ُ
source my_env/bin/activate
ٌ
ابقة ( )prefixفي المِ حث ( )promptوال تي هي اس م البيئ ة يجب أن تظه ر اآلن س
ً
مختلف ا في توزيع ة المستخدمة ،وفي حالتنا هذه يكون اس مها ،my_envوق د يك ون مظه ر المِ َحث
دبي ان ،وذل ك اعتم ا ًدا على اإلص دار المس تخدم؛ لكن يجب أن تش اهد اس م البيئ ة بين قوس ين في
بداية السطر:
(my_env) sammy@ubuntu:~/environments$
ً
جاهزة لالستخدام بعد اتباعك للخطوات السابقة. يجب أن تكون بيئتك االفتراضية
مالحظة :يمكنك داخل البيئة االفتراضية أن تستخدم األمر pythonبداًل من python3واألمر pipب داًل من
كنت تس تخدم ب ايثون 3خ ارج البيئ ة االفتراض َّية ،فيجب علي ك حينه ا اس تخدام
َ إن ش َ.
ئت أم ا إذا pip3
python3و pip3حصرًا.
ِ
لننش ئ برنامج ا بس يطا يع رض العب ارة بع د أن أكملن ا ض بط بيئتن ا االفتراض ية،
أن البيئ ة تعم ل بالش كل الص حيح ،ولكي تتع وَّ د على إنش اء َّ
َتحقق من َّ
«! ،»Hello Worldوبهذا س ن
علينا أواًل تشغيل محرر ملفات نصية إلنشاء ملف جديد ،وليكن المُ ِّ
حرر nanoالذي يعمل من
سطر األوامر:
)"!print("Hello World
أغلق محرر nanoبالضغط على Ctrl+xثم اضغط على yعندما يسألك عن حفظ المل ف .بع د
أن يُ َ
غلق المحرر nanoوتعود إلى سطر األوامر ،حاول تنفيذ البرنامج:
َ
أنشأته إلى طباعة الناتج اآلتي في الطرفية: سيؤدي برنامج hello.pyالذي
!Hello World
ضبطت اآلن بيئة تطوير للغة بايثون 3على خادم أوبنتو ،وح ان ال وقت للتعم ق
َ تهانينا! لقد
بلغة بايثون وإنشاء برامج رائعة! انتقل إلى الفصل التالي ،استخدام سطر أوامر بايثون التفاعلي.
.3دبيان
وة بخط وة إلى كيفي ة تث بيت ب ايثون 3على لينكس ،وتث بيت بيئ ة
رش ُدك ه ذا القس م خط ً
سي ِ
ُ
المفاهيم األساسية فيه تنطبق على جميع توزيعات دبيان لينكس (.)Debian Linux
يجب أن تمل ك ص الحيات مس تخدم غ ير ج ذري ( )non-root userم ع امتي ازات sudoعلى
إذا لم تكن ل ك خ برة في التعام ل م ع بيئ ة الناف ذة الطرفي ة ،فيمكن ك مطالع ة المق ال
ظهر ل ك ِّ الحاس وب ،فب داًل من الض غط على األزرار ،س تكتب ًّ
نص ا وتعطي ه للحاس وب لينفذه ،وس ُي ِ
ً
أيضا .يمكن أن يساعدك سطر األوامر على تعديل أو أتمتة مختلف المهام التي تنجزه ا نصيا
ً ً
ناتجا
أداة أساس ٌ
ية لمط وري البرمجي ات ،وهنال ك الكث ير من األوام ر ال تي ٌ على الحاس وب يومي ا ،وه و
علي ك تعلمه ا لكي تتمكن من االس تفادة من ه .هنال ك مق االت في أكاديمي ة حس وب (مث ل مق ال
م دخل إلى طرفي ة لينكس )Linux Terminalس تعلمك أساس يات س طر األوام ر ،وهنال ك كت اب
«سطر أوامر لينكس» الذي يُ ع ُّد مرجعً ا لطريقة التعامل مع سطر األوامر.
ستجد تط بيق ( Terminalالبرن امج ال ذي تس تعمله للوص ول إلى س طر األوام ر) بفتح القائم ة
في الزاوية السفلى اليسرى من الشاشة ثم كتاب ة « »terminalفي ش ريط البحث ،ثم الض غط على
أيقون ة التط بيق ال تي س تظهر بعدئ ذٍ .أو يمكن ك أن تض غط على Ctrl+Alt+Tفي لوح ة المف اتيح
األمر :apt
تأكيد ذلك عند تحديث النظام وذلك اعتما ًدا على الحزم التي ُ
ستح َّدث ،ونسخة لينكس.
python3 -V
ً
شبيها بما يلي: المثبتة في توزيعتك ،لكن يجب أن يكون
َّ بناء على النسخة
ً الرقم
Python 3.7.3
ٌ
أداة تعم ل م ع لغ ة ب ايثون ُت َثبِّت إلدارة الحزم البرمجي ة الخاص ة بب ايثون ،س نثبِّ ت ،pipوهي
وتدير الحزم البرمجية ال تي ق د نحت اج إلى اس تخدامها في تط وير مش اريعنا (س نتعلم المزي د عن
المخصص للوحدات):
َّ الوحدات والحزم التي يمكنك تثبيتها باألداة pipفي الفصل
َ
شئت تنزي ل NumPyفيمكن ك تنفي ذ لتطوير الويب ،أو NumPyإلجراء الحسابات العلمية؛ لذا ،إن
بع د أن انتهين ا من ض بط ب ايثون وتث بيت ،pipيمكنن ا اآلن إنش اء «بيئ ة افتراض ية»
ُت ِّ
مكن ك البيئ ات االفتراض ية من إنش اء مس احة معزول ة في حاس وبك مخصص ة لمش اريع
دارات
ٍ وإمكانية التعام ل م ع إص ي ِّ
وفر لن ا ض بط بيئ ةٍ برمجي ةٍ تحكم ا أك بر بمش اريع ب ايثون،
َّ
مختلفةٍ من حزم بايثون .وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
أي ع ددٍ تش اء من البيئ ات االفتراض ية ،وك ل بيئ ة س تكون ممثل ة بمجل د في
يمكن ك ض بط ُّ
هناك عدة طرق إلعداد بيئة برمجية في بايثون ،لكننا سنس تخدم وح دة ( )moduleبرمجي ة
بعد إتمام التثبيت ،فنحن جاهزون إلنشاء البيئ ات االفتراض ية ،يمكنن ا اآلن إمَّ ا اختي ار مجل د
نضع فيه بيئات بايثون ،أو إنشاء مجلد جديد باستخدام األمر mkdirكما يلي:
mkdir environments
cd environments
َ
انتقلت إلى المجلد الذي تريد احت واء البيئ ات في ه ،تس تطيع اآلن إنش اء بيئ ة جدي دة بعد أن
نش ئ األم ر pyvenvمجل ًدا جدي ًدا في ه بعض الملف ات ال تي يمكن عرض ها باس تخدام
سي ِ
ُ
األمر :ls
ls my_env
لكي ال تختلط ملفات النظ ام م ع ملف ات المش اريع .وه ذا أم رٌ حس ٌن إلدارة اإلص دارات ولض مان َّ
أن
ً
أيض ا ،Python Wheelsوال تي هي الحزم ال تي يحت اج إليه ا .تت وافر
ٍ كل مشروع يملك وصواًل إلى
زم (مث ل )built-package formatلب ايثون ،وال تي يمكن أن ُتس ِّرع من تط وير
ص يغة بن اء ح ٍ
ٌ
ودة ال برامج بتقلي ل ع دد الم رات ال تي تحت اج فيه ا إلى تص ريف ( )compileالمش روع ،وهي موج
سي ِّ
نفذ سكربت التفعيل: عليك تفعيل البيئة الستخدامها ،وذلك بكتابة األمر التالي الذي ُ
source my_env/bin/activate
ٌ
ابقة ( )prefixفي المِ حث ( )promptوال تي هي اس م البيئ ة يجب أن تظه ر اآلن س
ً
مختلف ا في توزيع ة المستخدمة ،وفي حالتنا هذه يكون اس مها ،my_envوق د يك ون مظه ر المِ َحث
دبي ان ،وذل ك اعتم ا ًدا على اإلص دار المس تخدم؛ لكن يجب أن تش اهد اس م البيئ ة بين قوس ين في
بداية السطر:
(my_env) sammy@sammy:~/environments$
ً
جاهزة لالستخدام بعد اتباعك للخطوات السابقة. يجب أن تكون بيئتك االفتراضية
مالحظة :يمكنك داخل البيئة االفتراضية أن تستخدم األمر pythonبداًل من python3واألمر pipب داًل من
كنت تس تخدم ب ايثون 3خ ارج البيئ ة االفتراض ية ،فيجب علي ك حينه ا اس تخدام
َ إن ش َ.
ئت أم ا إذا pip3
python3و pip3حصرًا.
برنامجا بس ً
يطا يع رض العب ارة «مرحب ا بالع الم!»، ً ِ
لننشئ االفتراضية،
َّ بعد إكمال ضبط بيئتنا
أن البيئ ة تعم ل بالش كل الص حيح ،ولكي تتع وّ د على إنش اء ب رامج ب ايثون إن
وبه ذا س نتحقق من َّ
علينا أواًل تشغيل محرر ملفات نصية إلنشاء ملف جديد ،وليكن المحرر nanoالذي يعمل من
سطر األوامر:
)"!print("Hello, World
أغلق محرر nanoبالضغط على Ctrl+xثم اضغط على yعندما يسألك عن حفظ الملف.
بعد أن يُ َ
غلق المحرر nanoوتعود إلى سطر األوامر ،حاول تنفيذ البرنامج:
َ
أنشأته إلى طباعة الناتج التالي في الطرفية: سيؤدي برنامج hello.pyالذي
!Hello, World
تطوير للغة بايثون 3في نظام لينكس دبيان ،ح ان اآلن ال وقت
ٍ َ
ضبطت اآلن بيئة تهانينا! لقد
للتعم ق بلغ ة ب ايثون وإنش اء ب رامج رائع ة! انتق ل إلى الفص ل الت الي ،اس تخدام س طر أوام ر
بايثون التفاعلي.
CentOS .4
وة بخط وة إلى كيفي ة تث بيت ب ايثون 3على ،CentOS 8وتث بيت
رش ُدك ه ذا القس م خط ً
سي ِ
ُ
إذا لم تكن ل ك خ برة في التعام ل م ع بيئ ة الناف ذة الطرفي ة ،فيمكن ك مطالع ة المق ال
واجهة مس تخدم رس ومية ( ،)GUIفيمكن ك ال دخول إلى س طر األوام ر بفتح القائم ة ،وال دخول إلى
كتاب «سطر أوامر لينكس» الذي يُ ع ُّد مرجعً ا لطريقة التعامل مع سطر األوامر.
ارة ار للعب در ( DNFاختص ة المص زم مفتوح تخدم أداة إدارة الح سنس
Dandified YUMوه و الجي ل الث اني من م دير الح زم Yellowdog Updater, Modifiedالمع روف
باالختصار .)YUMهذه أداة شائعة االستخدام إلدارة الحزم على أنظمة لينكس المس تندة إلى Red
،Hatمثل ،CentOSإذ تتيح لك تثبيت الحزم وتحديثها بسهولة ،وكذلك إزالة الحزم من الجهاز.
تنفيذ األمر.
يرك ز على الثب ات واالس تقرار .أي لن تج د في ه ذا النظ ام إال اإلص دارات المس تقرة والمُ خت برة من
ستجد أحدث إص دار من التطبيقات والحزم القابلة للتنزيل ،لذلك وباستعمال مدير حزم CentOS
بعد إكمال العملية ،يمكننا التحقق من نجاح عملية التثبيت بطلب إصدار بايثون بكتابة:
python3 -V
ً
شبيها بما يلي: بناء على النسخة المثبتة في توزيعتك ،لكن يجب أن يكون
ً الرقم
Python 3.6.8
ً
انطالق ا من سنثبِّ ت ً
تاليا أدوات تطوير CentOSال تي تس مح ل ك ببن اء التطبيق ات وتص ريفها
شيفرتها المصدرية:
ننتق ل بع د اكتم ال التث بيت للخط وة التالي ة وهي ض بط وإع داد بيئ ة تطويري ة لكتاب ة ب رامج
بايثون وتنفيذها.
ثبتن ا ب ايثون وأع ددنا النظ ام ،يمكنن ا المض ي ق دمً ا إلنش اء بيئ ة البرمج ة ال تي
اآلن بع د أن َّ
دارات
ٍ وإمكانية التعام ل م ع إص ي ِّ
وفر لن ا ض بط بيئ ةٍ برمجي ةٍ تحكمً ا أك بر بمش اريع ب ايثون،
َّ
مختلفةٍ من حزم بايثون .وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
أي ع ددٍ تش اء من البيئ ات االفتراض َّية ،وك ل بيئ ة س تكون ممثل ة بمجل د في
يمكن ك ض بط ِّ
بعد إتمام التثبيت ،فنحن جاهزون إلنشاء البيئات االفتراض ية ،يمكنن ا اآلن إم ا اختي ار مجل د
نضع فيه بيئات بايثون ،أو إنشاء مجلد جديد باستخدام األمر mkdirكما يلي:
mkdir environments
cd environments
َ
انتقلت إلى المجلد الذي تريد احت واء البيئ ات في ه ،تس تطيع اآلن إنش اء بيئ ة جدي دة بعد أن
يناسب المشروع.
نش ئ األم ر pyvenvمجل ًدا جدي ًدا في ه بعض الملف ات ال تي يمكن عرض ها باس تخدام
سي ِ
ُ
األمر :ls
ls my_env
لكي ال تختلط ملفات النظ ام م ع ملف ات المش اريع .وه ذا أم رٌ حس ٌن إلدارة اإلص دارات ولض مان َّ
أن
سي ِّ
نفذ سكربت التفعيل: عليك تفعيل البيئة الستخدامها ،وذلك بكتابة األمر التالي الذي ُ
source my_env/bin/activate
ٌ
ابقة ( )prefixفي المِ حث ( )promptوال تي هي اس م البيئ ة يجب أن تظه ر اآلن س
وإدارتها في بيئتنا البرمجية السابقة ،فيمكننا تثبيت أي حزمة بتنفيذ األمر التالي:
المخصص ة لتط وير ال ويب أو NumPyالحزم ة المخصص ة إلج راء الحس ابات الرياض ية المتقدم ة،
فإذا أردت تثبيت الحزمة األخيرة ،يمكنك ببساطة تنفيذ األمر .pip install numpy
ً
جاهزة لالستخدام بعد اتباعك للخطوات السابقة. يجب أن تكون بيئتك االفتراضية
مالحظة :يمكنك داخل البيئة االفتراضية أن تستخدم األمر pythonب داًل من python3.6واألم ر pipب داًل
كنت تس تخدم ب ايثون 3خ ارج البيئ ة االفتراض ية ،فيجب علي ك حينه ا اس تخدام
َ إن ش َ.
ئت أم ا إذا من pip3.6
python3.6و pip3.6حصرًا.
ً
يطا يع رض العب ارة ً
برنامج ا بس ِ
لننش ئ بع د أن أكملن ا ض بط بيئتن ا االفتراض ية،
أن البيئ ة تعم ل بالش كل الص حيح ،ولكي تتع وَّ د على إنش اء َّ
نتحقق من َّ «مرحبا بالع الم!» ،وبه ذا س
علينا أواًل تشغيل محرر ملفات نصية إلنشاء ملف جديد ،وليكن المحرر :vi
بع د فتح المل ف في ناف ذة الطرفي ة ،اكتب الح رف iلل دخول إلى وض ع اإلدراج
)"!print("Hello, World
الملف وإغالقه.
َ
أنشأته إلى طباعة الناتج التالي في الطرفية: سيؤدي برنامج hello.pyالذي
!Hello, World
بلغة بايثون وإنشاء برامج رائعة! انتقل إلى الفصل التالي ،استخدام سطر أوامر بايثون التفاعلي.
macOS .5
وة بخط وة إلى كيفي ة تث بيت ب ايثون 3في ،macOSوتث بيت بيئ ة
رش ُدك ه ذا القس م خط ً
سي ِ
ُ
يجب أن تمل ك جه ً
ازا علي ه نظ ام macOSمتص ل بالش بكة م ع ص الحيات م دير
(.)administrative access
إذا لم تكن ل ك خ برة في التعام ل م ع بيئ ة الناف ذة الطرفي ة ،فيمكن ك مطالع ة المق ال
سنجري معظم أطوار التثبيت واإلعدادات عبر سطر األوامر ،والذي ه و طريق ٌة غ يرُ رس وميةٍ
للتعام ل م ع الحاس وب ،فب داًل من الض غط على األزرار ،س تكتب ًّ
نص ا وتعطي ه للحاس وب لينف ذه،
ً
أيضا .يمكن أن يساعدك سطر األوامر على تعديل أو أتمتة مختلف المه ام نصيا
ً ً
ناتجا ظهر لك
وسي ِ
ُ
ٌ
أساسية لمطوري البرمجيات. ٌ
أداة يوميا ،وهو
ً التي تنجزها على الحاسوب
طرفي ة م اك ( )macOS Terminalهي تط بيق يمكن ك اس تخدامه لل دخول إلى واجه ة س طر
األوام ر .مث ل التطبيق ات األخ رى ،س تجد تط بيق الطرفي ة بال ذهاب إلى ،Finderوفتح المجل د
،Applicationsثم ال ذهاب إلى المجل د ،Utilitiesثم النق ر الم زدوج على Terminalلفتح ه .أو
هنالك الكثير من األوامر التي عليك تعلمها لكي تتمكن من االستفادة منه .هنال ك مق االت في
Xcodeهي بيئ ة تط وير متكامل ة ( )IDEتت ألف من أدوات تط وير ال برامج لنظ ام التش غيل
ً
سلفا .للتحقق من ذلك ،اكتب في نافذة الطرفية ما يلي: .MacOSقد يكون Xcodeمثب ًتا عندك
xcode-select -p
/Library/Developer/CommandLineTools
االفتراضية.
َّ إن تلقيت خطأ ،فثبِّ ت Xcodeمن المتجر App Storeواعتمد الخيارات
طريق كتابة:
xcode-select --install
عن د ه ذه المرحل ة ،يك ون ق د ثبِّ ت ،Xcodeوالتط بيق Command Line Toolsالخ اص ب ه،
األخ رى ،إال أنه ا ال ت أتي بم دير ح زم جي د .م دير الح زم ( )package managerه و مجموع ة من
أدوات البرمجي ات ال تي تعم ل على أتمت ة عملي ات التث بيت ،بم ا في ذل ك التث بيت األولي لل برامج،
وترقيته ا ،وإع دادها ،وإزالته ا عن د الحاج ة .تحف ظ ه ذه األدوات التثبيت ات في موق ع مرك زي،
ويمكنه ا ص يانة جمي ع ح زم ال برامج على النظ ام وف ق تنس يقات ( )formatsمعروف ة .ت وفر
Homebrewلنظ ام التش غيل macOSنظ ام إدارة ح زم مج اني ومفت وح المص در يبس ط عملي ة
ِّ
يعدل مس ار روبي على جه ازك .يس حب األم ر curl ط ِّور Homebrewع بر روبي ،ل ذلك س
ُ
الس كربت من عن وان URLالمح دد .سيوض ح ذل ك الس كربت م ا س يفعله ،ثم يوق ف العملي ة ليطلب
منك التأكيد .يوفر لك هذا الكثير من المالحظات حول ما سيفعله الس كربت في نظام ك ،ويمنح ك
الح ظ َّ
أنك عن د إدخ ال كلم ة الم رور ،فلن تع رض الطرفي ة المح ارف ال تي تكتبه ا ،ولكنَّه ا
سجل ،بعد إدخال كلمة المرور اضغط على الزر .returnواض غط على الح رف yإن ُطلِب من ك
ست ِّ
ُ
تأكيد التثبيت.
تخ بر الرايت ان -fأو --failالطرفي ة بع دم إعط اء مخرج ات على هيئ ة مس تند HTML •
عند حدوث أخطاء في الخادم.
تطلب الرايتان -Lأو --locationمن curlإع ادة الطلبي ة ( )requestإلى مك ان جدي د •
بأن الصفحة المطلوبة قد ُنقِ لت إلى موقع أخر.
إذا أبلغ الخادم َّ
بمج رد اكتم ال عملي ة التث بيت ،سنض ع مجل د Homebrewفي أعلى متغ ير البيئ ة .PATH
nano ~/.bash_profile
export PATH=/usr/local/bin:$PATH
لحف ظ التغي يرات ،اض غط على المفت اح controlوالح رف oب التزامن ،وعن د مطالبت ك
بالتأكي د ،اض غط على المفت اح .returnيمكن ك اآلن الخ روج من nanoعن طري ق الض غط على
source ~/.bash_profile
أن
ستص ير اآلن التغي يرات ال تي أجريته ا على متغ ير البيئ ة PATHفعال ة .يمكنن ا التحق ق من َّ
brew doctor
إذا لم تكن هناك حاجة إلى أي تحديثات في هذا الوقت ،فستطبع الطرفية ما يلي:
خالف ذلك ،قد تحصل على تنبيه يدعوك إلى تنفيذ أمر آخ ر مث ل brew updateللتأك د من
أن Homebrewمح َّدث .بمجرد أن تصبح Homebrewجاهزة ،يمكنك تثبيت بايثون .3
َّ
األم ر ،brew searchويمكن ك الحص ول على قائم ة الح زم والوح دات ذات العالق ة بب ايثون فق ط
نافذة الطرفية ستخرج قائمة من الحزم والوحدات التي يمكنك تثبيتها على النحو التالي:
سيكون بايثون 3من بين العناصر المدرجة في القائمة .لذلك دعنا نثبِّتها:
الطرفية مالحظات بشأن عملية تثبيت بايثون ،3وقد يستغرق األمر بضع
َّ ستعرض لك نافذة
إلى ج انب ب ايثون ،3س تثبِّ ت Homebrewو pipو setuptoolsو .wheelسنس تخدم ،pip
ٌ
أداة تعم ل م ع ب ايثون ُت َثبِّ ت وت دير الح زم البرمجي ة ال تي ق د نحت اج إلى اس تخدامها في وهي
المخصص للوحدات).
َّ تطوير مشاريعنا (سنتعلم المزيد عن الوحدات والحزم في الفصل الالحق
َ
شئت تنزيل NumPyفيمكن ك تنفي ذ لتطوير الويب ،أو NumPyإلجراء الحسابات العلمية .لذا ،إن
تس ّهل األداة setuptoolsتح زيم مش اريع ب ايثون ،أم ا wheelفهي تنس يق ح زم
( )built-package formatلب ايثون يمكن ه تس ريع إنتاجي ة ال برامج عن طري ق تقلي ل ع دد الم رات
python3 --version
brew update
brew upgrade python3
من الممارسات الجيدة تحديث إصدار بايثون الذي تعمل به من حين آلخر.
اآلن بع د تث بيت Xcodeو Homebrewوب ايثون ،يمكنن ا المض ي ق دمً ا إلنش اء بيئ ة
البرمجة خاصتنا.
ُت ِّ
مكن ك البيئ ات االفتراض ية من إنش اء مس احة معزول ة في حاس وبك مخصص ة لمش اريع
دارات
ٍ ي ِّ
وفر لن ا ض بط بيئ ةٍ برمجي ةٍ تحكمً ا أك بر بمش اريع ب ايثون ،وإمكاني ة التعام ل م ع إص
مختلفةٍ من حزم بايثون .وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
أي ع ددٍ تش اء من البيئ ات االفتراض ية ،وك ل بيئ ة س تكون ممثل ة بمجل د في
يمكن ك ض بط ِّ
اختر المجلد الذي تريد أن تضع فيه بيئات ب ايثون ،أو يمكن ك إنش اء مجل د جدي د باس تخدام
mkdir environments
cd environments
َ
انتقلت إلى المجلد الذي تريد احت واء البيئ ات في ه ،تس تطيع اآلن إنش اء بيئ ة جدي دة بعد أن
نشئ هذا األمر مجل ًدا جدي ًدا (في هذه الحالة يُ سمى )my_envفيه بعض الملفات:
سي ِ
ُ
يشير الملف pyvenv.cfgإلى توزيعة بايثون التي استخدمتها لتنفيذ األمر. •
يحت وي المجل د الف رعي libنس خة من إص دار ب ايثون ،ويحت وي على مجل د يس مى •
سيس تخدم لتخ زين وح دات ً
فارغ ا في البداي ة ،ولكن ه ُ ،site-packagesوالذي س يكون
الطرف الثالث التي ستثبِّتها.
يحت وي المجل د الف رعي binنس خة من رُ قام ة ب ايثون ( )Python binaryجنب ا إلى جنب •
سيستخدم.
مع سكربت التفعيل ( )activate shell scriptالذي ُ
لكي ال تختلط ملفات النظ ام م ع ملف ات المش اريع .وه ذا أم رٌ حس ٌن إلدارة اإلص دارات ولض مان َّ
أن
سي ِّ
نفذ سكربت التفعيل: عليك تفعيل البيئة الستخدامها ،وذلك بكتابة األمر التالي الذي ُ
source my_env/bin/activate
ٌ
ابقة ( )prefixفي المِ حث ( )promptوال تي هي اس م البيئ ة يجب أن تظه ر اآلن س
المس تخدمة ،وفي حالتن ا ه ذه يك ون اس مها ،my_envوه ذا يع ني أنن ا لن سنس تخدم إال إع دادات
ً
جاهزة لالستخدام بعد اتباعك للخطوات السابقة. يجب أن تكون بيئتك االفتراضية
مالحظة :يمكنك داخل البيئة االفتراضية أن تستخدم األمر pythonبداًل من python3واألمر pipب داًل من
كنت تس تخدم ب ايثون 3خ ارج البيئ ة االفتراض ية ،فيجب علي ك حينه ا اس تخدام
َ إن ش َ.
ئت أم ا إذا pip3
ألن pythonو pipستستدعيان إصدارًا قديمً ا من بايثون
python3و pip3حصرًاَّ .
ً
يطا يع رض العب ارة ً
برنامج ا بس ِ
لننش ئ بع د أن أكملن ا ض بط بيئتن ا االفتراض ية،
أن البيئ ة تعم ل بالش كل الص حيح ،ولكي تتع وَّ د على إنش اء
«مرحبا بالع الم!» ،وبه ذا س نتحقق من َّ
علينا أواًل تشغيل محرر ملفات نصية إلنشاء ملف جديد ،وليكن المحرر nanoالذي يعمل من
سطر األوامر:
)"!print("Hello, World
أغلق محرر nanoبالضغط على Ctrl+xثم اضغط على yعندما يسألك عن حفظ الملف.
بعد أن يُ َ
غلق المحرر nanoوتعود إلى سطر األوامر ،حاول تنفيذ البرنامج:
َ
أنشأته إلى طباعة الناتج التالي في الطرفية: سيؤدي برنامج hello.pyالذي
!Hello, World
ً
أيض ا م ترجم ي وفر س طر أوام ر ب ايثون التف اعلي ( ،)Python interactive consoleويس مى
ب ايثون ( )Python interpreterللم برمجين طريق ة س ريعة لتنفي ذ األوام ر ،وتجرب ة أو اختب ار
يمكن الوص ول من خالل س طر األوام ر التف اعلي إلى جمي ع دوال ب ايثون المُ ض مّ نة ،وجمي ع
الستكشاف وتجربة ش يفرات تعليم ات ب ايثون ،والق درة على نس خ الش يفرة البرمجي ة ولص قها في
ملف الشيفرة المصدرية عندما تصبح جاهزة أي بعد تجريبها والتأكد من عملها.
س يتناول ه ذا الفص ل كيفي ة العم ل بس طر األوام ر التف اعلي لب ايثون ،وكيفي ة االس تفادة من ه
التعليم ة ال تي ستس تخدمها عمومً ا لل دخول إلى س طر األوام ر التف اعلي في اإلص دار االفتراض ي
لبايثون هي:
python
إذا أع د َّدت البيئ ة البرمجي ة وجهزته ا وف ق إرش ادات الفص ل الس ابق ،فيمكن ك إنش اء بيئ ة
ِّ
وجهز البيئة الوهمية قبل تنفيذ األوامر التالية): ُتهيِّ ئ البيئة الوهمية بعد ،فعد إلى الفصل السابق
cd environments
. my_env/bin/activate
في مثالن ا الح الي ،اإلص دار االفتراض ي ه و ،Python 3.7.7وال ذي يُ ع رَ ض في المخرج ات
بمجرد إدخال األمر ،إلى جانب إشعار حقوق الملكية ،وبعض األوامر التي يمكن ك كتابته ا للحص ول
>>>
يمكنك استهداف إصدارات محددة من بايثون عن طريق إلح اق رقم اإلص دار ب األمر ،وب دون
ً
أيض ا ال دخول إلى س طر األوام ر التف اعلي باس تخدام االفتراض ي لب ايثون ،2فيمكنن ا
األمر .python2
بالمقاب ل ،يمكنن ا اس تدعاء إص دار ب ايثون 3االفتراض ي باس تخدام األم ر python3فنحص ل
ً
أيضا أن نفتح سطر األوام ر التف اعلي أعاله باس تخدام األم ر .python3.7بع د تش غيل يمكن
يمكننا ،على سبيل المثال ،إنشاء متغيِّ ر وإسناد قيمة له بالشكل التالي:
بمج رد تع يين قيم ة الع دد الص حيح 1868إلى المتغيِّ ر ،birth_yearسنض غط على زر
اإلدخال ونحصل على سطر جديد يبدأ بثالث عالمات "أكبر من" (<<<):
كم ا نفع ل في ملف ات ال برامج النص ية (الس كربتات) ،أنش أنا متغ يرات جدي دة أخ رى وأس ندنا
قيم ًة له ا تناس ب اس مها ،ثم طرحن ا قيم ة متغيِّ ٍر من آخ ر ،وطلبن ا من س طر األوام ر طباع ة المتغ ير
الذي ِّ
يمثل الفرق عبر الدالة )(.print
ً
أيضا استخدام سطر األوامر التفاعلي كآلة حاسبة: يمكنك
تعدد األسطر
ُّ .3
عن دما نكتب ش يفرة متع ددة األس طر ،سيس تخدم الم ترجم أس طر االس تمرارية ،وهي أس طر
مس بوقة بثالث نق اط ...وللخ روج من ه ذا الوض ع ،س تحتاج إلى الض غط على ال زر
ENTERمرتين.
رطية لتحدي د م ا
َّ تعين الش يفرة التالي ة قيم تي متغيِّ رين ،ثم تس تخدم تعليم ة ش
َّ
يجب طباعته:
في هذه الحالة ،يتساوى طوال السلسلتين النصيتين ،لذلك يتم تنفيذ التعليمة .else
الحظ َّ
أنك ستحتاج إلى الحفاظ على مسافة بادئة بايثون ( )Python indentingالمؤلفة من
ٌأ سي َ
طلق خط : أربعة مسافات بيضاء ،وإال ُ
ً
أيض ا إض افة إلى تجرب ة التعليم ات البرمجي ة متع ددة األس طر في س طر األوام ر ،يمكن ك
استيراد الوحدات.
.4استيراد الوحدات
ِّ
متوفرة في بيئ ة معينة ً
سريعة للتحقق مما إذا كانت وحدات ً
طريقة يوفر لك مترجم بايثون
َّ
لتث بيت. متاح ة في بيئ ة البرمج ة الحالي ةmatplotlib لم تكن الوح دة،في الحال ة أعاله
pip وتثبيته ا باس تخدام أداة إدارة الح زم، س تحتاج إلى ت رك الم ترجم التف اعلي،تل ك الوح دة
:مثل العادة
يمكن ك الع ودة إلى، هي وجمي ع تبعياته ا بنج احmatplotlib بمج رد تث بيت الوح دة
:المترجم التفاعلي
▲ | 75
البرمجة بلغة بايثون سطر أوامر بايثون التفاعلي
اختص ار لوح ة المف اتيح ه و CTRL+Dفي أنظم ة *نيكس (أي لينكس وي ونكس) ،أو CTRL+Z
األصلية:
َّ الطرفية
َّ ثم CTRLفي أنظمة ويندوز ،وبذلك ستخرج من سطر األوامر ،وتعود إلى البيئة
...
>>> age_at_death = death_year - birth_year
)>>> print(age_at_death
53
>>>
sammy@ubuntu:~/environments$
ب داًل من ذل ك ،س تنهي الدال ة )( quitس طر األوام ر التف اعلي ،وتعي دك إلى بيئ ة المحط ة
ً
سابقا: الطرفية األصلية التي كنت فيها
في ح ال اس تخدام الدال ة )( ،quitفس ُتؤرَّ خ في مل ف الت اريخ ( ،)history fileبالمقاب ل لن
يُ َّ
سجل اختصار لوحة المفاتيح CTRL+Dذلك:
الملف # /home/sammy/.python_history
...
age_at_death = death_year - birth_year
)print(age_at_death
'octopus = 'Ollie
)(quit
nano ~/.python_history
بمج رد فتح ه باس تخدام مح رر نص وص ،س يبدو مل ف ت أريخ ب ايثون الخ اص ب ك على
هذا النحو:
الملف # /home/sammy/.python_history
import pygame
)(quit
if 10 > 5:
)"print("hello, world
else:
)"print("nope
'sammy = 'Sammy
'shark = 'Shark
...
من خالل تتبع األحداث المُ ؤرَّخة في بايثون ،يمكنك الرجوع إلى األوام ر والتج ارب الس ابقة،
.7خالصة الفصل
سطر األوامر التفاعلي ه و فض ٌ
اء لتجرب ة ش يفرة ب ايثون ،إذ يمكن ك اس تخدامه أداة لالختب ار
تف اعلي داخ ل مل ف ،وس نتحدث عن ذل ك بالتفص يل في الفص ل الالح ق :كيفي ة تنقيح ب ايثون
.1صياغة التعليقات
تبدأ التعليقات السطرية في بايثون بالعالمة #ومسافة بيض اء ،وتس تمر ح تى نهاي ة الس طر.
توض ع في الش يفرة المص درية ليقرأه ا الن اس ،وليس للتنفي ذ .في برن امج " ! "Hello, Worldق د
يجب أن ُتح اذى التعليق ات على نفس المس افة البادئ ة ( )indentللش يفرة ال تي َّ
تعلق عليه ا.
ً
أيض ا ب دون مس افة بادئ ة، أن التعليق ات على دال ة ليس له ا مس افة بادئ ة س تكون هي
بمع نى َّ
وسيكون لكل مستوى من المسافات البادئة التالي ة تعليق ات تتواف ق م ع الش يفرات البرمجي ة ال تي
ِّ
تعلق عليها.
على س بيل المث ال ،الش يفرة التالي ة تع رّ ف الدال ة )( againال تي تس أل المس تخدم إن ك ان
...
تعريف الدالة )( againلسؤال المستخدم #
إن كان يريد استخدام الحاسبة مجددا #
def again():
ُنّ
فذ الدالة )(# calculate إن أدخل المستخدم Yفست
ً
حيحا ،وب التوازي م ع يتع اون مع ه ،على فهم ه .وإذا تع ّذر ص يانة التعليق ات وتح ديثها تح دي ًثا ص
فإن عدم تضمين التعليقات قد يكون أفضل من كتابة تعليق يتناقض مع الشيفرة.
َّ الشيفرة،
يجب أن تجيب التعليق ات عن س ؤال "لم اذا" ب داًل من "م اذا" أو "كي ف"َّ .
ألنه م ا لم تكن
كيف تفعله.
.2التعليقات الكتلية
يمكن اس تخدام التعليق ات الكتلي ة ( )Block Commentsلتوض يح الش يفرات البرمجي ة
َّ
المعقدة ال تي ال تتوق ع أن يك ون الق ارئ على دراي ة به ا .تنطب ق ه ذه التعليق ات الطويل ة على ج زء
من الشيفرة أو جميعها ،كما توضع في نفس مستوى المسافة البادئة للشيفرة.
في التعليقات الكتلية ،يبدأ كل سطر بالعالمة #تليها بمسافة بيضاء واحدة .إذا كنت بحاجة
إلى استخدام أكثر من فقرة واحدة ،فيجب فصلها بسطر يحتوي على عالمة #واحدة.
فيما يلي مثال على كتلة تعليقات تشرح ما يحدث في الدالة )( mainالمعرفة أدناه:
ً
عادة عندما تك ون الش يفرة غ ير واض حة ،وتتطلب ش ً
رحا ش امال. ُتستخ َدم التعليقات الكتلية
يجب أن تتجنب اإلفراط في التعليق على الشيفرة ،ويجب أن تث ق في ق درة الم برمجين اآلخ رين
.3التعليقات السطرية
توضع التعليقات السطرية ( )Inline commentsعلى نفس الس طر ال ذي توج د في ه التعليم ة
ال ينبغي اإلكثار من استخدام التعليقات السطرية ،ولكن عند اس تخدامها في محله ا يمكن أن
س ط ًرا من الش يفرة في المس تقبل ،أو إذا كنت تتع اون م ع ش خص ق د ال يك ون على دراي ة بجمي ع
جوانب الشيفرة.
أن
على سبيل المث ال ،إذا لم يكن هن اك توض يح مس بق ،فق د ال تعلم أنت أو المتع اونون مع ك َّ
الشيفرة التالية تنشئ عد ًدا عِ قديًّ ا ،لذلك قد ترغب في إضافة تعليق مضمَّ ن:
ً
أيض ا اس تخدام التعليق ات الس طريَّ ة لش رح الس بب وراء فع ل ش يء م ا ،أو بعض يمكن
يجب اس تخدام التعليق ات الس طرية عن د الض رورة وحس ب ،كم ا ينبغي أن ت ِّ
وفر إرش ادات
لتعلي ق ج زء من الش يفرة وتعطيل ه أثن اء اختب ار أو تنقيح البرن امج ال ذي تعم ل علي ه .أي عن دما
تواج ه أخط اء بع د إض افة أس طر جدي دة إلى الش يفرة ،فق د ت رغب في تعلي ق بعض ها لمعرف ة
موض ع الخل ل .يمكن أن ي تيح ل ك اس تخدام العالم ة #تجرب ة ب دائل أخ رى أثن اء إع داد الش يفرة.
على س بيل المث ال ،ق د تفاض ل بين اس تخدام الحلق ة whileأو حلق ة forأثن اء برمج ة لعب ة،
import random
# number_of_guesses = 0
for i in range(5):
# while number_of_guesses < 5:
print('Guess a number between 1 and 25:')
guess = input()
guess = int(guess)
# number_of_guesses = number_of_guesses + 1
if guess == number:
break
if guess == number:
print('You guessed the number!')
else:
print('You did not guess the number. The number was ' +
str(number))
▲ | 85
البرمجة بلغة بايثون التعليقات واستخداماتها
مساعدتك على العثور على مكمن الخطأ من خالل التعليق المنهجي لبعض أجزاء البرنامج.
.5خالصة الفصل
واء
سيس اعدك اس تخدام التعليق ات في ب رامج ب ايثون على جع ل برامج ك أك ثر مقروئي ة ،س ً
ِّ
ستسهل تع اون اآلخ رين مع ك في مش اريع لك أو لغيرك .التعليقات المناسبة وذات الصلة والمفيدة
تستخدمها في برنامجك ،أي تعد حاويات للبيانات التي ستتعامل معها في برنامج.
ً
حيحا في سيغطي هذا الفصل بعض أساسيات المتغ يرات ،وكيفي ة اس تخدامها اس تخدامً ا ص
.1فهم المتغيرات
من الناحية الفنية ،يُ َّ
خصص للمتغير مساحة تخزيني ة في ال ذاكرة توض ع القيم ة المرتبط ة ب ه
فيها .يُ ستخدم اسم المتغير لإلشارة إلى تلك القيمة المُ َّ
خزنة في ذاكرة البرنامج التي هي جزء من
ذاكرة الحاسوب .المُ تغيِّ ر أشبه بعنوان ُتلصقه على قيمة مُ َّ
عينة:
من إع ادة كتاب ة ه ذا الع دد الطوي ل ك ل م رة ،ل ذلك سنس تخدم ش يًئ ا يُ س ِّهل ت ُّ
ذكره ،مثل
المتغير :my_int
my_int = 103204934813
ً
أيضا باسم "عالمة المساواة" (=) معامل اإلسناد ،المعروف •
ُأ
القيمة التي س ِن َدت إلى اسم المتغير ()103204934813 •
تش كل ه ذه األج زاء الثالث ة معً ا التعليم ة ال تي ُتس نِد على المتغ ير my_intالقيم ة العددي ة
الصحيحة . 103204934813
اس تخدام ذل ك المتغ ير ب داًل من القيم ة .في ب ايثون ،ال يل زم التص ريح عن المتغيِّ رات قب ل
اس تخدامها كم ا ه و الح ال في بعض لغ ات البرمج ة األخ رى ،إذ يمكن ك الب دء في اس تخدام
ً
مباشرة. المتغير
)print(my_int
والمخرجات هي:
103204934813
اس تخدام المتغ يرات يس هل علين ا إج راء العملي ات الحس ابية .في المث ال الت الي ،سنس تخدم
)print(my_int - 813
وسينتج لنا:
103204934000
في هذا المثال ،يج ري ب ايثون العملي ة الحس ابية ،ويط رح 813من المتغ ير ، my_intويعي د
القيمة .103204934000
يمكن ضبط المتغيرات وجعلها تساوي ناتج عملية حس ابية .دعن ا نجم ع ع ددين معً ا ،ونخ ِّزن
x = 76 + 145
يشبه المثال أعاله إحدى المعادالت التي تراها في كتب الجبر .في الج برُ ،تس تخ َدم الح روف
والرم وز لتمثي ل األع داد والكمي ات داخ ل الص يغ والمع ادالت ،وبش كل مماث ل ،المتغ يرات أس ماء
لنطبع :x
)print(x
والمخرجات:
221
َّ ُأ
ألنه سنِد إلى المتغير xمجموع 76و .145 أعادت بايثون القيمة 221
يمكن أن تحوي المتغيِّ رات أي نوع من أنواع البيانات ،وليس األعداد الصحيحة فقط:
إذا طبعت أيًّ ا من المتغيِّ رات الم ذكورة أعاله ،فس تعيد ب ايثون قيم ة المتغيِّ ر .على س بيل
وسينتج لنا:
لق د مرَّ رن ا القيم ة [' 'item_1و ' 'item_2و ' 'item_3و ' ]'item_4إلى
المتغير ،my_listثم استخدمنا الدالة )( printلطباعة تلك القيمة باستدعاء .my_list
تلك المساحة.
في الحسبان:
يجب أن تكون أسماء المتغيرات من كلمة واحدة فقط (بدون مسافات) •
يجب أن تتكوَّ ن أسماء المتغيرات من األحرف واألرقام والشرطة السفلية (_) فقط •
باتباع القواعد المذكورة أعاله ،دعنا نلقي نظرة على بعض األمثلة:
من األم ور ال تي يجب أخ ذها في الحس بان عن د تس مية المتغ يرات ،ه و َّ
أنه ا حساس ة لحال ة
اس تخدام أس ماء متغيِّ رات متماثل ة لض مان أال يح دث خل ط عن دك أو عن د المتع اونين مع ك ،س واء
أخ يرًا ،ه ذه بعض المالحظ ات ح ول أس لوب التس مية .من المتع ارف علي ه عن د تس مية
المتغيرات أن تبدأ اسم المتغير بحرف ص غير ،وأن تس تخدم الش رطة الس فلية عن د فص ل الكلم ات.
ِّ
يفض ل بعض األش خاص اس تعمال تنس يق س نام الجم ل ً
أيض ا ،وق د الب دء بح رف كب ير مقب ول
أقل شهرة.
الخي ار األهم ال ذي علي ك التمس ك ب ه ه و االتس اق .إذا ب دأت العم ل في مش روع يس تخدم
تنسيق سنام الجمل في تسمية المتغيرات ،فمن األفضل االستمرار في استخدام ذلك التنسيق.
يمكنك مراجعة توثيق تنس يق الش يفرات البرمجي ة في ب ايثون في موس وعة حس وب للمزي د
من التفاصيل.
القدرة على إع ادة إس ناد القيم مفي دة للغاي ة ،إذ ق د تحت اج خالل أط وار برنامج ك إلى قب ول
ً
أيض ا في ال برامج الكب يرة ال تي ق د تحت اج خالله ا إلى سهولة إع ادة إس ناد المتغ يرات مفي دة
ً
صحيحا ،ثم نعيد إسناد سلسلة نصية إليه: س ُنسند إلى المتغير xأواًل عد ًدا
وسينتج لنا:
76
Sammy
يوضح المث ال أعاله أن ه يمكنن ا أواًل إس ناد قيم ة عددي ة إلى المتغ ير ،xثم إع ادة إس ناد قيم ة
نصية إليه.
x = 76
"x = "Sammy
)print(x
Sammy
ق د تك ون إع ادة إس ناد القيم إلى المتغ يرات مفي دة في بعض الح االت ،لكن علي ك أن تبقي
ً
واضحا قدر اإلمكان. عينك على مقروئية الشيفرة ،وأن تحرص على جعل البرنامج
ً
الحق ا ،أو من خالل ً
دة ،وال تي يمكن ك إع ادة إس نادها تهيئ ة ع َّدة متغ يرات دفع ًة واح
مدخالت المستخدم.
يمكن ك من خالل اإلس نادات المتع ددة إس ناد قيم ة واح دة إلى ع َّدة متغ يرات (مث ل المتغ ير
x = y = z = 0
)print(x
)print(y
)print(z
الناتج سيكون:
0
0
0
عرفنا في هذا المثال ثالثة متغيرات ( xو yو ،)zوأسندنا إليها القيمة .0
ً
أيضا بإسناد ع َّدة قيم لع َّدة متغيِّ رات ض من الس طر نفس ه .ه ذه القيم يمكن تسمح لك بايثون
وهذه هي المخرجات:
shark
2.05
15
في المث ال أعالهُ ،أ س ن َدت السلس لة النص ية " "sharkإلى المتغ ير ،jوالع دد العش ري 2.05
إس ناد ع دة متغ يرات بع دة قيم في س طر واح د يمكن أن يختص ر الش يفرة ويقل ل من ع دد
حساباتك .يشير نطاق المتغ ير إلى المواض ع ال تي يمكن الوص ول منه ا إلى المتغيِّ ر داخ ل الش يفرة،
َّ
ألنه ال يمكن الوص ول إلى جمي ع المتغ يرات من جمي ع أج زاء البرن امج ،فبعض المتغ يرات عامة
دئياُ ،تع رَّ ف المتغ يرات العام ة خ ارج ال دوال؛ أمَّ ا المتغ يرات
( ،)globalوبعض ها محلي ( .)localمب ًّ
def var_function():
إنشاء متغير محلي داخل دالة #
"lcl_var = "local
)print(lcl_var
المخرجات الناتجة:
local
global
يُ س نِد البرن امج أعاله سلس لة نص ية إلى المتغ ير العم ومي glb_varخ ارج الدال ة ،ثم يع ِّرف
قيمته .ينتهي البرنامج باستدعاء الدالة )( ،var_functionوطباعة قيمة المتغير .glb_var
لمَّ ا ك ان glb_varمتغ يرًا عامًّ ا ،فيمكنن ا الوص ول إلي ه داخ ل الدال ة )(.var_function
"glb_var = "global
def var_function():
"lcl_var = "local
)print(lcl_var
طباعة glb_varداخل الدالة print(glb_var) #
)(var_function
)print(glb_var
المخرجات:
local
global
global
لقد طبعنا المتغير العام glb_varمرتين ،إذ ُطبع داخل الدالة وخارجها.
"glb_var = "global
def var_function():
"lcl_var = "local
)print(lcl_var
)print(lcl_var
دعنا ننظر إلى مثال آخر ،حيث سنستخدم االسم نفسه لمتغير عام وآخر محلي:
def my_function():
استخدام نفس اسم المتغير num1 = 10 # num1
num2 = 7 تعيين متغير محلي #
الناتج:
10
7
5
أن num1
محلي ا داخ ل إح دى ال دوال ،فس نرى َّ
ً ص ِّرح عن ه
ألن المتغ ير المحلي ُ num1
نظ ًرا َّ
يس اوي القيم ة المحلي ة 10عن د اس تدعاء الدال ة .عن دما نطب ع القيم ة العام ة للمتغ ير num1بع د
من الممكن الوص ول إلى المتغ يرات العام ة واس تعمالها داخ ل دال ة باس تخدام الكلم ة
المفتاحية :global
def new_shark():
جعل المتغير عاما #
global shark
"shark = "Sammy
أن المتغ ير المحلي sharkعُ يِّ ن داخ ل الدال ة )( ،new_sharkإال َّ
أنه يمكن الوص ول إلي ه رغم َّ
من خارج الدالة بسبب الكلمة المفتاحية globalالمستخدمة قبل اسم المتغير داخل الدالة.
َ
بسبب استخدام ،globalفلن يُ طلق ُّ
أي خطأ عندما نستدعي ) print(sharkخ ارج الدال ة.
عن د التعام ل م ع المتغ يرات ،يك ون ل ك الخي ار بين اس تخدام المتغ يرات العام ة أو المحلي ة.
يُ َّ
فض ل في العادة استخدام المتغيرات المحلية ،ولكن إن وجدت نفسك تس تخدم نفس المتغ ير في
عدة دوال ،فقد ترغب في جعله عامً ا .أمَّ ا إن كنت تحتاج المتغير داخل دالة أو ص نف واح د فق ط،
.6خالصة الفصل
لق د مررن ا في ه ذا الفص ل على بعض ح االت االس تخدام الش ائعة للمتغ يرات في ب ايثون .3
مثل حاض ً
نة لمختل ف أن واع البيان ات في ب ايثون وال تي المتغيرات هي لبنة مهمة في البرمجة ،إذ ُت ِّ
ُت ِّ
صنف بايثون البيانات ( )dataإلى أن واع ،كم ا ه و الح ال في جمي ع لغ ات البرمج ة .ه ذا مهم
ألن نوع البيانات الذي تستخدمه سيقيِّ د القيم التي يمكن تعيينها لها ،وما الذي يمكن فعله بها (بم ا
َّ
اء
لية لب ايثون .ه ذا ليس استقص ً
س نتعرَّ ف في ه ذا الفص ل على أهم أن واع البيان ات األص َّ
شاماًل ألنواع البيانات ،ولكنَّه سيساعدك على التعرف على الخيارات المتاحة لك في بايثون.
.1خلفية عامة
أن واع البيان ات في ب ايثون مش ابهة إلى ح د م ا ألن واع البيان ات ال تي نس تخدمها في الع الم
الحقيقي .من أمثلة أنواع البيانات في العالم الحقيقي األعداد ،مث ل :األع داد الص حيحة الطبيعي ة
( ،)... ،2 ،1 ،0واألعداد الصحيحة النسبية ( ،)... ،1 ،0 ،1- ،...واألعداد غير النسبية (.)π
يمكننا عادة في الرياضيات جمع أعداد من أنواع مختلفة مثل إضافة 5إلى :π
5 + π
يمكنن ا إمَّ ا االحتف اظ بالمعادل ة ِبع ِّدها إجاب ة ،وس تكون النتيج ة ع د ًدا غ ير نس بي (irrational
نجمع العددين:
ولكن ،إذا حاولن ا إض افة ع دد إلى ن وع بيان ات آخ ر ،مث ل الكلم ات ،فستص بح األم ور مربك ة
hsoub + 8
ً
مختلف ا تمامً ا ،مث ل الكلم ات بالنسبة إلى الكلمة ،hsoubيمكن ع ُّد كل نوع من أنواع البيان ات
في العمليات.
.2األعداد
ً
راحة عن ن وع فسر كل عدد ُتدخله إلى بايثون على َّ
أنه عدد؛ ليس مطلوبًا من ك اإلعالن ص سي َّ
ُ
كم ا ه و الح ال في الرياض يات ،األع داد الص حيحة ( )integerفي البرمج ة هي أع داد كامل ة،
ً
أيضا باسم .int يمكن أن تكون موجبة أو سالبة أو معدومة ( .)... ،1،0،1- ،...ويُ عرف هذا النوع
كما هو الحال مع لغات البرمجة األخرى ،يجب أال تستخدم الفواصل في األع داد المؤلف ة من أربع ة
)print(-25
وسينتج:
-25
أو يمكننا اإلعالن عن متغير ،والذي هو في هذه الحال ة رم ٌز للع دد ال ذي نس تخدمه أو نتعام ل
معه ،مثال:
my_int = -25
)print(my_int
وسينتج لنا:
-25
ً
مباشرة مثل: يمكننا أن نجري العمليات الحسابية على األعداد الصحيحة في بايثون
المخرجات:
48
يمكن استخدام األع داد الص حيحة بع دة طرائ ق في ب رامج ب ايثون ،وم ع اس تمرارك في تعلم
المزي د عن ه ذه اللغ ة ،س تتاح ل ك الكث ير من الف رص الس تخدام األع داد الص حيحة والتعام ل معه ا
األع داد العش رية هي أع داد حقيقي ة ،مم ا يع ني أن ه يمكن أن تك ون أع دا ًدا جذري ة أو غ ير
نسبية .لهذا الس بب ،يمكن أن تحت وي األع داد العش رية على ج زء كس ري ،مث ل 9.0أو .-116.42
)print(17.3
وسينتج لنا:
17.3
ِّ
متغير يحوى عد ًدا عشريًا ،مثال: ً
أيضا أن نعلن عن يمكننا
my_flt = 17.3
)print(my_flt
الناتج:
17.3
وكم ا ه و الح ال م ع األع داد الص حيحة ،يمكنن ا أن نج رى العملي ات الحس ابية على
األعداد العشرية:
الناتج:
929.24
ألن 3عدد
أن َّ ،3.0 ≠ 3
تختلف األعداد الصحيحة واألعداد العشرية عن بعضها عمومً ا ،إذ َّ
.3القيم المنطقية
هناك قيمتان فقط لنوع البيانات المنطقية ( ،)Booleanوهما Trueو ُ .Falseتستخدم القيم
ع ادة م ا يب دأ اس م البيان ات المنطقي ة ب الحرف ،Bإش ارة إلى اس م ع الم الرياض يات George
التساوي •
)print(my_bool
False
.4السالسل النصية
السلسلة النص ية ( )stringهي عب ارة عن تسلس ل من مح رف واح د أو أك ثر (مح ارف وأع داد
ورم وز) ،ويمكن أن تك ون ثابت ة أو متغ يرة .تح اط السالس ل النص ية إم ا بعالم ات االقتب اس
المفردة ' أو عالمات االقتباس المزدوجة " ،ل ذلك إلنش اء سلس لة نص ية ،ض ع سلس لة من األح رف
يمكنك استخدام عالمات االقتب اس المف ردة أو عالم ات االقتب اس المزدوج ة ،المهم أن تك ون
ً
متسقا في برنامجك.
البرن امج البس يط "! "Hello, Worldيوض ح كي ف يمكن اس تخدام السالس ل النص ية في
)"!print("Hello, World
كما هو الحال مع أنواع البيانات األخرى ،يمكننا تخزين السالسل النصية في المتغيرات:
مث ل األع داد ،هن اك العدي د من العملي ات ال تي يمكن إجراؤه ا على السالس ل النص ية من أج ل
تحقي ق النت ائج ال تي نس عى إليه ا .السالس ل النص ية مهم ة لتوص يل المعلوم ات إلى المس تخدم،
.5القوائم ()Lists
رتب قاب ل للتغي ير ( .)mutableوكم ا ُتع رَّ ف السالس ل
القائمة ( )listعب ارة عن تسلس ل م َّ
النصية باستخدام عالمات االقتباس ،يتم تعريف القوائم باستخدام األقواس المعقوفة [].
َّ
ً
صحيحة: مثاًل ،هذه قائمة تحوي أعدا ًدا
ِّ
سنسمي قائمة السالسل النصية خاصتنا باالسم :sea_creatures في المثال التالي،
)print(sea_creatures
الق وائم هي ن وع بيان ات م رن للغاي ة ،ألنه ا قابل ة للتغي ير ،حيث يمكن إض افة قيم إليه ا ،أو
بي د َّ
أنه غ ير قاب ل للتغي ير ،ويُ س مى إزالت ه ،أو تغييره ا .هن اك ن وع بيان ات آخ ر مش ابه لق وائمْ ،
الصف (.)tuple
.6الصفوف ()Tuples
يُ ستخدم الصف ( )tupleلتجميع البيانات ،وهو تسلسل ثابت من العناصر وغير قابل للتغيير.
الصفوف تشبه القوائم إلى حد كبير ،لكنها تس تخدم األق واس () ب داًل من األق واس المعقوف ة []،
َّ
وألنها غير قابلة للتغيير ،فال يمكن تغيير أو تعديل قيمها.
والمخرجات هي:
كما هو الحال في أنواع البيان ات األخ رى ،تطب ع ب ايثون الص فوف تمامً ا كم ا كتبناه ا ،إذ تطب ع
.7القواميس ()Dictionaries
اتيح ب القيم المقابل ة له ا في
ُ القاموس ( )dictionaryهو ن وع مُ ض مّ ن في ب ايثون ،إذ ُترب ط مف
ش كل أزواج ،ه ذه األزواج مفي دة لتخ زين البيان ات في ب ايثون .يتم إنش اء الق واميس باس تخدام
س تالحظ أن ه باإلض افة إلى األق واس المعقوص ة ،توج د عالم ات النقط تين الرأس يتين
( )colonsداخ ل الق اموس .الكلم ات الموج ودة على يس ار النقط تين الرأس يتين هي المف اتيح.
أي نوع بيانات غير قابل للتغيير .المفاتيح في القاموس أعاله هي:
المفاتيح قد تكون َّ
الكلم ات الموج ودة على يمين النقط تين هي القيم .يمكن أن تت ألف القيم من أي ن وع من
والمخرجات هي:
إذا أردت الحص ول على الل ون ( )colorالخ اص بـ ،Sammyفيمكن ك القي ام ب ذلك عن طري ق
print(sammy['color']) # blue
على سبيل المثال ،قد نحتاج إلى ضم ( )concatenateالقيم العددية إلى سالسل نصية.
سيرشدك هذا القسم إلى كيفية التحويل بين األعداد والسالسل النصية والص فوف والق وائم،
العش رية .س تعمل في بعض األحي ان على ش يفرة برمجي ة كتبه ا ش خص آخ ر ،وق د تحت اج إلى
ً
حيحا في تحوي ل ع دد ص حيح إلى ع دد عش ري ،أو العكس ،أو ق د تج د َّ
أنك تس تخدم ع د ًدا ص
ال وقت ال ذي تحت اج إلى أع داد عش رية .يت وفر في ب ايثون تواب ع مض مّ نة ُتس ِّهل علي ك تحوي ل
يح وّ ل الت ابع )( floatاألع داد الص حيحة إلى أع داد عش رية .الس تخدام ه ذه الدال ة ،ض ع
ً
صحيحا بين القوسين: عد ًدا
)float(57
في هذه الحالة ،سيحوَّ ل العدد الصحيح 57إلى العدد العشري .57.0
ً
أيض ا اس تخدام ه ذه الدال ة م ع المتغ يرات .ل ُنس نِد القيم ة 57إلى المتغيِّ ر ،fثم نطب ع يمكن ك
f = 57
))print(float(f
الناتج سيكون:
57.0
يمكننا باستخدام الدالة )( floatتحويل األعداد الصحيحة إلى أعداد عشرية.
تملك بايثون دالة أخرى مضمَّ نة لتحويل األعداد عشرية إلى أعداد صحيحة :وهي )(.int
تعمل الدالة )( intبشكل مشابه للدالة )( :floatيمكنك إضافة عدد عشري داخل القوسين
)int(390.8
وأن c
َّ أن bيس اوي ،125.0 ً
أيض ا اس تخدام ه ذه الدال ة م ع المتغ يرات .لنص ِّرح َّ يمكن ك
b = 125.0
c = 390.8
))print(int(b
))print(int(c
والمخرجات ستكون:
125
390
عن د تحوي ل األع داد العش رية إلى أع داد ص حيحة بواس طة الدال ة )( ،intتقتط ع ب ايثون
وتبقي القيمة الص حيحة؛ ل ذلك ،لن ُتح ِّول الدال ة )( intالع دد 390.8
األجزاء العشرية من العدد ُ
إلى .391
في بايثون ،3عند تقسيم ع دد ص حيح على آخ ر ،س ينتج ع دد عش ري على خالف ب ايثون .2
a = 5 / 2
)print(a
وسينتج لنا:
2.5
بينما في بايثون ،2ستحصل على ناتج صحيح ،أي .2 = 5/2يمكن ك الحص ول على ع دد
a = 5 // 2
)print(a
وسينتج لنا:
2
ارج ع إلى فص ل «إص دارات ب ايثون :ب ايثون 2مقاب ل ب ايثون »3لالطالع على المزي د من
السالسل النصية عبارة عن سلسلة مؤلفة من محرف واحد أو أك ثر (المح رف يمكن أن يك ون
ً
حرف ا ،أو ع د ًدا ،أو رم ًزا) .السالس ل النص ية هي إح دى األش كال الش ائعة من البيان ات في ع الم
البرمجة ،وقد نحتاج إلى تحويل السالسل النصية إلى أعداد أو أعداد إلى سالسل نص ية في كث ير
ً
خاصة عندما نعمل على البيانات التي ينشئها المستخدمون. من األحيان،
يمكنن ا تحوي ل األع داد إلى سالس ل نص ية ع بر الت ابع )( .strيمكنن ا أن نم ِّرر إمَّ ا ع د ًدا أو
دعنا ننظر أواًل في تحويل األعداد الصحيحة .لتحويل العدد الصحيح 12إلى سلسلة نص ية،
)str(12
عند تنفيذ ) str(12في سطر أوام ر ب ايثون التف اعلي م ع األم ر pythonفي ناف ذة الطرفي ة،
''12
ً
حيحا ،ولكنَّه أص بح اآلن تشير عالمات االقتباس المحيطة بالعدد 12إلى أنه لم يع د ع د ًدا ص
سلسلة نصية.
سيص بح باس تخدام المتغ يرات تحوي ل األع داد الص حيحة إلى سالس ل نص ية أك ثر فائ دة.
الشيفرة البرمجية التي كتبها .نود أن نعرض ذلك على المستخدم ،وذلك بطباع ة السالس ل النص ية
"user = "Sammy
lines = 50
سي َ
طلق الخطأ التالي: عند تنفيذ الشيفرة أعالهُ ،
يتع ذر علين ا ض مُّ ( )concatenateاألع داد إلى السالس ل النص ية في ب ايثون ،ل ذلك يجب
"user = "Sammy
lines = 50
إذا أردن ا تحوي ل ع دد عش ري إلى سلس لة نص ية ب داًل من تحوي ل ع دد ص حيح إلى سلس لة
نصية ،فعلينا تتبع نفس الخطوات والص ياغة الس ابقة .عن دما نم ِّرر ع د ًدا عش ريً ا إلى الت ابع )(،str
ُ
ستعاد سلسلة نصية .يمكننا استخدام قيمة العدد العشري نفسها ،أو يمكننا استخدام متغيِّ ر:
))print(str(421.034
f = 5524.53
))print(str(f
وسينتج لنا:
421.034
5524.53
f = 5524.53
وهذا هو الناتج:
يمكن تحوي ل السالس ل النص ية إلى أع داد باس تخدام الت ابعين )( floatو )( .intإذا لم
يكن في السلس لة النص ية من ازل عش رية ،فاألفض ل أن تحوله ا إلى ع دد ص حيح باس تخدام
التابع )(.int
دعنا نستخدم مثال تتبع عدد أس طر الش يفرة ال ذي أوردن اه أعاله .ق د ت رغب في التعام ل م ع
ولكن ه ذه القيم
َّ ه ذه القيم باس تخدام الحس ابات الرياض ياتية لتق ديم نت ائج أدق للمس تخدم،
"lines_yesterday = "50
"lines_today = "108
)print(lines_more
الناتج هو:
دعن ا نع ِّدل الش يفرة لتض مين الت ابع )( intال ذي س يحول السالس ل النص ية إلى أع داد
ص حيحة ،ويس مح لن ا بالقي ام بالعملي ات الرياض ياتية على القيم ال تي ك انت سالس ل نص ية
في األصل.
"lines_yesterday = "50
"lines_today = "108
)print(lines_more
وهذه هي المخرجات:
58
أيضا تحويل األعداد في المثال أعاله إلى قيم عشرية باستخدام التابع )( floatبداًل
ً يمكننا
من الت ابع )( .intوب دالً من الحص ول على الن اتج ،58سنحص ل على الن اتج ،58.0وه و
عدد عشري.
ً
نقاطا على شكل قيم عشرية: سيكسب المستخدم Sammy
"total_points = "5524.53
"new_points = "45.30
)print(new_total_points
الناتج:
5524.5345.30
ً
الحة ،لكن ه سيض م في هذه الحالة ،يع ُّد استخدام المعامل +م ع سلس لتين نص يتين عملي ًة ص
النص يتين ب داًل من جم ع القيم تين الع دديتين؛ ل ذلك ،س يبدو الن اتج غ ير م ألوفَّ ،
ألنه ّ السلس لتين
ً
بعضا. نتيجة لصق القيمتين إلى جانب بعضهما
سنحتاج إلى تحويل هذه السالسل النص ية إلى أع داد عش رية قب ل إج راء أي عملي ات عليه ا،
"total_points = "5524.53
"new_points = "45.30
)print(new_total_points
وسينتج عن ذلك:
5569.83
اآلن ،وبع د أن حوَّ لن ا السلس لتين النص يتين إلى ع ددين عش ريين ،سنحص ل على النتيج ة
إذا حاولنا تحويل سلسلة نصية ذات منازل عشرية إلى عدد صحيح ،فسنحصل على خطأ:
"f = "54.23
))print(int(f
المخرجات:
إذا مرّ رنا عد ًدا عشريً ا موضوعً ا في سلسلة نص ية إلى الت ابع )( ،intفسنحص ل على خط أ ،إذ
ي تيح لن ا تحوي ل السالس ل النص ية إلى أع داد تع ديل ن وع البيان ات ال ذي نعم ل علي ه بس رعة
حتى نتمكن من إجراء عمليات على قيم عددية مكتوبة على شكل سالسل نصية.
يمكن ك اس تخدام الت ابعين )( listو )( tupleلتحوي ل القيم المُ م رَّ رة إليهم ا إلى قائمة أو
الص ف عب ارة عن تسلس ل م رتب ث ابت (غ ير قاب ل للتغي ير) من العناص ر الموض وعة بين •
الهالليين ().
َّ القوسين
ِّ
يحس ن تحوي ل قائم ة إلى ص ف أداء نظ ًرا لك ون الص فوف غ ير قابل ة للتغي ير ،فيمكن أن
ال برامج تحس ينًا كب يرًا .عن دما نس تخدم الت ابع )( ،tupleفس وف يُ عي د القيم ة المُ م رَّ رة إلي ه على
هيئة صف.
المخرجات:
أن العناص ر موض وعة اآلن بين قوس ين ،ب داًل من
أن الص ف ق د ُطب ع في المخرج ات ،إذ َّ
ن رى َّ
القوسين المربعين.
))print(tuple(sea_creatures
سينتج:
))'print(tuple('Sammy
المخرجات:
لمَّ ا ك ان باإلمك ان الم رور ( )iterateعلى مح ارف السالس ل النص ية ،فيمكنن ا تحويله ا إلى
صفوف باستخدام التابع )( .tupleأمَّ ا أنواع البيانات غير القابلة للتك رار ،مث ل األع داد الص حيحة
))print(tuple(5000
والناتج سيكون:
في حين أن ه من الممكن تحوي ل ع دد ص حيح إلى سلس لة نص َّية ،ومن ثم تحوي ل السلس لة
َّ
المعقدة. البرمجية
يمكن أن يك ون تحوي ل القيم ،وخاص ة الص فوف ،إلى ق وائم مفي ًدا عن دما تحت اج إلى نس خة
تس تخدم األق واس ،تأك د من تض مين أق واس الت ابع )( ،listوك ذلك األق واس الخاص ة
بالدالة )(:print
المخرجات هي:
الدالة )(.list
لجعل الشيفرة سهلة القراءة ،يمكننا إزالة أحد أزواج األقواس باستخدام متغيِّ ر:
)list(coral
))'print(list('shark
الناتج:
ِّ
يوفر لنا نسخة قابلة للتغيير من القيمة األصلية. ُح ِّو َلت هنا السلسلة sharkإلى قائمة ،وهذا
.9خالصة الفصل
في هذه المرحلة ،يُ ف ترض أن يك ون ل ديك فهم جي د لبعض أن واع البيان ات الرئيس ية المتاح ة
أنواع بيانات أخرى ،وذلك باستخدام التوابع المُ ضمّ نة .يوفر تحويل أنواع البيان ات في ب ايثون ل ك
ً
إضافية في مشاريعك البرمجية .يمكنك التعرف على المزيد من التفاص يل عن ه ذه األن واع ً
مرونة
«السلسلة النصية» ( )stringهي مجموعة من المحارف (أي األحرف واألرقام والرم وز) ال تي
إمَّ ا أن تك ون قيم ة ثابت ة أو قيم ة لمتغ ير .وه ذه السالس ل النص ية مُ ش َّكلة من مح ارف يونيك ود
وألن النص ه و ش ٌ
كل ش ائعٌ من أش كال البيان ات ال ذي َّ ( )Unicodeوال تي ال يمكن تغي ير م دلولها.
ً
أساسية في البرمج ة .سيس تعرض مثل ُل ً
بنة وت ِّ
فإن السالسل النصية مهمة ج ًدا ُ
َّ يوميا ،لذا
ً نستعمله
كيفية إنش اء وطباع ة السالس ة النص ية ،وكيفي ة جمعه ا م ع بعض ها وتكراره ا ،وآلي ة
َّ ه ذا الفص ل
ل ذا إلنش اء سلس لة نص ية ،ك ل م ا علين ا فعل ه ه و وض ع مجموع ة من المح ارف بين أح د ن وعَ ي
َ
السابقين: عالمات االقتباس
استخدامك له في كام ل برنامج ك .يمكن ك طباع ة السالس ل النص ية إلى الشاش ة باس تدعاء الدال ة
كيفية التعام ل
َّ فهمت كيفي ة تهيئ ة السالس ل النص ية في ب ايثون ،لنل ق نظ ً
رة اآلن إلى َ بعد أن
ِ
s a m m y s h a r k !
0 1 2 3 4 5 6 7 8 9 10 11
وكم ا الحظت ،س يرتبط المح رف Sب الفهرس ،0وس تنتهي السلس لة النص ية ب الفهرس 11م ع
رس خ ٌ
اص ب ه ،وفي مثالن ا أن الف راغ بين كلمتَي Sammyو Sharkل ه فه ٌ ً
أيض ا َّ الرم ز ! .الح ظ
ً
أيض ا ،وأيَّ ة رم وز أو عالم ات ت رقيم رس خ ٌ
اص به ا سيكون له الفهرس .5عالم ة التعجب ! له ا فه ٌ
أن بإمكاننا الوصول إلى السالسل النص ية وتع ديلها كم ا نفع ل م ع أن واع البيان ات
خاص بها ستعني َّ
المتسلسلة األخرى.
لة نص ً
ية ونطب ع عرف في المث ال اآلتي سلس ً
بوض ع رقم الفه رس بين قوس ين معق وفين [] .س ُن ِّ
الناتج:
y
معي ٍن في سلس لةٍ نص يةٍ ،فس ُتعيد ب ايثون المح رف الموج ود في ذاك
ّ عندما ُنشير إلى فه ٍ
رس
ية لة النص ع في السلس رس الراب و ًدا في الفه رف yموج ان المح ع ،ولمَّ ا ك الموض
معين ة ض من
ّ خالص ة م ا س بق ،أرق ام الفه ارس ستس مح لن ا بالوص ول إلى مح ارف
سلسلة نصية.
ً
انطالق ا من نهايته ا ،فعندئ ذٍ لة طويل ٌة وأردن ا تحدي د أح د محارفه ا لكن
إذا ك انت ل ديك سلس ٌ
s a m m y s h a r k !
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
يمكنن ا أن نطب ع المح رف rفي السلس لة الس ابقة في ح ال اس تخدمنا الفه ارس الس البة
)]print(ss[-3
الكلمة Sharkفقط ،يمكننا فعل ذلك بإنشائنا «لقس م» من السلس لة النص ية ،وال ذي ه و سلس ٌ
لة من
المحارف الموجودة ضمن السلسلة األصلية .فاألقسام تسمح لن ا بالوص ول إلى ع ِّدة مح ارف دفع ًة
واحدة باستعمال مجال من أرقام الفهارس مفصولة فيما بينها بنقطتين رأسيتين [:]x:y
)]print(ss[6:11
الناتج:
Shark
الموج ود عن د ذاك الفه رس) ،وال رقم الث اني ه و مك ان نهاي ة القس م (دون تض مين ذاك المح رف)،
وهذا هو السبب وراء استخدمنا لرقم فهرس يقع بعد نهاي ة القس م ال ذي نري د اقتطاع ه في المث ال
ٌ
ودة ض من سلس لةٍ أخ رى .وعن دما نس تخدم التعب ير ] ss[6:11فنحن نس تدعي هي سلس ٌ
لة موج
السلس لة النص ية Sharkال تي تتواج د ض من السلس لة النص ية ! .Sammy Sharkإذا أردن ا تض مين
نش ئه ،فيمكن أاّل نض ع أح د أرق ام الفه ارس في نهاي ة السلس لة (أو ب دايتها) في القس م ال ذي ُ
ست ِ
] .string[n:nفمثاًل ،نس تطيع أن نطب ع أوَّ ل كلم ة من السلس لة – ssأي – Sammyبكتاب ة
ما يلي:
)]print(ss[:5
فعلنا ذلك بحذف رقم الفه رس قب ل النقط تين الرأس يتين ،ووض عنا رقم فه رس النهاي ة فق ط،
إلى آخرها ،فسنضع فهرس البداية فقط قبل النقطتين الرأسيتين ،كما يلي:
)]print(ss[7:
الناتج:
!hark
إن
بكتاب ة فه رس البداي ة فق ط قب ل النقط تين الرأس يتين وت رك تحدي د الفه رس الث اني ،ف َّ
ً
أيض ا اس تخدام السلسلة الفرعية ستبدأ من الفهرس األول إلى نهاية السلسلة النص ية كله ا .يمكن ك
ً
سابقا ،تبدأ أرقام الفهارس السلبية من الرقم الفهارس السالبة في تقسيم سلسلة نصية ،فكما ذكرنا
،-1ويستمر العد إلى أن نصل إلى بداية السلسلة النصية .وعند استخدام الفه ارس الس البة فس نبدأ
ألنه يقع أواًل في السلسلة .لنستخدم فهرس ين ذوي رقمين س البين القتط اع ج زء
من الرقم األصغر َّ
)]print(ss[-4:-1
الناتج:
ark
ً
مباشرة. في الموضع -4والحرف kيقع قبل الفهرس -1
يمكن تحدي د الخط وة عن د تقس يم السالس ل النص ية وذل ك بتمري ر معام ل ث الث إض ً
افة إلى
فهرس ي البداي ة والنهاي ة ،وه و الخط وة ،ال تي ُتش ير إلى ع دد المح ارف ال تي يجب تجاوزه ا بع د
َ
الحص ول على المح رف من السلس لة النص ية .لم ُنح ِّدد إلى اآلن الخط وة في أمثلتن ا ،إال َّ
أن قيمت ه
سنحصل على نفس النتائج بتضمين معامل ثالث هو الخطوة وقيمته :1
ستض ِّمن جمي ع المح ارف بين فهرس ين ،وإذا إذا ،إذا ك انت الخط وة 1فه ذا يع ني َّ
أن ب ايثون ُ ً
المحارف ستهمل:
تحديد الخطوة بقيمة 2كما في ] ss[0:12:2سيؤدي إلى تجاوز حرف بين كل حرفينِ ،
ألق
ً
نظرة على المحارف المكتوبة بخط عريض:
!Sammy Shark
أيض ا عن دما ك انت الخط وة .2إذا وض عنا أن الف راغ الموج ود في الفه رس 5ق د همِ ل
ً ُأ
الح ظ َّ
ً
قيمة أكبر للخطوة ،فسنحصل على سلسلةٍ نصيةٍ فرعيةٍ أصغر بكثير:
حذف الفهرسين وترك النقط تين الرأس يتين س يؤدي إلى إبق اء كام ل السلس لة ض من المج ال،
ً
إضافة إلى ذل ك، سي ِّ
حدد عدد المحارف التي سيتم تخطيها. لكن إضافة معامل ثالث وهو الخطوة ُ
َ
استعملت القيمة :-1
)]print(ss[::-1
الناتج:
!krahS ymmaS
ً
مرة أخرى لكن إذا كانت الخطوة :-2 ِّ
لنجرب ذلك
)]print(ss[::-2
الناتج:
!rh ma
في المث ال الس ابق (] ،)ss[::-2س نتعامل م ع كام ل السلس لة النص ية لع دم وج ود أرق ام
لفهارس البداية والنهاية ،وسيتم قلب اتجاه السلسلة النصية الستخدامنا لخطوةٍ س البة .باإلض افة
بترتيب معكوس:
ٍ أن الخطوة -2ستؤدي إلى تخطي حرف بين كل حرفين
إلى َّ
!krahS[whitespace]ymmaS
أن تحدي د المعام ل الث الث عن د تقس يم السالس ل النص ية س يؤدي إلى تحدي د
م ا رأين اه ه و َّ
الخط وة ال تي ُت ِّ
مثل ع دد المح ارف ال تي س يتم تخطيه ا عن د الحص ول على السلس لة الفرعي ة من
السلسلة األصلية.
يع ني عملي ة الجم ع عن د التعام ل م ع األع داد ،أم ا عن دما نس تخدمه م ع السالس ل النص ية فيع ني
إض افتها إلى بعض ها .لنجم ع السلس تين النص يتين " "Sammyو " "Sharkم ع بعض ها ثم نطبعهم ا
)"print("Sammy" + "Shark
# SammyShark
َ
أردت وض ع ف راغ بين السلس لتين النص يتين ،فيمكن ك بك ل بس اطة وض عه عن د نهاي ة إذا
َ
مختلفين من البيان ات ،فلن نتمكن من لكن اح رص على ع دم اس تعمال العام ل +بين ن وعَ ين
)print("Sammy" + 27
ً
حيحا .سنس تفيد من تحوي ل لة نص ً
ية وليس ت ع د ًدا ص عالم َتي اقتباس (" )"27مما يجعل ه سلس ً
األعداد إلى سالسل نصية عندما نتعامل مع أرق ام الهوات ف على س بيل المث الَّ ،
ألنن ا لن نحت اج إلى
إجراء عملية حسابية على رمز الدولة ورمز المنطق ة في أرق ام الهوات ف ،إال َّ
أنن ا نري دهما أن يظه را
لة نص ً
ية جدي ً
دة ال تي يمكنن ا نش ئ سلس ً
متتابعَ ين .عندما نجمع سلسلتين نص يتين أو أك ثر فنحن ُن ِ
استخدامها في برنامجنا.
فإن العام ل * ل ه اس تخدامٌ مختل ف عن دما نتعام ل م ع أرق ام ،حيث يُ ِّ
مثل عملي ة الض رب. َّ العامل +
سلس لة نص ية ألي ع دد م رات تش اء .لنح اول طباع ة السلس لة النص ية " "Sammyتس ع م رات دون
)print("Sammy" * 9
المخرجات:
SammySammySammySammySammySammySammySammySammy
ٌ
ارغ يمكن ك مل ؤه بالبيان ات أو القيم. ٌ
ندوق ف برن امج .أي يمكن ك تخي ل المتغيِّ رات على َّ
أنه ا ص
ٌ
نوع من أنواع البيان ات ،ل ذا يمكنن ا اس تعمالها لملء المتغ يرات .التص ريح عن السالسل النصية هي
سيس ِّهل علين ا التعام ل معه ا في برامجن ا .لتخ زين سلس لة نص ية
متغ يرات تح وي سالس ل نص ية ُ
أص بح المتغ ير my_strاآلن مُ ش يرًا إلى سلس لةٍ نص يةٍ ،وال تي أمس ى بمق دورنا طباعته ا
كما يلي:
)print(my_str
استخدام المتغيرات الحتواء قيم السالسل النصية سيساعدنا في االستغناء عن إعادة كتابة
في برامجنا.
بتع ديل وإج راء عملي ات على السالس ل النص ية بس هولة .يمكن ك أن تتخي ل ال دوال على َّ
أنه ا
«أفع ال» يمكنن ا تنفي ذها على عناص ر موج ودة في الش يفرة .ال دوال المبني ة في اللغ ة هي ال دوال
لية إلى األح رف الكب يرة أو الص غيرة (على الت والي وب الترتيب) .ولع دم ق درتنا على
أحرفه ا األص َّ
لة نص ٌ
ية جدي ٌ
دة .لن ُتع َّدل أيَّ ة مح ارف غ ير تع ديل السلس لة النص ية بع د إنش ائها ،فس ُتعاد سلس ٌ
التينية في السلسلة النصية األصلية وستبقى على حالها .لنح ِّول السلس لة النص ية Sammy Shark
أحرف كبيرةٍ:
ٍ إلى
الناتج:
SAMMY SHARK
أحرف صغيرة:
ٍ ِّ
لنحولها اآلن إلى
))(print(ss.lower
وسينتج:
sammy shark
ُّ
التحقق من مس اواة سلس لتين ستس ِّهل ال دالتان )( str.upperو )( str.lowerعملي ة
ُ
نصيتين لبعضهما أو لموازنتهما وذلك عبر توحيد حالة األحرف .فلو كتب المستخدم اسمه ب أحرف
إنشائنا للنماذج التي يجب على المستخدمين مألها؛ فمثاًل ،إذا س ألنا المس تخدم عن الرم ز البري دي
وأردن ا أن نقب ل السالس ل النص ية ال تي تحت وي أرقامً ا فق ط ،أو عن دما نس أله عن اس مه فس نقبل
ً
منطقية: ً
حروفا فقط .هنالك عد ٌد من الدوال التي ُتعيد قيمً ا ً
نصية تحوي ً
سلسلة
َّ
تتحقق إذا احت وت السلس لة النص ية على أرق ام وأح رف فق ط (دون )(:str.isalnum •
َّ
تحقق ذلك. رموز) ،أي تعيد trueإن
َّ
تتحقق إذا احت وت السلس لة النص ية على أح رف فق ط (دون أرق ام )(:str.isalpha •
أو رموز).
َّ
تتحقق إذا كانت جميع أحرف السلسلة النصية صغيرة. )(:str.islower •
َّ
تتحقق إذا احتوت السلسلة النصية على أرقام فقط. )(:str.isnumeric •
َّ
تتحقق إذا لم تحتوي السلسلة النصية إال على الفراغات. )(:str.isspace •
َّ
تتحقق إذا كانت جميع أحرف السلسلة النصية كبيرة. )(:str.isupper •
عمليا:
ً لنجرب استعمال بعضها
"number = "5
"letters = "abcdef
))(print(number.isnumeric
))(print(letters.isnumeric
الناتج:
True
False
اس تخدام الدال ة )( str.isnumericعلى السلس لة النص ية 5س ُيعيد القيم ة ،Trueبينم ا
ً
بداية بعض السالسل النصية: تنطبق على اللغات المكتوبة باألحرف الالتينية) .ل ُن ِ
نشئ
))(print(movie.islower
))(print(movie.isupper
# False
# True
))(print(book.istitle
))(print(book.isupper
# True
# False
))(print(poem.istitle
))(print(poem.islower
# False
# True
ستساعدنا معرفة إن كانت أحرف السلسلة النصية بحالة صغيرة أو كبيرة أو َّ
كأنها عنوان في
ً
أيضا ٌ
مفيدة ً
وفقا لذلك .الدوال المنطقية التي تعمل على السالسل النصية حالة أحرفها ثم تعديلها
معينة.
َّ ً
شروطا التحقق إن َّ
حق َقت مدخالت المستخدم ُّ عندما نريد
ً
افية لتع ديل إمكانيات إض
ٍ ِّ
توفر الدوال )( str.joinو )( str.splitو )(str.replace
السالس ل النص ية في ب ايثون .الدال ة )( str.joinتجم ع سلس لتين نص يتين م ع بعض هما ،لكنَّه ا
ً
نصية: ً
سلسلة تفعل ذلك بتمرير إحداها إلى األخرى .ل ُن ِ
نشئ
لنستخدم اآلن الدالة )( str.joinإلضافة فراغات إلى تلك السلسلة النصية كاآلتي:
)" ".join(balloon
))print(" ".join(balloon
أن السلسلة النصية الجديدة هي السلسلة األولى لكن بين كل حرفين فراغ:
فسنجد َّ
ً
أيضا استخدام الدالة )( str.joinإلنشاء مقلوب سلسلة نصية: يمكننا
)))print("".join(reversed(balloon
.noollab a sah ymmaS
لم ن رغب في إض افة أيَّ ة سلس لة نص ية إلى أخ رى ،ل ذا أبقين ا على السلس لة النص ية فارغ ًة دون
ً
أيض ا لجم ع قائم ة ( )listمن السالس ل النص ية محت وى داخله ا .الدال ة )( str.joinمفي ٌ
دة
أردت وضع فاصلة ثم فراغ بين القيم في المثال السابق ،فيمكنك أن ُتعيد كتاب ة التعليم ة
َ إذا
ً
أيض ا تجزئته ا ،وذل ك ع بر ً
بعض ا ،نس تطيع وكم ا نس تطيع جم ع السالس ل النص ية م ع بعض ها
الدالة )(:str.split
))(print(balloon.split
]'['Sammy', 'has', 'a', 'balloon.
ً
مفصولة بالفراغ ات في ُ
ستعيد الدالة )( str.splitقائمة ( )listتحوي سالسل نصية كانت
ً
أيض ا اس تخدام الدال ة ٌ
معامل لتحديد مح رف الفص ل .يمكن ك السلسلة النصية األصلية إذا لم يُ مرَّ ر
))"print(balloon.split("a
]'['S', 'mmy h', 's ', ' b', 'lloon.
ح ذِ َف الح رف aمن السلس لة النص ية وأص بح الن اتج مقس ومً ا عن د ك ل ورود للح رف aم ع
ُ
))"print(balloon.replace("has","had
أوَّ ل سلس لة نص ية داخ ل أق واس الدال ة )( replaceهي السلس لة النص ية ال تي نري د
اس تبدالها ،والسلس لة النص ية الثاني ة هي السلس لة ال تي نري د وض عها ب داًل من األولى .ن اتج تنفي ذ
ل )( str.joinو )(str.split ية مث ل النص ديل السالس تخدام دوال تع اس
.8دوال اإلحصاء
بع د أن تعرفن ا على آلي ة فهرس ة المح ارف في السالس ل النص ية ،ح ان ال وقت لمعاين ة بعض
الدوال التي ُتحصي السالسل النصية أو تعيد أرقام الفه ارس .يمكنن ا أن نس تفيد من ذل ك بتحدي د
عدد المحارف التي نريد استقبالها من مدخالت المستخدم ،أو لموازنة السالسل النصية.
))print(len(ss
# 12
ً
محرف ا ،بم ا في ذل ك الف راغ وعالم ة ط ول السلس لة النص ية "! "Sammy Sharkه و 12
ً
مباشرة تمرير سلسلة نصية إلى الدالة )(:len التعجب .بداًل من استخدام متغيِّ ر ،فلنحاول
الدالة )(ُ lenتحصي الع دد اإلجم الي من المح ارف في سلس لة نص ية .إذا أردن ا إحص اء ع دد
م رات تك رار مح رف أو مجموع ة من المح ارف في سلس لة نص ية ،فيمكنن ا اس تخدام الدال ة
))"print(ss.count("a
# 2
محرف آخر:
ٍ يمكننا البحث عن
))"print(ss.count("s
# 0
أن أن الح رف Sق د ورد في السلس لة النص ية ،إال َّ
أنه من الض روري أن تبقي ب ذهنك َّ حيح َّ
ٌ ص
حروف صغيرة.
ٍ حينها استخدام الدالة )( str.lowerلتحويل حروف السلسلة النصية إلى
الن اتج ه و ،3إذ تتواج د مجموع ة المح ارف " "likesثالث م رات في السلس لة النص ية
ً
أيض ا معرف ة موق ع الح رف أو مجموع ة الح روف في السلس لة النص ية ،وذل ك ع بر األصلية .يمكنن ا
))"print(ss.find("m
# 2
أوّ ل م رة يق ع فيه ا الح رف mفي الفه رس 2من السلس لة "! ،"Sammy Sharkيمكن ك أن
تراجع بداية هذا الدرس لرؤية جدول يبيِّ ن ارتباطات المحارف م ع فهارس ها في السلس لة الس ابقة.
لنرى اآلن مكان أوَّ ل ظهور لمجموعة المحارف likesفي السلسلة ":"likes
))"print(likes.find("likes
# 6
أوَّ ل م رة تظه ر فيه ا السلس لة " "likesهي في الفه رس ،6أي مك ان وج ود الح رف l
من .likesم اذا ل و أردن ا أن نع رف موض ع ث اني تك رار للكلم ة likes؟ نس تطيع فع ل ذل ك بتمري ر
ان إلى الدال ة )( str.findال ذي س يجعلها تب دأ بحثه ا من ذاك الفه رس ،فب داًل من البحث
معامل ث ٍ
ٍ
))print(likes.find("likes", 9
# 34
بدأ البحث في هذا المثال من الفهرس ،9وكانت أوَّ ل مطابقة للسلسلة النصية " "likesعند
ً
إضافة إلى ذلك ،يمكننا تحديد نهاية إلى مجال البحث بتمرير معامل ثالث .وكم ا عن د الفهرس .34
عكسيا:
ً تقسيم السالسل النصية ،يمكننا استخدام أرقام الفهارس السالبة للعد
يبحث آخ ر مث ال عن موض ع السلس لة النص ية " "likesبين الفه رس 40و ،-6ولمَّ ا ك ان
معينة فيها.
َّ السلسلة النصية وعدد حروفها وفهارس ورود محارف
.9خالصة الفصل
لقد تعلمنا في هذا الفصل أساس يات التعام ل م ع السالس ل النص ية في لغ ة ب ايثون .3بم ا في
ً
إضافة إلى تخزينها في متغيرات ،وهذه هي المعلوم ات ذلك إنشاءها وطباعتها وجمعها وتكرارها،
األساسية التي عليك فهمها لالنطالق في تعاملك مع السالسل النصية في برامج بايثون .3
تحكم
ٍ عدة حاالت نحت اج فيه ا إلى ً
عادة من النص المكتوب ،وهنالك ِّ تتألف السالسل النصية
ً
قراءة للبشر عبر وضع عالم ات ال ترقيم والس طور الجدي دة بكيفية إظهار النص وجعلها أسهل
َّ أكبر
.1الصياغة المختزلة
لنف ِّرق أواًل بين الص ياغة المختزل ة للسالس ل النص ية ( )string literalوالسالس ل النص ية
المجرَّ دة نفسها ( ،)string valueفاألولى هي ما نراه في الشيفرة المصدرية للبرن امج ،بم ا في ذل ك
عالمتَي االقتباس .أمَّ ا السلسلة النصية نفس ها فهي م ا نراه ا عن دما نس تدعي الدال ة )( printعن د
تش غيل البرن امج .ففي برن امج ! Hello, Worldالتقلي دي ،تك ون الص ياغة المختزل ة هي
أن السلسلة النصية هي ما نراه في نافذة الطرفية عندما ُنش ِّغل برن امج ب ايثون .لكن
االقتباس .أي َّ
وألن القيم
َّ بعض السالس ل النص ية ق د تحت وي على عالم ات اقتب اس ،مث ل اقتباس نا لمقول ةٍ م ا.
متساوية ،فمن الضروري في أغلب الح االت إض افة تنس يق إلى ص ياغة السلس لة النص ية المختزل ة
.2عالمات االقتباس
بس بب إمكانيتن ا اس تخدام عالم ات االقتب اس المف ردة أو المزدوج ة في ب ايثون ،فمن الس هل
تض مين االقتباس ات بوض عها بين عالمتَي اقتب اس مزدوج تين في سلس لةٍ نص يةٍ محاط ةٍ بعالمتَي
أو يمكنن ا اس تخدام عالم ة اقتب اس فردي ة (أو كم ا يس مونها «فاص لة علي ا» [ )]apostrophe
ً
إذا ،يمكنن ا التحكم بطريق ة ع رض عالم ات االقتب اس والفواص ل العلي ا في سالس لنا النص ية
عبر استخدام النوع الصحيح من عالمات االقتباس إلحاطة كامل السلسلة النصية.
ِّ
بعدة أسطر لزيادة وضوحها ،أو لتنسيقها كرس الة ،أو للحف اظ على تع ُّدد تجميع النصوص المكتوبة
األس طر في األش عار .نس تخدم ثالث عالم ات اقتب اس فردي ة ''' أو ثالث عالم ات اقتب اس
مزدوجة """ لإلحاطة بالسلسلة النصية التي تمتد على أكثر من سطر:
'''
This string is on
multiple lines
within three single
quotes on either side.
'''
"""
This string is on
multiple lines
within three double
quotes on either side.
"""
خصوص ا
ً يمكنك اآلن طباعة السالسل النصية في ِّ
عدة أسطر لجعل النصوص سهلة القراءة –
.4تهريب المحارف
طريق ة أخ رى لتنس يق السالس ل النص ية هي اس تخدام «مح رف الته ريب»
( .)escape characterفجميع عملي ات ته ريب المح ارف تب دأ بالخ ط المائ ل الخلفي (،backslash
سطر جديد.
ٍ :\nطباعة محرف االنتقال إلى •
لنستخدم محرف التهريب إلضافة عالمات االقتباس إلى سلس لتنا النص ية الس ابقة ،لكن ه ذه
تمكننا عبر محرف التهريب "\ من استخدام عالمات االقتباس المزدوجة لإلحاط ة بالسلس لة
ً
أيض ا اط بعالمتَي اقتب اس مزدوج تين .نس تطيع
مقتبس ومح ٍ
ٍ نص
النص ية ال تي تحت وي على ٍ
اس تخدام مح رف الته ريب '\ إلض افة عالم ة اقتب اس مف ردة ض من السلس لة النص ية المحاط ة
وألنن ا نس تخدم اآلن مح رف الته ريب فنس تطيع وض ع عالم ات االقتب اس المف ردة ح تى ل و
ك انت السلس لة النص ية كله ا موج ودة بين عالمتَي اقتب اس مف ردتين .عن دما نس تخدم عالم ات
ً
فراغ ا في أعلى وأس فل النص عن د طباعت ه .نس تطيع االقتباس الثالثية –كما فعلن ا أعاله– فس نجد
حذف تلك الفراغات عبر استخدام محرف التهريب \ في بداية ونهاية السلسلة النصية مع اإلبقاء
\"""
This multi-line string
has no space at the
top or the bottom
\when it prints.
"""
كل ش بيهٍ بم ا س بق ،يمكنن ا اس تخدام مح رف الته ريب \nلوض ع أس طر جدي دة دون
وبش ٍ
لة نص ً
ية على أك ثر من يمكننا ال دمج بين مح ارف الته ريب ،إذ س نطبع في المث ال اآلتي سلس ً
)"print("1.\tShark\n2.\tShrimp\n10.\tSquid
# 1. Shark
# 2. Shrimp
# 10. Squid
عالمة الجدولة األفقية ال تي وض عناها ع بر مح رف الته ريب \tس تحاذي الكتاب ة في العم ود
ً
روءة يعم ل عماًل جي ًدا في النص وص القص ير ،لكن ال ُنغفِ ل أهمي ة أن تك ون الش يفرة المص درية مق
أن مح ارف الته ريب ُتس تعمَ ل إلض افة تنس يق إلى السالس ل ال تي ك ان من الص عب (أو
رأين ا َّ
عرض ا س ليمً ا دونه ا .فه ل تس تطيع مثاًل أن تطب ع السلس لة النص ية اآلتي ة
ً حتى المستحيل) عرضها
ُّ
التحقق من صحة بعض الشيفرات الحاسوبية التي تستخدم الخ ط المائ ل الخلفي ،وال نري د من أو
لتح ل ه ذه المش كلة ،وتتجاه ل جمي ع مح ارف التنس يق داخ ل سلس لة نص ية ،بم ا في ذلك
محارف التهريب.
يمكنن ا إنش اء سلس لة نص ية خ ام بوض ع الح رف rفي بداي ة السلس لة النص ية ،قب ل عالم ة
ً
مباشرة: االقتباس األولى
سنستطيع اإلبقاء على محارف التهريب كما هي في السالسل النصية إن أسبقناها بالحرف r
نسقات .6استخدام ُ
الم ِّ
الدالة )( str.formatالمتوافرة للسالسل النص ية تس مح ل ك باس تبدال المتغ يرات وتنس يق
القيم .مما يمنحك القدرة على تجميع العناصر مع بعض ها ع بر إدخاله ا في مواض ع معين ة .سيش رح
ل ك ه ذا القس م أش هر االس تخدامات آللي ة تنس يق السالس ل النص ية في ب ايثون ،وال تي ستس اعدك
ً
قراءة واستخدامً ا. في جعل شيفرتك وبرنامجك أسهل
نس قات ( )formattersبوض ع حق ول قابل ة لالس تبدال ُتع رَّ ف ع بر وض ع قوس ين
تعم ل المُ ِّ
معق وفين {} في السلس لة النص ية ثم اس تدعاء الدال ة )( ،str.formatإذ س ُتمرَّ ر القيم ة ال تي
تري د وض عها ض من السلس لة النص ية إلى الدال ة )( formatوستوض ع ه ذه القيم ة في نفس مك ان
الحق ل القاب ل لالس تبدال الموج ود في السلس لة األص لية عن دما ُتش ِّغل برنامج ك .لنطب ع سلس ً
لة
الناتج:
ً
نصية تحتوي على قوسين معقوصين {}: ً
سلسلة أنشأنا في المثال السابق
الناتج:
أض فنا في المث ال الس ابق السلس لة النص ية " "open sourceإلى سلس لةٍ نص يةٍ أك بر
باستبدالها للقوسين المعقوفين الموجو َدين في السلسلة األصلية .تسمح ل ك المُ ِّ
نس قات في ب ايثون
باس تخدام األق واس المعقوف ة لحج ز أم اكن للقيم ال تي س تمررها مس تقباًل ع بر
الدالة )(.str.format
لة نص ً
ية أخ رى إلى المث ال الس ابق وذل ك بإض افة زوج آخ ر من األق واس المعقوص ة تض يف سلس ً
الناتج:
ً
زوجا آخر من األقواس المعقوصة إلى السلس لة النص ية للس ماح بوض ع قيم ة ثاني ة ،ثم أضفنا
الناتج:
عندما نترك األقواس المعقوص ة دون مع امالت ( )parametersمم ررة إليه ا ،فستض ع ب ايثون
القيم المُ مرَّ رة إلى الدالة )( str.formatبالترتيب .هذا تعبيرٌ فيه زوجين من األقواس المعقوصة
ً
سابقا في هذا الفصل: ٌ
شبيه بما رأيناه يوضع مكانهما سلسلتان نصيتان
الناتج:
" "pilot fishمكان الزوج الثاني من األقواس .القيم التي مرَّ رناها إلى الدال ة )(str.format
أن القيم ة الس ابقة هي من الن وع ( tupleص ف) ،ويمكن الوص ول إلى ك ل قيم ة
الح ظ َّ
سنحص ل بع د تنفي ذ المث ال الس ابق على نفس الن اتج ال تي ظه ر دون تحدي د أرق ام الفه ارس
لكن إن عكس نا أرق ام الفه ارس في مع امالت األق واس المعقوف ة فس نتمكن من عكس ت رتيب
الناتج:
لكن إن ح اولت اس تخدام الفه رس ذي ال رقم 2ولم تكن ل ديك إال قيم تين موج ودتين في
ً
قيمة خارج المجال المسموح ،ولهذا السبب ستظهر رسالة خطأ: الفهرسين 0و ،1فأنت تستدعي
الناتج:
ُتش ِير رسالة الخطأ إلى وجود قيمتين فقط ومكانهما هو 0و ،1لذا كان الفهرس 2غير مرتب ٍ
ط
بقيمةٍ وك ان خ ارج المج ال المس موح .لنض ف اآلن مك انين محج وزين إلى السلس لة النص ية ولنم ِّرر
بض ع قيم إلى الدال ة )( str.formatلكي نفهم آلي ة إع ادة ال ترتيب فهمً ا تامً ا .ه ذه هي السلس لة
الناتج:
ستوض ع القيم المُ م رَّ رة إلى الدال ة )( str.formatبنفس ت رتيب وروده ا في ح ال لم
نس تعمل المع امالت داخ ل األق واس المعقوص ة .تمل ك السالس ل النص ية المُ م رَّ رة إلى الدالة
)( str.formatالفهارس اآلتية المرتبطة بها؛ لنستخدم اآلن أرقام الفه ارس لتغي ير ت رتيب ظه ور
الناتج:
ولمّ ا ك ّن ا ق د ب دأنا ب الفهرس ذي ال رقم ،3فس تظهر القيم ة " "sharkأواًل .أي َّ
أن وض ع رقم
الفهرس بين القوسين كمعامل سيؤدي إلى تغيير ترتيب ظهور القيم في السلسلة النصية األص لية.
نس تطيع -باإلض افة إلى المع امالت الموض عية الرقمي ة -أن نرب ط بين القيم وبين كلم ات محج وزة
مخصصة ومن ثم نستدعيها عبر وضع الكلمة المحجوزة بين القوسين المعقوصين كما يلي:
الناتج:
ً
أيض ا يمكن ك اس تخدام الكلم ة المحج وزة prكوس يط باإلض افة إلى أرق ام الفه ارس ،وتس تطيع
الناتج:
بكيفية معالج ة
َّ عية والكلم ات المحج وزة س يمنحنا تحكمً ا أك بر
اس تخدام المع امالت الموض َّ
السلسلة النصية األصلية عبر إعادة ترتيب القيم المُ مرَّ رة إليها.
يس طع نجم آلي ة التنس يق ال تي نش رحها في ه ذا الفص ل عن دما ُتس تخ َدم لتنظيم البيان ات
بصريً ا ،فلو أردنا إظهار نتائج قاعدة البيانات إلى المستخدمين ،فيمكننا استعمال المُ ِّ
نسقات لزي ادة
ً
راءة .لننظ ر إلى حلق ة تك رار تقليدي ة في حجم الحق ل وتع ديل المح اذاة لجع ل الن اتج أس هل ق
for i in range(3,13):
)print(i, i*i, i*i*i
الناتج:
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
11 121 1331
12 144 1728
َ
كنت تتعام ل م ع مجموع ة أك بر من البيان ات ال تي يتواج د فيه ا األس طر األخ يرة من الن اتج ،وإذا
أعداد أكبر (أو أصغر) مما عرضناه في مثالن ا ،فق د تب دو ل ك المش كلة جلي ًة حينه ا .لنح اول تنس يق
الناتج السابق إلعطاء مساحة أكبر إلظهار األعداد عبر المثال التالي:
for i in range(3,13):
))print("{:3d} {:4d} {:5d}".format(i, i*i, i*i*i
الناتج كاآلتي:
ً
أيض ا تحدي د حجم ث ابت للحق ل لنحص ل على أعم دة متس اوية الع رض ،مم ا يض من يمكنن ا
for i in range(3,13):
))print("{:6d} {:6d} {:6d}".format(i, i*i, i*i*i
الناتج:
ً
أيضا تعديل محاذاة النص الموجود في األعمدة باستخدام الرموز > و ^ و < ،وتبديل يمكننا
dإلى fإلظه ار من ازل عش رية ،وغ ير ذل ك مم ا تعلمن اه في ه ذا ال درس إلظه ار البيان ات الناتج ة
كما نرغب.
المس تعمل للتحوي ل إلى ن وع البيان ات ال ذي تري ده« .رم ز التحوي ل» يع ني رم ًزا من ح ٍ
رف وحي د
الذي تستخدمه بايثون لمعرفة نوع القيمة المُ راد «تنسيقها» .الرموز التي سنستخدمها في أمثلتنا
هي sللسالس ل النص ية و dإلظه ار األرق ام بنظ ام الع د العش ري (ذي األس اس )10و fإلظه ار
يمكنك قراءة المزيد من التفاصيل عن رموز التنسيق في بايثون ( 3وغير ذل ك من المواض يع
ً
حيحا ع بر ال ُنم ِّرر في ه رقمً ا ص
المرتبط ة به ذا المج ال) في التوثي ق الرس مي .لننظ ر إلى مث ٍ
الدالة )( formatلكننا نريد إظهاره كعددٍ ذي فاصلة عبر رمز التحويل :f
الناتج:
وضعت القيمة -مك ان أوَّ ل ورود للص يغة { -}field_name:conversionكع ددٍ ذي فاص لة،
أمَّ ا ث اني ورود للقوس ين المعقوص ين فك ان بالص يغة { .}field_nameالح ظ في المث ال الس ابق
وجود ع دد كب ير من األرق ام الظ اهرة بع د الفاص لة العش رية ،لكن ك تس تطيع تقلي ل ع ددها .فعن دما
ً
أيض ا تحدي د دق ة القيم ة الناتج ة بتض مين رم ز نس تخدم الرم ز fللقيم ذات الفاص لة نس تطيع
النقطة .متبوعً ا بعدد األرقام بعد الفاصلة التي نود عرضها .حتى لو أكل سامي %75.765367من
قطع ة البي تزا فلن نحت اج إلى ه ذا الق در الكب ير من الدق ة ،إذ يمكنن ا مثاًل أن نجع ل ع دد المن ازل
العشرية ثالث منازل بعد الفاصلة بوضعنا .3قبل رمز التحويل :f
الناتج:
أما إذا أردنا عرض منزلة عشرية وحيدة ،فيمكننا إعادة كتابة السلسلة السابقة كاآلتي:
الناتج:
الح ظ كي ف أدى تع ديل دق ة األرق ام العش رية إلى تق ريب ال رقم (وف ق قواع د التق ريب
حيح أنن ا عرض نا رقمً ا دون من ازل عش رية كع ددٍ ذي فاص لة ،إال أنن ا إذا حاولن ا
ٌ االعتيادي ة) .وص
تحويل عدد عشري إلى عدد صحيح باستخدام رمز التحويل dفسنحصل على خطأ:
الناتج:
إذا لم ترغب بعرض أيَّ ة منازل عشرية ،فيمكنك كتابة تعبير كاآلتي:
الناتج:
.8إضافة حواشي
لمَّ ا ك انت األم اكن المحج وزة ع بر القوس ين المعقوص ين {} هي حق ول قابل ة لالس تبدال (أي
ً
فعلية) فيمكنك إضافة حاش ية ( )paddingأو إض افة ف راغ ح ول العنص ر بزي ادة حجم ليست قيمً ا
الحقل عبر معامالت إضافية ،ق د تس تفيد من ه ذا األم ر عن دما تحت اج إلى تنظيم البيان ات بص ريً ا.
معين (مُ ً
قاس ا بع دد المح ارف) بتحدي د ذاك الحجم بع د النقط تين َّ بحجم
ٍ يمكنن ا إض افة حق ٍل
الناتج:
ً
محرف ا أعطين ا في المث ال الس ابق حقاًل بحجم 4مح ارف للع دد ،5وأعطين ا حقاًل بحجم 16
ِّ
فسيوس ط النص في الحق ل ،والرم ز < س يؤدي إلى محاذات ه إلى اليمين. يس ار الحق ل ،أم ا الرم ز ^
ِّ
ونوسط السلسلة النصية: لنجعل محاذاة العدد إلى اليسار
الناتج:
أن مح اذاة الع دد 5إلى اليس ار ،مم ا يعطي مس احة فارغ ًة في الحق ل قب ل
نالح ظ اآلن َّ
الكلمة ،redوستظهر السلس لة النص ية balloonsفي منتص ف الحق ل وتوج د مس افة فارغ ة على
النقطتين الرأسيتين:
))"print("{:*^20s}".format("Sammy
الناتج:
***************Sammy
ستض ع ب ايثون السلس لة النص ية المُ م رَّ رة إلى الدال ة )( str.formatذات الفه رس 0مك ان
ِّ
سنوسط السلسلة النصية عبر حدد أننا سنستعمل المحرف * بداًل من الفراغات لملء الحقل ،ثم
س ُن ِّ
أن حجم الحق ل ه و 20مح رف ،ومُ ش يرين في نفس ال وقت إلى َّ
أن اس تعمال الرم ز ^ مُ ح ِّددين َّ
الناتج:
ِّ
حد دنا داخل القوسين المعقوصين رقم فهرس القيمة العددية ثم وضعنا النقطتين الرأسيتين
ثم اخترن ا حجم الحق ل ثم وض عنا نقط ًة .لنض بط ع دد المن ازل العش رية الظ اهرة ،ثم نخت ار ن وع
.9استخدام المتغيرات
مرَّ رنا منذ بداية هذا الفصل وإلى اآلن األعداد والسالسل النص ية إلى الدال ة )(str.format
ً
أيضا ،وذلك بنفس اآللية المعتادة: ً
مباشرة ،لكنَّنا نستطيع تمرير المتغيرات
nBalloons = 8
))print("Sammy has {} balloons today!".format(nBalloons
الناتج:
ً
أيضا استخدام المتغيِّ رات لتخ زين السلس لة النص ية األص لية باإلض افة إلى القيم ال تي يمكننا
ُ
ستمرَّ ر إلى الدالة:
الناتج:
نس ً
قة في السلسلة النصية النهائية. المستخدم وإظهارها مُ َّ
.10خالصة الفصل
ش رحنا في ه ذا الفص ل ع ِّدة طرائ ق لتنس يق النص وص والسالس ل النص ية في ب ايثون 3؛
وعرفن ا كي ف ُن ِ
ظه ر السالس ل النص ية كم ا نري د ع بر اس تخدامنا لمح ارف الته ريب أو السالس ل
ٌ
شائعة ج ًدا في البرمجة ،إذ ُتستخدم لتمثيل مختلف القيم ،مثل أبعاد حجم الشاش ة، األعداد
والمواقع الجغرافية ،والمبالغ المالية ،ومقدار الوقت الذي مر منذ بداية فيديو ،واأللوان وغير ذلك.
تع د الق درة على تنفي ذ العملي ات الرياض ية بفعالي ة في البرمج ة مه ارة مهم ةَّ ،
ألنك األع داد
س تكون في متن اول األي دي دومً ا .الفهم الجي د للرياض يات يمكن أن يس اعدك على أن تص بح
أنه ليس ش ً
رطا أساس ًيا .فالرياض يات أداة لتحقي ق م ا ت رغب في تحقيق ه، مبرمج ا أفض ل ،إال َّ
ً
س نعمل م ع أك ثر ن وعي البيان ات اس تخدامً ا في ب ايثون ،وهم ا األع داد الص حيحة
واألعداد العشرية:
األعداد الصحيحة هي أعداد كاملة يمكن أن تكون موجبة أو سالبة أو معدومة مثل •
(.)... ،1 ، 0 ، 1- ،...
األع داد العش رية هي أع داد حقيقي ة تحت وي على فاص لة عش رية (كم ا في 9.0 •
أو .)-2.25
س نلقي في ه ذا الفص ل نظ ً
رة على العوام ل ( )operatorsال تي يمكن اس تخدامها م ع أن واع
.1العامالت
عملية حس ابية ،إذ ج اءت تس مية عام ل من عملي ة،
َّ العامل ( )operatorهو رمز أو دالة تمث ل
عملية .على س بيل المث ال ،في الرياض يات ،عالم ة الجم ع أو +هي العام ل
َّ أي العام ل ال ذي يج ري
في ب ايثون ،س نرى بعض الع امالت المألوف ة ،وال تي اس ُتعيرَ ت من الرياض يات ،لكن هن اك
الجدول التالي مرجعٌ سريعٌ للعامالت الحسابية في بايثون .سنغطي جميع هذه العملي ات في
هذا الفصل.
الناتج العملية
ً
أيض ا عن ع امالت اإلس ناد المركب ة ( ،)compound assignment operatorsبم ا س نتحدث
.2الجمع والطرح
في ب ايثون ،يعم ل مع امال الجم ع والط رح مث ل م ا ه و مع روف في الرياض يات .في الواق ع،
ً
حاسبة. يمكنك استخدام لغة بايثون ً
آلة
)print(1 + 5
والناتج:
6
ب داًل من تمري ر أع داد ص حيحة مباش رة إلى الدال ة ،printيمكنن ا تهيئ ة المتغ يرات
بأعداد صحيحة:
a = 88
b = 103
)print(a + b
وسينتج لنا:
191
ً
أيض ا) ،ل ذلك يمكنن ا إض افة األع داد الص حيحة يمكن أن تك ون موجب ة أو س البة (أو معدوم ة
c = -36
d = 25
ً
مشابها مع األعداد العشرية: الجمع سيكون
e = 5.5
f = 2.5
إذا جمعنا عددين عشريين معً ا ،ستعيد بايثون عد ًدا عشريًّ ا.
ص ياغة الط رح تش به ص ياغة الجم ع ،م ا ع دا أن ك ستس تبدل بعام ل الط رح ()-
g = 75.67
h = 32
صحيحا من عدد عش ري .س تعيد ب ايثون ع د ًدا عش ريًّ ا إذا ك ان أح د األع داد
ً هنا ،طرحنا عد ًدا
واح د فق ط ،ويمكن في ب ايثون اس تخدام العالم تين +و -بمفردهم ا ع بر قرنهم ا بقيم ة إلع ادة
القيمة نفسها (عبر العامل ،)+أو تغيير إشارة القيمة (عبر العامل . )-
أي تعيد القيمة نفسها .يمكننا استخدام عالمة الجمع مع القيم الموجبة:
i = 3.3
)print(+i # 3.3
ُ
فستعاد القيمة نفسها ،وفي هذه الحالة ستكون عندما نستخدم عالمة الجمع مع قيمة سالبة،
ً
أيضا: قيمة سالبة
j = -19
)print(+j # -19
عالم ة الط رح ،على خالف عالم ة الجم ع ،تغيِّ ر إش ارة القيم ة .ل ذلك ،عن دما نض عها م ع قيم ة
موجبةُ ،
ستعاد القيمة السالبة منها:
i = 3.3
)print(-i # -3.3
بالمقاب ل ،عن دما نس تخدم عام ل الط رح األح ادي ( )minus sign unary operatorم ع قيم ة
ُ
فستعاد القيمة الموجبة منها: سالبة،
j = -19
)print(-j # 19
ُ
ستع ِيد العمليتان الحسابيتان األحاديتان +و -إمَّ ا هوية القيمة المعطاة ،أو القيمة المعاكس ة
.4الضرب والقسمة
مث ل الجم ع والط رح ،الض رب والقس مة في ب ايثون مش ابهان لم ا ه و مع روف في الرياض يات.
k = 100.1
l = 10.1
عن دما ُتج رَ ى عملي ة القس مة في ب ايثون ،3فس يكون الع دد المُ ع اد دائمً ا عش ريًّ ا ،ح تى ل و
m = 80
n = 5
هذا أحد االختالفات الرئيسية بين بايثون 2و بايثون .3اإلجابة في بايثون 3تك ون كس رية،
11/2هو .5
يُ ج ِري العامل /في بايثون 2قسمة عملية القسمة مع تقريب الن اتج إلى أص غر ع دد ص حيح
يساوي ،xفسيكون ناتج عملية القس مة في ب ايثون 2أك بر ع دد من األع داد الص حيحة األص غر من
نفذت المث ال ) print(80 / 5أعاله في ب ايثون 2ب داًل من ب ايثون ،3فس يكون
أو تس اوي .xإذا َّ
في ب ايثون ،3يمكن ك اس تخدام العام ل //إلج راء القس مة التقريبي ة .التعب ير 100 // 40
س يعيد القيم ة .2القس مة التحتي ة مفي دة في ح ال كنت تري د أن يك ون حاص ل القس مة
ً
صحيحا. عد ًدا
على األعداد التي هي مضاعفات لنفس العدد .المثال التالي يوضح كيفية استخدام عامل الباقي:
o = 85
p = 15
q = 36.0
r = 6.0
.6القوة ()Power
ً
أحيانا «األس») في بايثون لرفع الع دد األيس ر لق وة األس يُ ستخدم عامل القوة ** (يقال له
غالبا ما نرى ه ذا التعب ير يُ كتب على الش كل ،5³إذ يُ ض رب الع دد 5في نفس ه 3م رات .في ب ايثون،
ً
s = 52.25
t = 7
ً
وفقا لنظام األسبقية ،وليس من اليسار إلى اليمين ،أو من اليمين إلى اليسار.
u = 10 + 10 * 5
أن عملي ة الض رب س ُتجرَ ى أواًل ،ل ذا إن اس تدعينا قد نقرأه من اليس ار إلى اليمين ،ولكن ت َّ
ذكر َّ
60
قيم أواًل ،وس ينتج عنه ا الع دد ،50ثم يض اف إليه ا الع دد 10لنحص ل
ألن 5 * 10س ُت َّ
ه ذا َّ
إذا أردنا بداًل من ذلك إضافة القيمة 10إلى ،10ثم ضرب المجموع في ،5فيمكننا استخدام
إحدى الطرق البسيطة لتذكر األسبقيات هي حفظ البيتين التاليين لتذكر أوائل كلماتهما:
ً
طريقا ً
ضيقا ...قم جد قم أبعد
ً
ضيقا الضرب 3
ً
طريقا الطرح 6
القيم ة الموج ودة على يمين ه إلى المتغ ير الموض وع على يس اره .على س بيل المث الُ ،تس نِد
من الشائع استخدام عامالت اإلس ناد المركب ة ال تي تج ري عملي ة رياض ية على قيم ة المتغ ير،
ثم ُتسنِد القيمة الجديدة الناتجة إلى ذلك المتغير .تجمع عوامل اإلسناد المركبة بين عامل رياضي
والعام ل =؛ ففي ح ال الجم ع ،نس تخدم +م ع = للحص ول على عام ل اإلس ناد الم ركب = .+لنطبِّ ق
w = 5
w += 1
)print(w # 6
أوالًُ ،نس نِد القيم ة 5إلى المتغ ير ،wثم نس تخدم معام ل اإلس ناد الم ركب = +إلض افة الع دد
الصحيح إلى قيمة المتغير األيسر ،ثم ُنسنِد النتيجة إلى المتغير .w
ُتس تخدم مع امالت اإلس ناد المركب ة اس تخدامً ا متك ررًا م ع حلق ات forالتكرارية ،وال تي
والناتج سيكون:
0
2
4
6
8
10
12
تمكن ا باس تخدام الحلق ة forمن أتمت ة العملي ة =* ال تي تض رب قيم ة المتغ ير wبالع دد ،2ثم
ل دى ب ايثون معام ل إس ناد م ركب مقاب ل لك ل من المع امالت الحس ابية ال تي تطرقن ا ً
آنف ا
إليها وهي:
يمكن أن يكون عامل اإلسناد المركب مفي ًدا عندما تحتاج إلى الزيادة أو اإلنق اص الت دريجي،
هذا القسم بعض الدوال الرياضية المُ ضمَّ نة ال تي يمكن اس تخدامها م ع أن واع البيان ات العددي ة في
ب ايثون .3فتتض مّ ن ب ايثون 3العدي د من ال دوال ال تي يمكن ك اس تخدامها بس هولة في أي برن امج.
ت تيح ل ك بعض تل ك ال دوال تحوي ل أن واع البيان ات ،والبعض اآلخ ر خ اص بن وع معين ،مث ل
السالسل النصية.
فهم ه ذه ال دوال س يمنحك مرون ة أك بر في التعام ل م ع البيان ات العددي ة ،ويس اعدك على
اتخاذ قرارات مدروسة عند تحديد العوامل والدوال التي عليك استخدامها.
تعي د الدال ة المض مّ نة )( absالقيم ة المطلق ة للع دد ال ذي يُ م رر إليه ا .في الرياض يات ،تش ير
القيمة المطلقة إلى العدد نفسه إن كانت القيمة موجبة ،أو القيمة المعاكسة إن كانت القيمة سالبة.
مثاًل ،القيمة المطلقة للعدد 15هي ،15والقيمة المطلقة للعدد -74هي ،74والقيمة المطلق ة
اليومي ة ،مث ل حس اب المس افة المقطوع ة .على س بيل المث ال ،إذا كنت تح اول الوص ول إلى مك ان
يبعد 58مياًل ،ولكنَّك تجاوزت ذلك المك ان ،وس افرت 93فرس ًخا .ف َّ
إن حس بت ع دد الفراس خ ال تي
ينبغي أن تقطعها اآلن للوصول إلى الوجهة المقصودة ،فسوف ينتهي بك المطاف بعدد سالب ،لكن
سالبا من الفراسخ!
ً ال يمكنك السفر عد ًدا
)print(miles_to_go
حساب القيمة المطلقة للعدد السالب #
))print(abs(miles_to_go
المخرجات ستكون:
-35
35
أن miles_travelled
لوال استخدام الدالة )( ،absلحصلنا على ع دد س الب ،أي .-35ورغم َّ
القس مة التقريبي ة ( ،floor divisionال تي ُتعي د حاص ل القس مة [ ]quotientم ع تقريب ه)،
ً
ارتباط ا وقس مة الب اقي ( ،modulo divisionال تي تعي د ب اقي القس مة [ ،)]remainderمرتبط ان
ً
وثيقا ،وقد يكون من المفيد استخدام دالة تجمع بين العمليتين معً ا.
تجم ع الدال ة المض مَّ نة )( divmodبين العملي تين ،إذ تعي د أواًل حاص ل عملي ة القس مة
التقريبية ،ثم الباقي .ينبغي تمرير عددين إلى الدالة )( ،divmodعلى النحو التالي:
)divmod(a,b
a // b
a & b
أننا كتبنا كتابًا يحتوي 80ألف كلمة .يري د الناش ر أن تحت وي ك ل ص فحة من الكت اب
لنفترض َّ
ما بين 300و 250كلمة ،ونود أن نعرف ع دد الص فحات ال تي ستش كل الكت اب بحس ب ع دد كلم ات
الص فحة ال ذي اخترن اه .باس تخدام الدال ة )( ،divmodيمكنن ا أن نع رف على الف ور ع دد الص فحات
)(266, 200
)(320, 0
في الخيار ،Aسنحص ل على 266ص فحة مليئ ة بالكلم ات ،و 200كلم ة متبقي ة (ثلث ا ص فحة)،
والمجموع هو 267صفحة ،وفي الخيار ،Bسنحص ل على كت اب من 320ص فحة .إن أردن ا الحف اظ
على البيئة ،فالخيار Aقد يكون أفضل ،ولكن إذا أردن ا تص ميمً ا ج ذابًا ،أو الكتاب ة بحجم خ ط كب ير،
تقبل الدالة )( divmodاألع داد الص حيحة واألع داد العش رية ،في المث ال الت الي س ُن ِّ
مرر ع د ًدا
a = 985.5
b = 115.25
في هذا المثال ،العدد 8.0ه و حاص ل القس مة التحتي ة للع دد 985.5مقس ومً ا على ،115.25
و 63.5هو الباقي.
ُّ
للتحقق من نتيجة )(:divmod يمكنك استخدام عامل القسمة التحتية //و عامل الباقي %
في بايثون ،يمكنك استخدام عامل القوة ** (أو األس) لرفع عدد إلى ق وة معين ة ،أو يمكن ك
استخدام الدالة )( powالمضمَّ نة التي تأخذ عددين وتجري العملية نفسها.
ً
أبحاثا على البكتيريا ،ونريد أن نق َّدر ع دد كيفية عمل الدالة )( ،powلنقل َّ
أننا نجري َّ لتوضيح
البكتيريا التي سنحصل عليها في نهاية اليوم إذا بدأنا ببكتيريا واحدة.
أن البكتيريا التي نعمل عليها تتضاعف في كل ساعة ،لذلك النتيجة النهائية ستكون
لنفترض َّ
hours = 24
)total_bacteria = pow(2,hours
لق د مرَّ رن ا ع ددين ص حيحين للدال ة )( ،powوالنتيج ة ال تي حص لنا عليه ا ،وال تي ِّ
تمثل ع دد
أي .27ولحس اب 3³في ب ايثون ،نكتب ) ،pow(3,3إذ تقب ل الدال ة )( powاألع داد الص حيحة
ِّ
وتوفر بدياًل لعامل األس **. واألعداد العشرية،
تقريب األعداد ( )Rounding Numbersضروري عند العمل مع األعداد العشرية التي تحتوي
على الكث ير من المن ازل (األج زاء) العش رية .تقب ل الدال ة المض منة )( roundع ددين :أح دها ِّ
يمثل
ِّ
يحدد عدد المنازل العشرية المراد اإلبقاء عليها (أي قيمة التقريب). العدد المراد تقريبه واآلخر
سنستخدم هذه الدالة لتقريب عدد عشري له أكثر من 10منازل عشرية والحص ول على ع دد
i = 17.34989436516001
))print(round(i,4 # 17.3499
أن الدال ة )( roundتق ِّرب األع داد إلى األعلى ،ل ذا ب داًل من إع ادة ،17.3498 ً
أيض ا َّ الح ظ
ألن ال رقم ال ذي يلي الم نزل العش ري 8ه و ال رقم .9وس يقرَّ ب أي ع دد
فق د أع ادت َّ ،17.3499
ِّ
نحدد في ه قيم س نكتب في المث ال الت الي برنامج ا بس يطا يمكن ه حس اب البقش يش ،إذ س
المتغ يرات ،ولكن يمكن ك إع ادة كتاب ة البرن امج لجع ل المس تخدمين ي دخلون القيم بأنفس هم .في
ه ذا المث ال ،ذهب 3أص دقاء إلى مطعم ،وأرادوا تقس يم الف اتورة ،وال تي تبل غ 87.93دوال ًرا
والمخرجات ستكون:
35.172000000000004
35.17
في هذا البرنامج ،نطلب أواًل إخراج العدد بعد حساب إجمالي الف اتورة واإلكرامي ات مقس ومً ا
على ،3النتيجة ستكون عد ًدا يتض مَّ ن الكث ير من المن ازل العش رية.35.172000000000004 :
واقعياَّ ،
فإنن ا نس تخدم الدال ة )( ،roundونق ِّرب المن ازل ًّ مالي ا
ً ً
مبلغ ا ألن ه ذا الع دد ال ِّ
يمثل نظ رًا َّ
َّ
نتمكن من توفير ناتج يمكن لألصدقاء الثالثة أن يدفعوه.35.17 : العشرية على ،2حتى
إذا كنت تفض ل التق ريب إلى ع دد بال من ازل عش رية ،يمكن ك تمري ر 0كمعام ل ث ان إلى
الدالة )(:round
)round(345.9874590348545304636,0
ً
أيضا تمرير األعداد الصحيحة إلى )( roundدون الخ وف من تلقي خط أ ،وه ذا مفي د يمكنك
عدد صحيح.
ة َّ
المركب ات العدديَّ ة واع البيان اميع أن اب مج ة )( sumلحس تخ َدم الدال ُتس
يمكننا تمرير قائمة إلى الدالة )( sumلجمع كل عناصرها بالترتيب من اليسار إلى اليمين:
]some_floats = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9
))print(sum(some_floats # 49.5
المخرجات:
60
-60
]some_floats = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9
.10خالصة الفصل
َّ
غطينا في هذا الفصل العديد من العوام ل وال دوال ال تي ستس تخدمها م ع األع داد الص حيحة
والعش رية إلج راء أهم العملي ات الرياض ية وال زال هنال ك الكث ير منه ا ،فننص حك بزي ارة توثي ق
العملي ات العددي ة في ب ايثون وتوثي ق األن واع العددي ة في ب ايثون في موس وعة حس وب لمزي د
من التفاصيل.
هن اك قيمت ان فق ط لن وع البيان ات المنطقية ،وهم ا Trueو ُ .Falseتس تخ َدم الحس ابات
ِّ
تمثل القيم المنطقي ة قيم الحقيق ة ( )truth valuesفي علم المنط ق في الرياض ياتٌ ،
وتكتَب
القيمت ان Trueو Falseدائمً ا ب الحرفين الكب يرين Tو Fعلى الت والي ،أل َّنهم ا قيمت ان خاص تان
.1عامل الموازنة
في البرمج ةُ ،تس تخ َدم ع امالت الموازن ة ( )comparison operatorsللموازن ة بين القيم،
وتعي د إح دى القيم تين المنطق تين Trueو .Falseيوض ح الج دول أدن اه ع امالت
الموازنة المنطقية:
الشرح العامل
يساوي ==
يخالف !=
x = 5
y = 8
في هذا المثال ،لمَّ ا كان xيساوي ،5فهو أصغر من yذي القيمة .8
ِّ
سنجرب أحد الع امالت من الج دول أعاله. باستخدام هذين المتغيرين والقيم المرتبطة بهما،
س نطلب من ب ايثون أن تطب ع ن اتج عملي ة الموازن ة ،إمَّ ا Trueأو .Falseلتوض يح المث ال أك ثر،
x = 5
y = 8
والمخرجات هي:
x == y: False
x != y: True
x < y: True
x > y: False
x <= y: True
x >= y: False
باتباع المنطق الرياضي ،في كل من التعبيرات المذكورة أعاله ،هذه نتيجة الموازنات:
ً
أيضا استخدام السالسل النصية مع المعامالت المنطقية .وهي حساسة لحالة األحرف، يمكن
افيا للسالس ل النص ية ،ويوض ح المث ال الت الي كيفي ة موازن ة
ً م ا لم تس تخدم تابعً ا إض
السالسل النصية:
"Sammy = "Sammy
"sammy = "sammy
"Sammy = "Sammy
"sammy = "sammy
"also_Sammy = "Sammy
ً
أيض ا اس تخدام ع امالت الموازن ة األخ رى ،بم ا في ذل ك > و < لموازن ة سلس لتين يمكن ك
نص يتين .س توازن ب ايثون ه ذه السالس ل النص ية بحس ب ال ترتيب المعجمي في نظ ام
ً
أيضا تقييم القيم المنطقية باستخدام عامالت الموازنة: محارف .ASCIIويمكنك
t = True
f = False
ِّ
يحدد قيم ة أح د المتغ يرين، األول = ،هو عام ل اإلس ناد ( ،)assignment operatorوال ذي س
ِّ
يحدد م ا إذا ك انت ويجعله ا مس اوية لقيم ة اآلخ ر .الث اني == ،وه و عام ل الموازن ة ال ذي س
القيمتان متساويتين.
.2العامالت المنطقية
هن اك ثالث ة ع امالت منطقي ة (ُ )Boolean operatorsتس تخدم لموازن ة القيم .وتعي د إمَّ ا
Trueأو .Falseه ذه الع امالت هي( and ،و) ،و ( orأو) ،و ( notالنفي) ،وق د عرَّ فناه ا في
الجدول أدناه.
ع ً
ادة م ا ُتس تخ َدم الع امالت المنطقي ة لتق ييم م ا إذا ك ان تعب يران منطقي ان ص حيحين أم ال.
على سبيل المثال ،يمكن استخدامها لتحديد ما إذا كان الط الب ق د نجحَّ ،
وأنه مُ س جل في الفص ل،
فسي َ
ضاف الطالب إلى سجل النظام .مثال آخ ر ه و تحدي د م ا ُ وإذا كانت كلتا الحالتان صحيحتين،
ً
نشطا لمتجر إلكتروني استنا ًدا إلى ما إذا ك ان لدي ه رص يد في المتج ر ،أو إذا كان المستخدم عمياًل
َّ
أنه اشترى خالل األشهر الستة الماضية.
والمخرجات هي:
True
True
True
في الحال ة األولى ،print((9 > 7) and (2 < 4)) ،ينبغي أن يك ون كال التعب يرين
القيمة .False
في الحال ة الثالث ة ،print(not(3 <= 1)) ،ينفي العام ل notالقيم ة Falseال تي تعي دها
))print((-0.2 > 1.4) and (0.8 < 3.1 أحد التعبيرين خطأ #
))print((7.5 == 8.9) or (9.2 != 9.2 كال التعبيرين خطأ #
))print(not(-5.7 <= 0.3 التعبير األصلي صحيح #
:andيجب أن يكون واحد على األقل من التعبيرين خطأ ليعيد القيمة ،False •
ً
صحيحا حتى يعيد القيمة .False :notيجب أن يكون التعبير المرافق له •
إذا لم تكن النت ائج أعاله واض حة ،فس نعرض بعض ج داول الحقيق ة أدن اه لتفهم األم ر
فهمً ا أفضل.
ألن كال
التعب ير ال داخلي )0.1 == 0.1( or )3.1 < 0.8( :يعي د القيم ة َّ ،True
َّ
محققان ،أي يعيدان .True التعبيرين الرياضيين
أخيرًا ،يعيد التعبير الخارجي not (False) :القيمة ،Trueوبالتالي ستكون القيمة النهائي ة
المعادة هي:
True
فيما يلي جداول الحقيقة لمعامل الموازنة == ،والمع امالت المنطقي ة ,andو ,orو .notمن
كيفية عمله ا ،ف ذلك س يجعلك أس رع في اتخ اذ الق رارات أثن اء كتاب ة
َّ المفي د أن تحف ظ
الشيفرات البرمجية.
▲ | 194
البرمجة بلغة بايثون العمليات المنطقية (البوليانية)
ُتس تخ َدم ج داول الحقيق ة في المنط ق الرياض ياتي كث يرًا ،وهي مفي دة ،ويجب حفظه ا
قيم الش رط بإح دى القيم تين Trueأو ،Falseو ُتس تخ َدم تل ك القيم ة في اتخ اذ ق رار في
يُ َّ
البرن امج .أمَّ ا العب ارة ( )clauseفهي الكتل ة البرمجي ة ال تي تعقب الش رط وتح ِّدد نتيج ة البرن امج
ُتظه ر الش يفرة أدن اه مث ااًل على مع امالت الموازن ة ال تي تعم ل م ع العب ارات الش رطية للتحكم
else:
)"print("Failing grade
ِّ
يحدد ه ذا البرن امج م ا إذا ك ان الط الب س ينجح أم يرس ب .في ح ال ك انت الدرج ة ال تي س
حص ل عليه ا الط الب تس اوي 83مثاًل ،تق ييم العب ارة األولى س يكون ،Trueوس ُي َ
طبع النص
" ."Passing gradeأمَّ ا إن كانت درجة الطالب هي ،59فتق ييم العب ارة األولى س يكون ،False
الفرع ،elseأي ةب ة المرتبط ذ التعليم امج لتنفي ينتقل البرن الي س وبالت
يمكن تقييم كل كائنات بايثون بإحدى القيمتين Trueأو ،Falseلذلك يوصي الدليل PEP 8
َّ
متوقع ة .على س بيل المث ال ،علي ك تجنب اس تخدام مث ل ه ذا التعب ير sammy == True
في برامجك.
.5خالصة الفصل
ألقين ا في ه ذا الفص ل نظ رة على الموازن ات والع امالت المنطقي ة ،باإلض افة إلى ج داول
وكيفية استخدامها.
َّ للتغيير من تجميعة عناصر .سنتعرف في هذا الفصل على القوائم وتوابعها
ِّ
تمكنك من تجمي ع البيان ات المتش ابهة ،أو ال تي القوائم مناسبة لتجميع العناصر المترابطة ،إذ
معين ا معً ا ،وت رتيب الش يفرة البرمجي ة ،وتنفي ذ التواب ع والعملي ات على ع دة قيم في
َّ ً
غرض ا تخدم
وقت واحد.
تساعد القوائم في بايثون وغيره ا من هياك ل البيان ات المركب ة على تمثي ل التجميع ات ،مث ل
تجميع ة ملف ات في مجل د على حاس وبك ،أو ق وائم التش غيل ،أو رس ائل البري د اإللك تروني
وغير ذلك.
ً
قائمة تحتوي على عناصر من نوع السالسل النصية: في المثال التالي ،سننشئ
)print(sea_creatures
الناتج:
َّ
مركب ة تت ألف من أج زاء أص غر ،وتتم يز بالمرون ة ،إذ يمكن إض افة عناص ر إليه ا، القوائم هي بيانات
وإزالته ا ،وتغييره ا .عن دما تحت اج إلى تخ زين الكث ير من القيم ،أو التك رار ( )iterateعليه ا ،وتري د
أن تملك القدرة على تعديل تلك القيم بسهولة ،فالقوائم هي خيارك األفضل.
يب دأ العنص ر األول ،أي السلس لة النص ية ،sharkعن د الفه رس ،0وتنتهي القائم ة عن د
ألن كل عنصر في قوائم بايثون يقابل ه رقم فه رس ،يمكنن ا الوص ول إلى عناص ر الق وائم
نظرًا َّ
َّ
موضح في الجدول أعاله .المث ال تتراوح أرقام الفهارس في هذه القائمة بين 0و ،4كما هو
ِّ
يوضح ذلك: التالي
'sea_creatures[0] = 'shark
'sea_creatures[1] = 'cuttlefish
'sea_creatures[2] = 'squid
'sea_creatures[3] = 'mantis shrimp
'sea_creatures[4] = 'anemone
وسي َ
طلق الخطأ :IndexError ُ النطاق،
)]print(sea_creatures[18
والمخرجات ستكون:
بدءا من .-1هذا مفيد في حال كانت لدينا قائمة طويلة ،وأردنا تحديد عنصر في نهايته.
ً
ً
أيض ا اس تخدام لقد ضممنا السلسلة النصية Sammy is aمع العنص ر ذي الفه رس .0يمكنن ا
ِّ
لضم قائمتين أو أكثر معً ا (انظر الفقرة أدناه). المعامل +
ّ
ويسهل تعديل وتحديث عناصرها. من القائمة .هذا يجعل القوائم أكثر مرونة،
إذا أردن ا تغي ير قيم ة السلس لة النص ية للعنص ر الموج ود عن د الفه رس ،1من القيم ة
'sea_creatures[1] = 'octopus
ً
أيضا تغيير قيمة عنصر باستخدام فهرس سالب: يمكننا
'sea_creatures[-3] = 'blobfish
)print(sea_creatures # ['shark', 'octopus', 'blobfish',
]''mantis shrimp', 'anemone
(جزء) من القائمة.
يمكننا باستخدام الشرائح استدعاء عدة قيم عن طري ق إنش اء مج ال من الفه ارس مفص ولة
عند إنشاء شريحة ،كما في [ ،]1: 4يبدأ االقتطاع من العنصر ذي الفهرس األول (مشموال)،
وينتهي عن د العنص ر ذي الفه رس الث اني (غ ير مش مول) ،له ذا ُطبعَ ت في مثالن ا أعاله العناص ر
س بيل المث ال ،إذا أردن ا طباع ة العناص ر الثالث ة األولى من القائم ة ،sea_creaturesيمكنن ا فع ل
ً
أيض ا اس تخدام الفه ارس الس البة عن د اقتط اع الق وائم ،تمامً ا كم ا ه و الح ال م ع يمكنن ا
الفهارس الموجبة:
هن اك معام ل آخ ر يمكنن ا اس تخدامه في االقتط اع ،ويش ير إلى ع دد العناص ر ال تي يجب أن
تخطيها (الخطوة) بعد استرداد العنصر األول من القائم ة .ح تى اآلن ،لق د أغفلن ا المعام ل ،stride
الفهرسين المحددين.
َ
س تكون الص ياغة على الش كل الت الي [ ،]x: y: zإذ يش ير zإلى الخط وة ( .)strideفي
المثال التالي ،سننشئ قائمة كبيرة ،ثم نقتطعها ،مع خطوة اقتطاع تساوي :2
س يطبع التعب ير ] numbers[1: 11: 2القيم ذات الفه ارس المحص ورة بين ( 1مش مولة)
يمكنن ا ح ذف المُ ع املين األوَّ ل يين ،واس تخدام الخط وة وح دها بع ِّدها مع اماًل وف ق الص ياغة
التالية:]::z[ :
فهارس ها من مض اعفات .3يجع ل اس تخدام الفه ارس الموجب ة والس البة ومعام ل الخط وة في
ِّ
لضم ( )concatenateقائمتين أو أكثر معً ا: يمكن استخدام العامل +
)print(sea_creatures + oceans
والمخرجات هي:
يمكن اس تخدام العام ل +إلض افة عنص ر (أو ع دة عناص ر) إلى نهاي ة القائم ة ،لكن ت ذكر أن
ُ
يمكن اس تخدام العام ل * لمض اعفة الق وائم ( .)multiply listsربم ا تحت اج إلى عم ل ن ِس ٍ
خ
لجميع الملفات الموجودة في مجلد على خادم ،أو مشاركة قائمة أفالم مع األصدقاء؛ ستحتاج في
)print(sea_creatures * 2
)print(oceans * 3
والنتيجة ستكون:
ً
أيضا استخدام الشكلين المركبين للعاملين +و * مع عامل اإلسناد = .يمكن اس تخدام يمكننا
الع املين المرك بين = +و =* لملء الق وائم بطريق ة س ريعة ومُ ؤتمت ة .يمكن ك اس تخدام ه ذين
الع املين لملء الق وائم بعناص ر نائب ة ( )placeholdersيمكن ك تع ديلها في وقت الح ق بالم دخالت
في المثال الت الي ،سنض يف عنص رًا إلى القائم ة .sea_creaturesس يعمل ه ذا العنص ر مث ل
عمل العنصر النائب ،ونود إضافة هذا العنصر النائب ع دة م رات .لفع ل ذل ك ،سنس تخدم العام ل =+
for x in range(1,4):
]'sea_creatures += ['fish
)print(sea_creatures
والمخرجات ستكون:
sharks = ['shark']
for x in range(1,4):
sharks *= 2
print(sharks)
:الناتج سيكون
['shark', 'shark']
['shark', 'shark', 'shark', 'shark']
['shark', 'shark', 'shark', 'shark', 'shark', 'shark', 'shark',
'shark']
.الفهرس المحدد
▲ | 206
البرمجة بلغة بايثون النوع :Listمدخل إلى القوائم
]del sea_creatures[1
)print(sea_creatures # ['shark', 'blobfish', 'mantis
]'shrimp', 'anemone', 'yeti crab
اآلن ،العنصر ذو الفهرس ،1أي السلسلة النصية ،octopusلم يعد موجو ًدا في قائمتنا.
]del sea_creatures[1:4
)print(sea_creatures # ]'['shark', 'anemone', 'yeti crab
(غير مشمول) ،والقائمة أضحت مكوَّ نة من 3عناصر فقط بعد إزالة 3عناصر منها.
تسمى القوائم المُ تضمّ نة داخل قوائم أخرى بالقوائم المتشعبة (.)nested lists
'sea_names[0][0] = 'shark
'sea_names[0][1] = 'octopus
'sea_names[0][2] = 'squid
'sea_names[0][3] = 'mantis shrimp
'sea_names[1][0] = 'Sammy
'sea_names[1][1] = 'Jesse
'sea_names[1][2] = 'Drew
'sea_names[1][3] = 'Jamie
واع قابل ٌة للتغي ير ( )mutableعلى عكس السالس ل النص ية ال تي ال يمكن تغييره ا،
القوائم أن ٌ
فعندما تستخدم تابعً ا على قائمة ما ،ستؤثر في القائمة نفسها ،وليس في نسخة منها.
ً
أسماكا أو أزلناها من الحوض. األسماك الموجودة في الحوض ،وسنعدلها كلمَّ ا أضفنا
سنض يف س مكة جدي دة إلى الح وض ،ون ود بالمقاب ل أن نض يف تل ك الس مكة إلى قائمتن ا.
)'fish.append('flounder
)print(fish
# ]'['barracuda', 'cod', 'devil ray', 'eel', 'flounder
اآلن ،ص ارت ل دينا قائم ة من 5عناص ر ،تنتهي بالعنص ر ال ذي أض فناه للت و ع بر
التابع )(.append
أن قائم ة
لق د أض فنا إلى ح وض الس مك س مكة جدي دة من ن وع .anchovyربم ا الحظت َّ
ترتيبا أبج ديًا ح تى اآلن ،له ذا الس بب ال نري د إفس اد ال ترتيب ،ولن نض يف السلس لة
ً األسماك مرتبة
النصية anchovyإلى نهاية القائمة باستخدام الدالة )(list.append؛ بداًل من ذلك ،سنس تخدم
التابع )( list.insertإلضافة anchovyإلى بداية القائمة ،أي عند الفهرس :0
)'fish.insert(0,'anchovy
)print(fish
# ['anchovy', 'barracuda', 'cod', 'devil ray', 'eel',
]''flounder
وة واح ً
دة إلى األم ام .ل ذلك ،سيص بح العنص ر س تتقدم فه ارس العناص ر التالي ة خط ً
الفهرس .5
سنحض ر اآلن س مكة من ن وع damselfishإلى الح وض ،ون رغب في الحف اظ على ال ترتيب
رس :3 د الفه ر عن ذا العنص عه ذلك سنض ة أعاله ،ل ر القائم دي لعناص األبج
)'.fish.insert(3,'damselfish
ِّ
توسع قائمة بعناصر قائم ة أخ رى ،فيمكن ك اس تخدام الت ابع )،list.extend(L إذا أردت أن
سنض ع في الح وض أربع ة أس ماك جدي دة .أن واع ه ذه األس ماك مجموع ة معً ا في
القائمة :more_fish
أن
سنض يف اآلن عناص ر القائم ة more_fishإلى قائم ة األس ماك ،ونطب ع القائم ة لنتأك د من َّ
)fish.extend(more_fish
)print(fish
إلزال ة عنص ر من قائم ة ،اس تخدم الت ابع ) ،list.remove(xوال ذي يزي ل أول عنص ر من
ً
أبحاث ا عن ج اءت مجموع ة من العلم اء المحل يين لزي ارة الح وض ،وس يجرون
النوع ،kissing gouramiوطلبوا استعارة السمكة ،kissing gouramiلذلك نود إزالة العنص ر
)'fish.remove('kissing gourami
)print(fish
والمخرجات ستكون:
بع د اس تخدام الت ابع )( ،list.removeلم يع د العنص ر kissing gouramiموج و ًدا
في القائمة.
في ح ال اخ ترت عنص رًا xغ ير موج ود في القائم ة ومرَّ رت ه إلى الت ابع )(،list.remove
لن يزي ل الت ابع )( list.removeإال أوَّ ل عنص ر تس اوي قيمت ه قيم ة العنص ر المُ م رَّ ر إلى
التابع ،لذلك إن ك انت ل دينا س مكتان من الن وع kissing gouramiفي الح وض ،وأعرن ا إح داهما
المطابق فقط.
يعي د الت ابع )] list.pop ([iالعنص ر الموج ود عن د الفه رس المح دد من القائم ة ،ثم يزي ل
فهرس ا
ً أن هذا المعامل اختي اري ،ل ذا ،إذا لم تح دد
ذلك العنصر .تشير األقواس المربعة حول iإلى َّ
لقد أصبح حجم السمكة devil rayكبي ًرا ج ًدا ،ولم يعد الحوض يس عها ،ولحس ن الح ظ َّ
أن
هناك حوض سمك في بلدة مجاورة يمكنه استيعابها .سنستخدم التابع )( ،.popونمرر إلي ه الع دد
،3الذي يساوي فهرس العنص ر ،devil rayبقص د إزالت ه من القائم ة .بع د إع ادة العنص ر ،س نتأكد
مرر َّ
تمكنا من إزالة السمكة ray devilمن قائمة األسماك .إذا لم ُن ِّ باستخدام التابع )(.pop
من القائمة.
يص عب في الق وائم الكب يرة تحدي د فه ارس العناص ر ال تي تحم ل قيم ة معين ة .ألج ل ذل ك،
يمكنن ا اس تخدام الت ابع ) ،list.index(xإذ يمث ل الوس يط xقيم ة العنص ر المبح وث عن ه ،وال ذي
نري د معرف ة فهرس ه .إذا ك ان هن اك أك ثر من عنص ر واح د يحم ل القيم ة ،xفس ُيعَ اد فه رس
العنصر األول.
سوف يُ َ
طل ق خطأ في حال مرَّ رنا قيمة غير موجودة في القائمة إلى التابع )(..index
ُ
أحيان ا نرغب في تعديل عناصر قائمةٍ والتجريب عليها ،مع الحفاظ على القائمة األصلية دون
تغيير؛ يمكننا في هذه الحالة استخدام التابع )( list.copyإلنشاء نسخة من القائمة األصلية.
)(fish_2 = fish.copy
)print(fish_2
# ['anchovy', 'barracuda', 'cod', 'eel', 'flounder', 'goby',
]''herring', 'ide
يمكنن ا عكس ت رتيب عناص ر قائم ة باس تخدام الت ابع )( .list.reverseفي المث ال الت الي
)(fish.reverse
)print(fish # ['ide', 'herring', 'goby', 'flounder', 'eel',
]''cod', 'barracuda', 'anchovy
بع د اس تخدام الت ابع )( ،.reverseص ارت القائم ة تب دأ بالعنص ر ،ideوال ذي ك ان في نهاي ة
القائمة من قبل ،كما ستنتهي القائمة بالعنصر ،anchovyوالذي كان في بداية القائمة من قبل.
يعي د الت ابع ) list.count(xع دد م رات ظه ور القيم ة xفي القائم ة .ه ذا الت ابع مفي د في
حال كنا نعمل على قائمة طويلة بها الكثير من القيم المتطابقة.
إذا ك ان ح وض الس مك كب يرًا ،على س بيل المث ال ،وك انت عن دنا ع دة أس ماك من الن وع
،neon tetraفيمكننا استخدام التابع )( .countلتحديد العدد اإلجمالي ألسماك هذا النوع.
رة واح ً
دة فق ط في القائم ة ،ل ذا س ُيعيد الت ابع )(.count تظه ر السلس لة النص ية gobyم ً
ً
أيض ا م ع قائم ة مكوَّ ن ة من أع داد ص حيحة ،ويوض ح المث ال الع دد .1يمكنن ا اس تخدام ه ذا الت ابع
التالي ذلك.
مناس بة ألعماره ا .ه ذه القائم ة الثاني ة المُ س ماة fish_agesتتواف ق م ع أن واع الس مك في
ألن األسماك ال تي ال يتج اوز عمره ا عامً ا واح ًدا له ا احتياج ات غذائي ة خاص ة،
القائمة .fishنظ ًرا ّ
]fish_ages = [1,2,4,3,2,1,1,2
))print(fish_ages.count(1 # 3
يظه ر الع دد الص حيح 1في القائم ة fish_agesثالث م رات ،ل ذلك يعي د الت ابع )(.count
العدد .3
ُ
استدعِ ي معها .سنستخدم قائم ة يُ ستخدم التابع )( list.sortلترتيب عناصر القائمة التي
)(fish_ages.sort
)print(fish_ages # ][1, 1, 1, 2, 2, 2, 3, 4
مرت ً
بة. َّ ُ
فستعاد تلك القائمة باستدعاء التابع )( .sortمع القائمة ، fish_ages
بعد االنتهاء من العمل على قائمة م ا ،يمكن ك إزال ة جمي ع العناص ر الموج ودة فيه ا باس تخدام
التابع )(.list.clear
ق ررت الحكوم ة المحلي ة االس تيالء على ح وض الس مك الخ اص بن ا ،وجعل ه مس احة عامة
يس تمتع به ا س كان م دينتنا .نظ رً ا ألنن ا لم نع د نعم ل على الح وض ،فلم نع د بحاج ة إلى االحتف اظ
)(fish.clear
)print(fish # ][
أقواس ا معقوف ة نتيج ة اس تدعاء الت ابع )( .clearعلى القائم ة ،fish
ً ن رى في المخرج ات
المتسلس لة ال تي يمكن ال دوران على عناص رها ع بر حلق ات التك رار ،بم ا في ذل ك السالس ل النص ية
والص فوف .من ناحي ة ال تركيب اللغ وي ،تحت وي list comprehensionsعلى عنص ر يمكن الم رور
ت ِّ
وفر list comprehensionsطريق ًة مختلف ًة إلنش اء الق وائم وغيره ا من أن واع البيان ات
المتسلسلة .وعلى الرغم من إمكانية استخدام الطرائق األخرى لل دوران ،مث ل حلق ات ،forإلنش اء
في برنامجك.
ُ
ستس نَد القائم ة ،أو أي ن وع من البيان ات يمكن الم رور على عناص ره ،إلى متغ ير .المتغ يرات
اإلض افية –ال تي ُتش ير إلى عناص ر موج ودة ض من ن وع البيان ات ال ذي يمكن الم رور على عناص ره–
ُتب نى ح ول عب ارة .forوالكلم ة المحج وزة inتس تعمل بنفس اس تعمالها في حلق ات forوذل ك
ً
مبنية على سلسلةٍ نصية: ً
قائمة مثال يُ ِ
نشئ لمرور على عناصر .iterableلننظر إلى
ٍ
ً
دة إلى المتغ ير ،shark_lettersواس تعملنا أس ندنا في المث ال الس ابق قائم ًة جدي
المتغ ير letterلإلش ارة إلى العناص ر الموج ودة ض من السلس لة النص ية ' .'sharkاس تعملنا بع د
ذل ك الدال ة )( printلكي نتأك د من القائم ة الناتج ة والمُ س نَدة إلى المتغ ير ،shark_letters
تت ألف القائم ة ال تي أنش أناها باس تخدام list comprehensionsمن العناص ر ال تي تك ِّون
حلق ة forبص يغة .list comprehensionsلنع د كتاب ة المث ال الس ابق ال ذي أنش أنا في ه القائم ة
ف اعدنا في فهم كي ذا سيس ة ،forوه تخدام حلق shark_lettersباس
][ = shark_letters
)print(shark_letters
عن د إنش ائنا للقائم ة ع بر اس تخدام الحلق ة ،forفيجب تهيئ ة المتغ ير ال ذي س ُنس نِد العناص ر
إلي ه كقائم ة فارغ ة ،وه ذا م ا فعلن اه في أوّ ل س طر من الش يفرة الس ابقة .ثم ب دأت حلق ة for
ً
تعملة المتغ ير letterلإلش ارة إلى قيم ة بال دوران على عناص ر السلس لة النص ية ' 'sharkمس
العنصر الح الي ،ومن ثم أض فنا ك ل عنص ر في السلس لة النص ية إلى القائم ة ض من حلق ة forوذل ك
ل ابقة يماث ة forالس اتج من حلق ة ) .list.append(xالن تخدام الدال باس
يمكن إعادة كتابة List comprehensionsكحلقات ،forلكن بعض حلقات forيمكن إع ادة
يمكن اس تخدام التع ابير الش رطية في list comprehensionلتع ديل الق وائم أو أن واع
س ُن ِ
نش ئها ال تي تس مى .fish_listاس تعملنا forو inكم ا في القس م الس ابق ،لكنن ا أض فنا هن ا
التعليم ة الش رطية .ifس تؤدي التعليم ة الش رطية ifإلى إض افة العناص ر غ ير المس اوية للسلس لة
النص ية ' ،'octopusل ذا س تحتوي القائم ة الجدي دة على العناص ر الموج ودة في بني ة ص ف
( )tupleوال تي ال ُتط ا ِبق الكلم ة ' .'octopusعن د تش غيل البرن امج الس ابق فس نالحظ َّ
أن القائم ة
العنصر ':'octopus
أي أصبحت القائمة الجديدة تحتوي على بنية صف أصلية لكن ما عدا السلس لة النص ية ال تي
ست َ
نش أ باس م number_listس تحتوي على مرب ع جمي ع القيم الموج ودة من القائم ة ال تي ُ
المجال 0إلى 9لكن إذا كان الرقم قاباًل للقسمة على .2وستبدو المخرجات اآلتية:
ِّ
نفكر بال ذي س يظهر إذا دعنا ُن ِّ
فصل ما الذي يفعله تعبير list comprehensionالسابق ،ودعنا
الناتج:
][0, 1, 2, 3, 4, 5, 6, 7, 8, 9
الناتج:
][0, 2, 4, 6, 8
أ َّدت التعليم ة الش رطية ifإلى قب ول العناص ر القابل ة للقس مة على 2فق ط وإض افتها إلى
القائم ة ،مم ا ي ؤدي إلى ح ذف جمي ع األرق ام الفردي ة .يمكنن ا اآلن اس تخدام معام ل رياض ي ل تربيع
ً
أيضا استعمال ما يشبه عبارات ifالمتشعبة في تعابير :list comprehension يمكننا
أن المتغ ير xقاب ل للقس مة على ال رقم ،3ثم س نتحقق إن ك ان المتغ ير x
التحقق أواًل َّ
ُّ س يتم
وسي َ
ظهر في الناتج: ُ
يمكن اس تخدام تعليم ة ifالش رطية لتحدي د م ا هي العناص ر ال تي نري د إض افتها إلى
القائمة الجديدة.
يمكن اس تعمال حلق ات التك رار المتش عبة إلج راء ع ِّدة عملي ات دوران متداخل ة في برامجن ا.
ير ا إلى تعب نحاول تحويله عبة وس ة forمتش م إلى حلق ذا القس ننظر في ه س
][ = my_list
)print(my_list
تضرب الشيفرة السابقة العناصر الموجودة في أوَّ ل قائمة بالعناصر الموجودة في ثاني قائمة
في ك ل دورة .لتحوي ل م ا س بق إلى تعب ير ،list comprehensionوذل ك باختص ار الس طرين
ستلي هذه العملية حلقة forالخارجية ،ثم يليه ا حلق ة forالداخلي ة؛ وسنض يف تعب ير )(print
أن ناتج القائمة الجديدة يُ طا ِبق ناتج البرنامج الذي فيه حلقتين متداخلتين:
للتأكد َّ
الناتج:
أدى اس تعمال تعب ير list comprehensionفي المث ال الس ابق إلى تبس يط حلقتَي for
ستس نَد إلى المتغ ير .my_listت ِّ
وفر لن ا لتصبحا سط ًرا وحي ًدا ،لكن م ع إنش اء نفس القائم ة وال تي ُ
ً
يطة إلنش اء الق وائم ،مم ا يس مح لن ا باختص ار ع ِّدة أس طر تع ابير list comprehensionطريق ًة بس
َّ
ومعقدة ،فمن األفض ل حينه ا تحويله ا إلى بحت تع ابير list comprehensionطويل ًة ج ًدا
َ إذا أص
.9خالصة الفصل
الق وائم هي ن وع بيان ات م رن يمكن تعديل ه بس هولة خالل أط وار البرن امج .غطين ا في ه ذا
َّ
والض م. الفصل الميزات والخصائص األساس ية لق وائم ،بم ا في ذل ك الفهرس ة واالقتط اع والتع ديل
ُ
هياكل بيانات مرنة ومفيدة للغاية .كما لمَّ ا كانت القوائم تسلسالت قابلة للتغيير (َّ ،)mutable
فإنها
تتيح لنا توابع القوائم إجراء العديد من العمليات على القوائم بسهولة ،إذ يمكنن ا اس تخدام التواب ع
تسمح تعابير list comprehensionلنا بتحويل قائمة أو أي نوع من البيانات المتسلسلة إلى
بسيط يُ ِّ
قلل عدد األسطر التي نكتبها .تتبع تعابير list comprehension ٌ ٌ
شكل سلسلةٍ جديدة ،ولها
أن
حيح َّ
ٌ معي ًن ا ،ل ذا ق د يج دها الم برمجون أول و الخلفي ة الرياض ية س هلة الفهم .وص
ّ ش كاًل رياض ًيا
تع ابير list comprehensionتختص ر الشيفرةـ لكن من المهم جع ل س هولة ق راءة الش يفرة من
غير القابلة للتب ديل ،وبالت الي ال يمكن تع ديل القيم الموج ودة فيه ا .يس تعمل ن وع البيان ات tuple
قوسين ( ) ويُ َ
فصل بينه ا بفاص لة أجنبي ة ,وتب دو القيم الفارغ ة كم ا يلي )( = ،coralلكن إذا
.coralإذا اس تخدمنا الدال ة )( printعلى الن وع ،tuple مث ل )= ('blue coral',
أن القيمة الناتجة ستوضع بين قوسين: فسنحصل على الناتج اآلتي الذي يُ ّ
بين َّ
)print(coral
('blue coral', 'staghorn coral', 'pillar coral', 'elkhorn
)'coral
عن د التفك ير ب النوع tupleوغ يره من ب نى البيان ات ال تي ُتع ُّد من أن واع «التجميع ات»
( ،)collectionsفمن المفي د أن تض ع ببال ك مختل ف التجميع ات الموج ودة في حاس وبك :تش كيلة
الملف ات الموج ودة عن دك ،وق وائم التش غيل للموس يقى ،والمفض لة الموج ودة في متص فحك،
ورس ائل بري دك اإللك تروني ،ومجموع ة مق اطع الفي ديو ال تي تس تطيع الوص ول إليه ا من التلف از،
والكثير .نوع ( tupleصف) شبيه بالنوع ( listقائمة) ،لكن القيم الموجودة فيه ال يمكن تعديلها،
القوائم (.)lists
.1فهرسة الصفوف
يمكن الوصول إلى كل عنصر من عناصر الصف بمفرده َّ
ألنه سلسلة مرتب ة من العناص ر ،وذل ك
عبر الفهرسة .وكل عنص ر يرتب ط ب رقم فه رس ،ال ذي ه و ع دد ص حيح يب دأ من الفه رس .0س تبدو
فه رس مرتب ط ب ه ،فس نتمكن من الوص ول إلى عناص ره ف رادى .يمكنن ا اآلن الوص ول إلى عنص ر
)]print(coral[2
pillar coral
تتراوح قيم الفهارس في المتغير coralمن 0إلى 3كما ه و ظ اهر في الج دول الس ابق ،ل ذا
]coral[0
]coral[1
]coral[2
]coral[3
إذا حاولن ا اس تدعاء المتغ ير coralم ع رقم فه رس أك بر من ،3فس تظهر رس الة خط أ تش ير
)]print(coral[22
# IndexError: tuple index out of range
ً
أيض ا الوص ول إلى الفه ارس باس تخدام رقم إض ً
افة إلى أرق ام الفه ارس الموجب ة ،يمكنن ا
َ
وأردت الوص ول إلى مفي ٌد ج ًدا إذا كان لديك متغ ير من الن وع tupleوك ان يحت وي عناص ر كث يرة
ً
انطالق ا من النهاي ة .ففي مثالن ا الس ابق عن ،coralإذا أردن ا اس تخدام الفه ارس أح د عناص ره
إذا أردن ا طباع ة العنص ر ' 'blue coralباس تخدام الفه ارس الس البة ،فس تبدو التعليم ة
كما يلي:
)]print(coral[-4
blue coral
يمكننا إضافة العناصر النصية الموجودة في الص ف إلى السالس ل النص ية األخ رى باس تخدام
العامل :+
اس تطعنا في المث ال الس ابق إض افة عنص ر موج ود في الفه رس 1م ع السلس لة النص ية
ً
أيضا استخدام العامل +إلضافة بنيتَي صف معً ا. ' ،'This reef is made up ofويمكننا
لنق ل َّ
أنن ا نري د ع رض العناص ر الموج ودة في وس ط المتغ ير ،coralيمكنن ا فع ل ذل ك بإنش اء
قطعة جديدة:
)]print(coral[1:3
)'('staghorn coral', 'pillar coral
ِّ
فيمثل أوَّ ل رقم مك ان ب دأ القطع ة عن د إنش اء قطع ة جدي دة –كم ا في المث ال الس ابق–
ً
متضمنة هذا الفه رس) ،ورقم الفه رس الث اني ه و مك ان نهاي ة القطع ة (دون تض مين ه ذا الفه رس (
بالقطع ة) ،وه ذا ه و الس بب وراء ع رض المث ال الس ابق للقيم المرتبط ة بالعناص ر الموج ودة في
َ
أردت تضمين إحدى نه ايتَي القائم ة ،فيمكن ك ح ذف أح د األرق ام في التعب ير الفهرسين 1و .2إذا
] ،tuple[x:yفمثاًل ،لنق ل أنن ا نري د ع رض أوَّ ل ثالث ة عناص ر من ،coralوال تي هي
' 'blue coralو ' 'staghorn coralو ' ،'pillar coralفيمكننا فعل ذلك كاآلتي:
)]print(coral[:3
)'('blue coral', 'staghorn coral', 'pillar coral
المثال السابق عرض العناصر من بداية القائم ة وتوق ف قب ل العنص ر ذي الفه رس .3لتض مين
)]print(coral[1:
)'# ('staghorn coral', 'pillar coral', 'elkhorn coral
ً
أيضا عند التقطيع ،كما فعلنا مع أرقام الفهارس الموجبة: يمكننا استخدام الفهارس السالبة
)]print(coral[-3:-1
)]print(coral[-2:
)'# ('staghorn coral', 'pillar coral
)'# ('pillar coral', 'elkhorn coral
افي يمكنن ا اس تعماله ويس مى «الخط وة» ،ويُ ش ير إلى ع دد العناص ر ال تي هنال ك معام ٌ
ل إض
ٌ
يجب تجاوزها بعد الحصول على أوّ ل عنصر من القائم ة .ح ذفنا في جمي ع أمثلتن ا الس ابقة معام ل
الخط وة ،إذ القيم ة االفتراض ية ل ه في ب ايثون هي ،1ل ذا سنحص ل على جمي ع العناص ر الموج ودة
ً
قائمة أكبر ،ثم ِّ
نقسمها ،ونعطيها القيمة 2للخطوة: الخطوة .ل ُن ِ
نشئ
العنص ر المرتب ط ب الفهرس )1و ( 11دون تض مين ذل ك العنص ر) ،ومن ثم س تخبر قيم ُة الخط وة 2
أن يتخطى عنص رً ا بين ك ل عنص رين .يمكنن ا ح ذف أوَّ ل مع املين واس تخدام معام ل
امج َّ
َ البرن
)]print(numbers[::3
)# (0, 3, 6, 9, 12
طبعن ا في المث ال الس ابق عناص ر numbersبع د ض بط قيم ة الخط وة إلى ،3وبالت الي س يتم
تخطي عنصرين.
تقطي ع الص فوف باس تخدام أرق ام الفه ارس الموجب ة والس البة واس تعمال معام ل الخط وة
باس تخدام المعام ل ،+أم ا عملي ة الض رب فباس تخدام المعام ل * .يمكن أن يُ س تخ َدم المعام ل +
ً
بعض ا .يمكنن ا إس ناد القيم الموج ودة في ب نيتَي ص ف إلى إلض افة ب نيتَي ص ف أو أك ثر إلى بعض ها
بنية جديدة:
)print(coral_kelp
الناتج:
أن المعام ل +يمكن ه إض افة ب نى ص ف إلى بعض ها ،لكن يمكن أن يس تعمل إلنش اء
حيح َّ
ٌ وص
بنية صف جديدة ناتجة عن جمع ب نى أخ رى ،لكن ال يمكن ه تع ديل بني ة ص ف موج ودة مس ً
بقا .أم ا
العام ل * فيمكن اس تخدامه لض رب ب نى ص ف ،فربم ا تري د إنش اء نس خ من الملف ات الموج ودة في
أحد المجلدات إلى الخ ادوم أو مش اركة قائم ة بالمقطوع ات الموس يقية ال تي تحبه ا م ع أص دقائك،
ففي هذه الحاالت سترغب بمضاعفة مجموعات من البيانات (أو «ضربها») .لنضرب البنية coral
)print(multiplied_coral
)print(multiplied_kelp
الناتج:
يمكنن ا باس تخدام العام ل * أن ُنك ِّرر (أو ُنض اعِ ف) ب نى ص ف ب أي ع دد من الم رات نش اء ،مم ا
سي ُن ِشئ بنى صف جديدة اعتما ًدا على محتوى البنى األصلية .خالصة ما س بق هي َّ
أن ب نى الص ف
َ
العاملين +و *. يمكن إضافتها إلى بعضها أو ضربها لتشكيل بنى صف جديدة عبر استخدام
اlen() .
)len(coral
من ذل ك بموازن ة بني تين م ع بعض هما .إذا أردن ا طباع ة ع دد عناص ر kelpو ،numbersفس يظهر
الناتج اآلتي:
))print(len(kelp
))print(len(numbers
الناتج:
4
13
عن دما نتعام ل م ع ب نى ص ف مكوَّ ن ة من عناص ر رقمي ة (بم ا فيه ا األع داد الص حيحة واألرق ام
ذات الفاصلة العشرية) ،فيمكننا استخدام الدالتين )( maxو )( minللعثور على أك بر وأص غر قيم ة
معين ة .تس مح لن ا هات ان ال دالتان باس تخراج معلوم ات تخص البيان ات
َّ موج ودة في بني ة ص ف
القابلة لإلحصاء ،مثل نت ائج االمتحان ات أو درج ات الح رارة أو أس عار المنتج ات …إلخ .لننظ ر إلى
للحصول على القيمة العظمى من بين القيم اآلتي ة فعلين ا تمري ر بني ة ص ف إلى الدال ة )(max
))print(max(more_numbers
# 95.59
الدالة )(:min
))print(min(more_numbers
# 11.12
ُأ عي َد هن ا أص غر رقم عش ري موج ودة في البني ة .يمكن االس تفادة من ال دالتين )(max
يعني َّ
أنن ا ال نس تطيع إض افة أو ح ذف أو اس تبدال العناص ر داخ ل بني ة .tupleلكن يمكنن ا إض افة
ً
بعض ا لتش كيل بني ة جدي دة كم ا رأين ا في أح د األقس ام الس ابقة. ب نيتَي tupleأو أك ثر إلى بعض ها
لنقل أننا نريد استبدال العنصر ' 'blue coralووضع العنصر ' 'black coralبداًل منه.
هو بنية قائمة ،فيمكننا تحويلها إلى قائمة ،listوذلك بالدالة )(:list
)list(coral
ً
قائمة اآلن: أصبحت بنية coral
كل ش بيهٍ بم ا س بق ،نس تطيع تحوي ل الق وائم من الن وع listإلى tupleباس تخدام
وبش ٍ
الدالة )(.tuple
.6خالصة الفصل
نوع البيانات ( tupleالصفوف) ه و مجموع ٌة من البيان ات المتسلس لة ال تي ال يمكن تع ديلها،
وي ِّ
وفر تحس ينًا في أداء برامج ك ألن ه أس رع معالج ًة من الق وائم في ب ايثون .وعن دما يراج ع
اآلخرون شيفرتك فس يعلمون من اس تخدامك لب نى tupleأن ك ال تري د تع ديل ه ذه القيم .ش رحنا
في هذا الفصل الميزات األساسية لبنى tupleبما في ذلك الفهارس وتقطيعها وتجميعها ،وعرضنا
الن وع ( dictionaryالق اموس) ه و ن وع مُ ض مَّ ن في ب ايثون .ترب ط الق واميس مف اتيح بقيم
ً
عادة لتخزين البيانات المترابطة ،مثل المعلومات المرتبطة برقم تعريف، تستخدم القواميس
باإلض افة إلى القوس ين المعقوص ين ،الح ظ وج ود النقط تين الرأس يتين ( ):في الق اموس.
أي ن وع
الكلم ات الموج ودة على يس ار النقط تين الرأس يتين هي المف اتيح ( )keysال تي ق د تك ون َّ
username •
online •
followers •
ِّ
تمثل الكلم ات الموج ودة على يمين النقط تين «القيم» ( .)valuesيمكن أن تت ألف القيم من
sammy-shark •
True •
87 •
قيم الق اموس أعاله هي إمَّ ا سالس ل نص ية أو قيم منطقي ة أو أع داد ص حيحة .س نطبع اآلن
القاموس :sammy
)print(sammy
الناتج:
نالح ظ ب النظر إلى المخرج ات تغ ير ت رتيب األزواج قيم ة-مفت اح ( .)key-valueفي اإلص دار
مرتب ا أم ال ،س تظل األزواج قيم ة-مفت اح كم ا هي ،وه ذا
ً مرتب ًة .بغض النظ ر عم ا إذا ك ان الق اموس
ِّ
سيمكنك من الوصول إلى البيانات بناء على ترابطاتها.
ً
أيضا االستعانة ببعض التوابع الجاهزة للوصول إلى القيم أو المفاتيح أو كليهما.
تتصرف القواميس مثل قواعد البيان ات ،فهي ب داًل من فهرس ة العناص ر بأع داد ص حيحة ،كما
وبالمِ ثل ،يمكن استدعاء القيم األخرى في القاموس sammyباستخدام نفس الصياغة:
ً
أيض ا اس تخدام بعض التواب ع باإلض افة إلى اس تخدام المف اتيح للوص ول إلى القيم ،يمكنن ا
)( :dict.itemsالحصول على العناصر على هيئة قائمة من أزواج ()key, value •
))(print(sammy.keys
# )]'dict_keys(['followers', 'username', 'online
يمكن اس تخدام ه ذا الت ابع لالس تعالم من الق واميس .على س بيل المث ال ،يمكنن ا البحث عن
ً
مفتاح ا followersيمث ل المت ابعين على ألن ل دى Sammyمل ف تعري ف اجتم اعي يض م
مختلف ةَّ ،
ً
مفتاح ا pointsيمث ل النق اط .كال الشبكة االجتماعية ،أما Jesseفلها مل ف تعري ف لأللع اب يض م
البريمج:
هذا ُ
sammy-shark JOctopus
True False
إمكانية اس تخدام )( dict.keysلرص د المف اتيح المش تركة بين ع َّدة ق واميس .ه ذا مفي د بش كل
وبالمث ل ،يمكنن ا اس تخدام الت ابع )( dict.valuesلالس تعالم عن القيم الموج ودة في
يُ عي د كال الت ابعين )( valuesو )( keysق وائم غ ير مرتب ة تض م مف اتيح وقيم الق اموس
إن أردت الحصول على األزواج الموجودة في القاموس ،فاستخدم التابع )(:items
))(print(sammy.items
المخرجات ستكون:
)key,من س تكون النتيج ة المع ادة على هيئ ة قائم ة مكون ة من أزواج (value
الصنف .dict_items
يمكنن ا التك رار ( )iterateعلى القائم ة المُ ع ادة باس تخدام الحلق ة .forعلى س بيل المث ال،
يمكنن ا طباع ة جمي ع مف اتيح وقيم الق اموس المح دد ،ثم جعله ا أك ثر مقروئي ة ع بر إض افة سلس لة
نصية توضيحية:
وسينتج لنا:
ك رَّ رت الحلق ة forعلى العناص ر الموج ودة في الق اموس ،sammyوطبعت المف اتيح والقيم
.2تعديل القواميس
الق واميس هي هياك ل بيان ات قابل ة للتغي ير ( ،)mutableأي يمكن تع ديلها .في ه ذا القس م،
يمكن ك إض افة أزواج قيم ة-مفت اح إلى ق اموس دون اس تخدام تواب ع أو دوال باس تخدام
الصياغة التالية:
dict[key] = value
'usernames['Drew'] = 'squidly
ً
الحقا ،فسيظهر فيه الزوج المضاف حدي ًثا. القاموس .إذا استخدمنا القاموس usernames
ِّ
ونمرر قيمة مختلفة إليه. ً
سلفا، إلى مفتاح موجود
على بعض الشبكات االجتماعية .حص ل ه ذا المس تخدم على ع دد من المت ابعين اإلض افيين الي وم،
لذلك سنح ّدث القيمة المرتبطة بالمفتاح followersثم نس تخدم الت ابع )( printللتحق ق من ّ
أن
القاموس قد عُ ِّدل.
drew['followers'] = 342
)print(drew
# }{'username': 'squidly', 'followers': 342, 'online': True
يمكنن ا اس تخدام ه ذه الطريق ة إلض افة أزواج قيم ة-مفت اح إلى الق واميس ع بر م دخالت
ّ البيانات قد حُد
ّثت # ّن أن
ًا يبي
اطبع رد
)'print('Data updated.
ِّ
سننفذ البرنامج من سطر األوامر:
python usernames.py
عندما ِّ
ننفذ البرنامج ،سنحصل على مخرجات مشابهة لما يلي:
Enter a name:
Sammy
sammy-shark is the username of Sammy
Enter a name:
Jesse
?I don't have Jesse's username, what is it
JOctopus
Data updated.
Enter a name:
عن د االنته اء من اختب ار البرن امج ،اض غط على CTRL + Cللخ روج من البرن امج .يمكن ك
تخص يص ح رف إلنه اء البرن امج (مث ل الح رف ،)qوجع ل البرن امج يُ نص ت ل ه ع بر
التعليمات الشرطية.
يوضح ه ذا المث ال كي ف يمكن ك تع ديل الق واميس بش كل تف اعلي .في ه ذا البرن امج ،بمج رد
ً
أيضا إضافة عناصر إلى القواميس وتعديلها باس تخدام الت ابع )( .dict.updateه ذا يمكننا
سنض يف المفت اح followersفي الق اموس jesseأدن اه ،و َنمنح ه قيم ة عددي ة ص حيحة
)}jesse.update({'followers': 481
أيض ا اس تخدام الت ابع )( dict.updateلتع ديل زوج قيم ة-مفت اح موج ود س ً
لفا عن ً يمكنن ا
معين.
َّ طريق استبدال قيمة مفتاح
)}sammy.update({'online': False
' 'onlineمن Trueإلى .Falseعن د اس تدعاء الت ابع )( printعلى الق اموس ،يمكن ك أن ت رى
ا اس تخدام الص ياغة إلض افة عناص ر إلى الق واميس أو تع ديل القيم ،يمكن إمّ
]del dict[key
المنصة ألجل ممارسة األلع اب ،ل ذلك س نزيل العنص ر المرتب ط بالمفت اح .pointsبع د ذل ك ،س نطبع
]'del jesse['points
)print(jesse
# }{'online': False, 'username': 'JOctopus', 'followers': 481
يزيل السطر ]' del jesse ['pointsالزوج ' points': 723من القاموس .jesse
إذا أردت مح و جمي ع عناص ر الق اموس ،فيمكن ك ذل ك باس تخدام الت ابع )(.dict.clear
ً
الحق ا في البرن امج، سي بقى هذا القاموس في الذاكرة ،وهذا مفيد في حال احتجنا إلى استخدامه
َ
سي ِّ
فرغ جميع العناصر من القاموس. بيد أنه ُ
ْ
)(jesse.clear
ً
فارغا اآلن. أن القاموس صار ُت ِ
ظهر المخرجات َّ
del jesse
)print(jesse
إذا ّ
نفذت األمر )( printبعد حذف القاموس ،jesseسوف تتلقى الخطأ التالي:
.4خالصة الفصل
ألقين ا في ه ذا الفص ل نظ رة على الن وع ( dictionaryالق واميس) في ب ايثون .تت ألف
الق واميس ( )dictionariesمن أزواج قيم ة-مفت اح ،وت وفر حاًّل ممت ً
ازا لتخ زين البيان ات دون
البيانات األخرى.
إن لم تطلع على فصل فهم أنواع البيانات ،فيمكنك الرجوع إلي ه للتع رف على أن واع البيان ات
اء على ال تخلو لغة برمج ة من التعليم ات الش رطية ( )conditional statementال تي ُت َّ
نفذ بن ً
تحقق شرط معين ،وهي تعليمات برمجية يمكنها التحكم في تنفيذ شيفرات معينة بحسب تحق ق
ُت َّ
نفذ تعليم ات ب رامج ب ايثون من األعلى إلى األس فل ،م ع تنفي ذ ك ل س طر بحس ب ترتيب ه.
باستخدام التعليم ات الش رطية ،يمكن لل برامج التحق ق من اس تيفاء ش روط معين ة ،ومن ثم تنفي ذ
الشيفرة المقابلة.
إن حص لت طالب ة على أك ثر من ٪65في االمتح ان ،ف أعلن عن نجاحه ا؛ وإال ،ف أعلن •
عن رسوبها
إذا كان لديه مال في حسابه ،فاحسب الفائدة .وإال ،فاحسب غرامة •
إن اشتروا 10برتقاالت أو أكثر ،فاحسب خصمً ا بمقدار ٪5؛ وإال فال تفعل •
.1التعليمة if
سنبدأ بالتعليمة ،ifوالتي تتحقق مما إذا تحقق شرط مح َّدد أم ال ،وفي حال تحق ق الش رط،
َّ
فستنفذ الشيفرة المقابلة له .لنبدأ بأمثلة عملية توضح ذلك .افتح ً
ملفا ،واكتب الشيفرة التالية:
grade = 70
if grade >= 65:
)"درجة النجاح"(print
أعطين ا للمتغ ير gradeالقيم ة .70ثمَّ اس تخدمنا التعليم ة ifلتق ييم م ا إذا ك ان المتغ ير
gradeأك بر من (=>) أو يس اوي .65وفي تل ك الحال ة ،س يطبع البرن امج السلس لة النص ية التالي ة:
"درجة النجاح".
ألنه ا أك بر من ،65
باستخدام األمر .python grade.pyفي هذه الحالة ،الدرجة 70تل بي الش رطّ ،
درجة النجاح
لنغير اآلن نتيجة هذا البرنامج عبر تغيير قيمة المتغير gradeإلى :60
ّ
grade = 60
balance = -5
أعطينا للمتغ ير balanceالقيم ة ،-5وهي أق ل من 0في البرن امج الس ابق .ولمَّ ا ك ان الرص يد
توفيا لش رط التعليم ة ( ifأي ،)balance < 0فسنحص ل على سلس لة نص ية في المخرج ات
ً مس
بمجرد حفظ الشيفرة وتنفيذها .مرة أخرى ،لو غيرنا الرصيد إلى القيمة 0أو إلى عدد م وجب ،فلن
أي مخرجات.
نحصل على ّ
.2التعليمة else
ق د تري د من البرن امج أن يفع ل ش يًئا م ا في ح ال ع دم تحق ق ش رط التعليم ة .ifفي المث ال
أعاله ،نريد طباعة مخرجات في حال النجاح والرسوب .ولفع ل ذل ك ،سنض يف التعليم ة elseإلى
grade = 60
else:
)"درجة الرسوب"(print
إن
قيم ة المتغ ير gradeتس اوي ،60ل ذلك فش رط التعليم ة ifغ ير متحق ق ،وبالت الي ف َّ
ِّ
وننفذه ،سنحصل على المخرجات التالية: النصية "درجة الرسوب" .عندما نحفظ البرنامج
درجة الرسوب
إذا ع ّدلنا البرن امج وأعطين ا المتغ يرَ gradeالقيم ة 65أو أعلى منه ا ،فسنحص ل ب داًل من ذل ك
إلضافة التعليمة elseإلى مثال الحساب المصرفي ،سنعيد كتابة الشيفرة كما يلي:
balance = 522
else:
)".رصيدك أكبر من print("0
للتعليمة .elseإن أردت تنفيذ الشيفرة المقابلة للتعليمة ،ifغيِّ ر القيمة إلى عدد سالب.
من خالل دمج العب ارتين ifو ،elseف أنت تنش ئ تعليم ة ش رطية مزدوج ة ،وال تي س تجعل
الحاسوب ينفذ شيفرة برمجية معينة سواء تم استيفاء شرط ifأم ال.
ً
برنامجا يتحقق من عدة حاالت شرطية. ِّ
فنفذ شيفرة أخرى فقط .لكن في بعض الحاالت ،قد تريد
وألج ل ه ذا ،س وف نس تخدم التعليمة ،else ifوال تي ُتكتب في ب ايثون هك ذا .elifتش به
في برنامج الحساب المصرفي ،قد ن رغب في الحص ول على ثالث ة مخرج ات مختلف ة مقابل ة
. . .
if balance < 0:
)".الحساب فارغ ،أضف مبلغا اآلن ،أو ستحصل على غرامة"(print
else:
)".رصيدك أكبر من print("0
اآلن ،هناك ثالثة مخرجات محتملة يمكن أن ُتطبع عند تنفيذ البرنامج:
إن ك ان المتغ ير balanceيس اوي ،0فسنحص ل على المخرج ات من التعليم ة ( elifأي •
قريبا.)".
ً ً
مبلغا السلسلة "الرصيد يساوي ،0أضف
إذا ُ
ض ِبط المتغ ير balanceعن د ع دد م وجب ،فس وف نحص ل على المخرج ات من •
التعليمة ( elseأي طباعة السلسلة "رصيدك أكبر من .)".0
إذا ُ
ض ِبط المتغير balanceعن د ع دد س الب ،فسنحص ل على المخرج ات من التعليم ة if •
(أي السلسلة "الحساب فارغ ،أضف مبلغا اآلن ،أو ستحصل على غرامة").
ماذا لو أردنا أن نأخذ بالحس بان أك ثر من ثالث ة احتم االت؟ يمكنن ا كتاب ة ع دة تعليم ات elif
س نحتاج لتنفي ذ ه ذه الش يفرة إلى تعليم ة ifواح د ،وثالث تعليم ات ،elifوتعليم ة else
دعن ا نعي د كتاب ة الش يفرة من المث ال أعاله لطباع ة سلس لة نص ية مقابل ة لك ل عالم ة .يمكنن ا
. . .
if grade >= 90:
)"print("A
else:
)"print("F
ُت ّ
نفذ التعليمات elifبالترتيب .هذا البرنامج سيكمل الخطوات التالية:
.4تعليمات ifالمتشعبة
بع د أن تتع ود على التعليم ات ifو elifو ،elseيمكن ك االنتق ال إلى التعليم ات الش رطية
ِّ
المتشعبة في الحاالت التي نري د فيه ا التحق ق من ش رط ث انوي يمكننا استخدام تعليمات if
ُّ
التأكد من تحقق الشرط الرئيسي .لهذا ،يمكننا حشر تعليمة if-elseداخل تعليم ة if-else بعد
انت ا إذا ك امج مم يتحقق البرن حيحة ،فس انت statement1ص إذا ك •
ً
أيض ا .إذا ك انت كلت ا الح التين ص حيحتان ،فسنحص ل nested_statementص حيحة
true
yes
المخرجات التالية:
true
no
ست ّ
نفذ التعليمة elseوحدها ،والمخرجات ستكون: ُ
false
ً
أيضا استخدام عدة تعليمات ifمتشعبة في الشيفرة: يمكن
في الشيفرة البرمجية أعاله ،هناك تعليمات ifو elifمتش ِّعبة داخ ل ك ل تعليم ات .ifه ذا
دعن ا نلقي نظ رة على مث ال لتعليم ات ifمتش عبة في البرن امج .grade.pyيمكنن ا التحق ق
حقق الط الب درج ة النج اح (أك بر من أو تس اوي ،)٪65ثم نح ِّدد العالم ة المقابل ة
أواًل مم ا إذا َّ
ِّ
يحقق الط الب درج ة النج اح ،فال داعي للبحث عن العالم ة المقابل ة للدرج ة ،وب داًل للدرج ة .إذا لم
من ذلك ،يمكن أن نجعل البرنامج يطبع سلسلة نصية فيها إعالن عن رسوب الطالب.
. . .
if grade >= 65:
)":درجة النجاح"(print
else:
)"print("F
امج "درج ة
فسيس توفى الش رط األول ،وس َيطبع البرن ُ
ُ إذا أعطين ا للمتغ ير gradeالقيم ة ،92
ُ
فستطبع .A ً
أيضا، متحقق
َ
توفى الش رط األول ،ل ذلك س يتخطى أمَّ ا إذا أعطين ا للمتغ ير gradeالقيم ة ،60فلن يُ س
ِّ
المتشعبة ،وينتقل إلى التعليمة ،elseويطبع .F البرنامج تعليمات if
يمكننا بالطبع إضافة المزيد من الخيارات ،واستخدام طبقة ثانية من تعليم ات ifالمتش ِّعبة.
ربما نود إض افة ال درجات التفص يلية A+و Aو .A-يمكنن ا القي ام ب ذلك عن طري ق التحق ق أواًل من
التحقق مم ا إذا ك انت الدرج ة تس اوي 90أو أعلى ،ثم التحق ق مم ا إذا
ُّ اجتي از درج ة النج اح ،ثم
كانت الدرجة تتجاوز ،96وفي تلك الحالة ستقابل العالمة .A+اطلع على المثال التالي:
. . .
if grade >= 65:
)":درجة النجاح"(print
)"print("A
في الشيفرة أعاله ،في حال تعيين المتغير gradeعند القيمة ،96سيقوم البرنامج بما يلي:
التحقق مما إذا كانت الدرجة أكبر من ،93وأقل من أو تساوي ( 96صحيح) •
:درجة النجاح
A
تساعد تعليمات ifالمتشعبة على إضافة عدة مستويات من الشروط الفرعية إلى الشيفرة.
.5خالصة الفصل
س تتحكم باس تخدام التعليم ات الش رطية ،مث ل التعليم ة ،ifفي مس ار البرن امج أي ت دفق
معين من
َّ ُّ
التحقق من اس تيفاء ش رط تنفي ذ الش يفرة .تطلب التعليم ات الش رطية من البرن امج
فست َّ
نفذ شيفرة معينة ،وإال فسيس تمر تنفي ذ البرن امج وينتق ل إلى ُ عدمه .وإذا تم استيفاء الشرط،
األسطر التالية.
يمكنك الدمج بين التعليمات الشرطية والمعامالت المنطقي ة ،بم ا فيه ا andو ،orواس تخدام
نستفيد من البرامج الحاسوبية خير استفادة في أتمتة المهام وإجراء المه ام التكراري ة لكيال
نحتاج إلى القيام بها يدويً ا ،وإحدى طرائ ق تك رار المه ام المتش ابهة هي اس تخدام حلق ات التك رار
( ،)loopsوسنشرح في ه ذا الفص ل حلق تي التك رار الش هيرتين في ب ايثون -وس ائر لغ ات البرمج ة-
( ،)booleanوسيس تمر تنفي ذ ه ذه الش يفرة لطالم ا ك انت نتيج ة التعب ير المس تعمل معه ا
َّ
محق ًقا. ٌ
شرط ما تساوي trueأي طالما كان
أن حلق ة whileهي عب ارة ش ريطة تكراري ة؛ فبع د انته اء تنفي ذ التعليم ة
يمكن ك أن تتخي ل َّ
الش رطية ،ifيُ س َتكمَ ل تنفي ذ بقي ة البرن امج ،لكن م ع حلق ة whileفس يعود تنفي ذ البرن امج إلى
بداي ة الحلق ة بع د انته اء تنفي ذها إلى أن يص بح الش رط مس اويًا للقيم ة falseأي لم يع د
َّ
محق ًقا. الشرط
معين ،لذا لن تحتاج إلى عدد مرات تنفيذ الحلقة قبل إنشائها.
َّ شرط
ٍ حلقات whileاعتما ًدا على
سيس تمر تنفي ذ التعليم ات البرمجي ة الموج ودة داخ ل الحلق ة إلى أن يُ َّ
قيم الش رط ال ذي يلي
ً
برنامجا صغيرًا في ه حلق ة ،whileففي ه ذه البرن امج س نطلب من المس تخدم إدخ ال ل ُن ِ
نشئ
إمَّ ا أن تكون كلمة المرور صحيحة ،فعندها سينتهي تنفيذ حلقة .while •
أو أن تكون كلمة المرور غير صحيحة ،فعندها سيستمر تنفيذ حلقة التكرار. •
َّ
المفض ل ،ولنب دأ بتهيئ ة ِّ
محررن ا النص ي نش ئ ً
ملف ا باس م password.pyفي ل ُن ِ
'' = password
نس تخدم المتغ ير الس ابق للحص ول على م دخالت المس تخدم داخ ل حلق ة التك رار .while
علينا بعد ذلك إنشاء حلقة whileمع تحديد ما هو الشرط الذي يجب تحقيقه:
'' = password
أتبعن ا –في المث ال الس ابق– الكلم ة المحج وزة whileب المتغير ،passwordثمَّ س نتحقق إذا
َ
المستخدم أيّ ة سلس لة نص ية ال تس اوي passwordفس ُيكمَ ل تنفي ذ الحلق ة .علين ا بع د ذل ك إض افة
'' = password
َّ
نفذ البرنامج عب ارة printداخ ل حلق ة whileوال تي تس أل المس تخدم عن كلم ة م روره ،ثم
أس ندنا قيم ة م دخالت المس تخدم (ال تي حص لنا عليه ا ع بر الدال ة )( )inputإلى المتغ ير
َّ
يتحقق البرن امج إذا ك انت قيم ة المتغ ير passwordتس اوي السلس لة النص ية .passwordس
َّ
تحقق ذل ك فس ينتهي تنفي ذ حلق ة .whileلنض ف س طرًا آخ ر إلى البرن امج ' ،'passwordوإذا
ً
مساوية إلى :false لنعرف ماذا يحدث إن أصبحت قيمة الشرط
'' = password
أن آخ ر عب ارة )( printموج ودة خ ارج حلق ة ،whileل ذا عن دما يُ دخِ ل المس تخدم
الح ظ َّ
لكن ماذا يحدث لو لم يدخل المس تخدم الكلم ة passwordق ط؟ إذ لن يس تمر تنفي ذ البرن امج ولن
ي روا آخ ر عب ارة )( printوسيس تمر تنفي ذ حلق ة التك رار إلى م ا ال نهاي ة! يس تمر تنفي ذ حلق ة
التك رار إلى م ا ال نهاي ة إذا بقي تنفي ذ البرن امج داخ ل حلق ة تك رار دون الخ روج منه ا .وإذا أردت
الخروج من حلقة تكرار نهائية ،فاضغط Ctrl+Cفي سطر األوامر .احفظ البرنامج ثم ِّ
شغله:
python password.py
س ُي َ
طلب من ك إدخ ال كلم ة الم رور ،ويمكن ك تجرب ة م ا تش اء من الكلم ات .ه ذا مث ٌ
ال عن
ناتج البرنامج:
النص وص لتحوي ل السلس لة النص ية إلى حال ة األح رف الص غيرة (على س بيل المث ال) قب ل
ُّ
التحقق منها.
ً
وائية لكي لتخمين األرقام والتي تستعمل الحلقة . whileنريد من الحاسوب أن يُ ِ
نشئ أرقامً ا عش
يحاول المستخدمون تخمينها ،لذا علينا استيراد الوحدة randomعبر اس تخدام التعليم ة import
ً
الحقُا إلى كيفي ة اس تيراد الوح دات في فص ل الوح دات) ،وإذا لم تكن ه ذه الحزم ة (س نطرق
ً
مألوفة ل ك فيمكن ك ق راءة المزي د من المعلوم ات عن تولي د األرق ام العش وائية في توثي ق ب ايثون.
َّ
المفضل: ملفا باسم guess.pyفي محررك النصي ً
بداية ً ل ُن ِ
نشئ
import random
علين ا اآلن إس ناد ع دد ص حيح عش وائي إلى المتغ ير ،numberولنجع ل مجال ه من 1إلى 25
import random
import random
number_of_guesses = 0
)(guess = input
)guess = int(guess
للحلقة لكي ال تصبح حلقتنا ال نهائية ثم سنضيف حلقة whileالتي تشترط أاّل تزيد قيمة المتغ ير
وبع د المحاول ة الخامس ة س ُيعاد المس تخدم إلى س طر األوام ر ،وإذا ح اول المس تخدم إدخ ال
أض فنا داخ ل حلق ة whileعب ارة )( printلطلب إدخ ال رقم من المس تخدم ،ثم س نأخذ
ِّ
سنحول المتغير guess مدخالت المستخدم عبر الدالة )(ُ input
ونس ِن َدها إلى المتغير ،guessثم
من سلس لة نص ية إلى ع دد ص حيح .وقب ل انته اء حلق ة التك رار ،فعلين ا زي ادة قيم ة المتغ ير
وفي النهاية ،كتبنا التعليم ة ifش رطية ل نرى إذا ك ان المتغ ير guessال ذي أدخل ه المس تخدم
ً
جاهزا لالستخدام ،ويمكننا تشغيله عبر تنفي ذ التعليمة breakللخروج من الحلقة .أصبح البرنامج
األمر التالي:
python guess.py
ً
حيحا أن البرن امج يعم ل عماًل س ليمً ا ،لكن المس تخدم لن يعلم إذا ك ان تخمين ه ص
حيح َّ
ٌ ص
ِّ
يخمن الرقم خمس م رات دون أن يعلم إذا ك انت إح دى محاوالت ه ص حيحة .ه ذا مث ال ويمكنه أن
لنضف بعض التعليمات الشرطية خ ارج حلق ة التك رار لكي يحص ل المس تخدم على معلوم ات
: وسنضيف هذه العبارات في نهاية الملف،فيما إذا استطاعوا تخمين الرقم أم ال
import random
number_of_guesses = 0
number_of_guesses = number_of_guesses + 1
if guess == number:
break
if guess == number:
print('You guessed the number in ' + str(number_of_guesses)
+ ' tries!')
else:
print('You did not guess the number. The number was ' +
str(number))
ولمس اعد.يح دث إال بع د انته اء حلق ة التك رار وبع د انته اء ع دد م رات التخمين المس موحة
▲ | 269
البرمجة بلغة بايثون مدخل إلى الحلقات:المهام التكرارية
وس تخبر تل ك التعليم اتwhile فلنض ف بعض التعليم ات الش رطية داخ ل حلق ة، المس تخدم قلياًل
، لكي يس تطيعوا تخمين ال رقم بنج اح،المس تخدم إذا ك ان تخمين ه أعلى من ال رقم أو أص غر من ه
:if guess == number وسنضيف تلك التعليمات الشرطية قبل السطر الذي يحتوي على
import random
number_of_guesses = number_of_guesses + 1
if guess == number:
break
if guess == number:
print('You guessed the number in ' + str(number_of_guesses)
+ ' tries!')
else:
print('You did not guess the number. The number was ' +
str(number))
▲ | 270
البرمجة بلغة بايثون المهام التكرارية :مدخل إلى الحلقات
ً
وفق ا ل ذلك .هنال ك الكث ير من التحس ينات ال تي يمكن إجراؤه ا على يس تطيع تع ديل تخمني ه
الشيفرة السابقة ،مثل تضمين آلية لمعالجة األخطاء التي تحدث عن دما ال يُ دخِ ل المس تخدم ع د ًدا
ً
صحيحا ،لكن كان غرضنا هو رؤي ة كيفي ة اس تخدام حلق ة whileفي برن امج قص ير ومفي د يعم ل
أن حلقات forتستعمل عندما يكون عدد مرات تنفيذ حلقة التكرار معلومً ا قبل ال دخول في
يعني َّ
ست َّ
نفذ الشيفرات الموجودة داخل حلق ة التك رار ع ِّدة م رات إلى أن تنتهي الحلق ة .لننظ ر إلى ُ
مجال من القيم:
ٍ كيفية مرور الحلقة forعلى
for i in range(0,5):
)print(i
0
1
2
3
4
ستسنَد إلى هذا المتغير من 0إلى .5ثم طبعً ا قيمة المتغير في ك ل دوران لحلق ة
مجال القيم التي ُ
أننا نميل إلى بدء العد من الرقم 0في البرمجة ،وعلى الرغم من ع رض
التكرار ،لكن أبق في ذهنك َّ
ِ
خمسة أرقام ،لكنها تبدأ بالرقم 0وتنتهي بالرقم .4من الشائع أن ترى استخدامً ا لحلق ة forعن دما
إحدى أنواع السالسل غير القابلة للتع ديل في ب ايثون هي تل ك الناتج ة من الدال ة )(،range
وتستخدم الدالة )( rangeفي حلقات التكرار للتحكم بع دد م رات تك رار الحلق ة .عن د التعام ل م ع
:startيش ير إلى القيم العددي ة الص يحية ال تي س تبدأ به ا السلس لة ،وإذا لم ُتم رَّ ر قيم ة •
:stopه ذا المعام ل مطل وب دومً ا وه و القيم ة العددي ة الص حيحة ال تي تمث ل نهاي ة •
:stepهي مقدار الخطوة ،أي عدد األرقام التي يجب زيادتها (أو إنقاصها إن كنَّا نتعام ل •
مع أرقام سالبة) في الدورة القادمة ،وقيمة المعامل stepتساوي 1إن لم ُتح َّدد له قيمة.
for i in range(6):
)print(i
0
1
2
3
4
5
المثال اآلتي من الشكل ) range(start ,stopالذي ُتمرَّ ر قيم بدء السلسلة ونهايتها:
for i in range(20,25):
)print(i
المج ال –في المث ال الس ابق– ي تراوح بين ( 20بم ا فيه ا ال رقم )20إلى ( 25باس تثناء ال رقم
20
21
22
23
24
الوس يط stepالخ اص بالدال ة )( rangeش بيه بمعام ل الخط وة ال ذي نس تعمله عن د تقس يم
السالس ل النص ية ألن ه يس تعمل لتج اوز بعض القيم ض من السلس لة .ي أتي المعام ل stepفي آخ ر
قائم ة المع امالت ال تي تقبله ا الدال ة )( rangeوذل ك بالش كل ).range(start, stop, step
for i in range(0,15,3):
)print(i
س يؤدي المث ال الس ابق إلى إنش اء سلس لة من األرق ام ال تي تب دأ من 0وتنتهي عن د 15لكن
قيمة المعامل stepهي ،3لذا سيتم تخطي رقمين في كل دورة ،أي سيكون الناتج كاآلتي:
0
3
6
9
12
ً
أيضا استخدام قيم ة س البة للمعام ل stepلل دوران إلى الخل ف ،لكن علين ا تع ديل قيم يمكننا
for i in range(100,0,-10):
)print(i
قيم ة المعام ل startفي المث ال الس ابق هي ،100وك انت قيم ة المعام ل stopهي ،0
والخط وة هي ،-10ل ذا س تبدأ السلس لة من ال رقم 100وس تنتهي عن د ال رقم ،0وس يكون التن اقص
100
90
80
70
60
50
40
30
20
10
عن دما ن برمج باس تخدام لغ ة ب ايثون ،فس نجد أنن ا نس تفيد كث يرًا من السالس ل الرقمي ة ال تي
يمكن االس تفادة من الق وائم (من الن وع )listوغيره ا من أن واع البيان ات المتسلس لة
واس تعمالها بع ِّدها مع امالت لحلق ات ،forفب داًل من ال دوران باس تخدام الدال ة )( rangeفيمكنن ا
تعريف قائمة ثم الدوران على عناصرها .س ُنسنِد في المث ال اآلتي قائم ًة إلى متغيِّ ر ،ثم سنس تخدم
اسمً ا للمتغير ،لكن يمكنك استعمال أي اسم صحيح آخر ترغب به ،وستحصل على نفس النتيجة.
hammerhead
great white
dogfish
frilled
bullhead
requiem
طر منفص ل .يش يع اس تخدام الق وائم واألن واع األخ رى من البيان ات المتسلس لة مث ل السالس ل
س ٍ
النص ية وب نى ( tupleالص فوف) م ع حلق ات التك رار لس هولة ال دوران على عناص رها .يمكن ك دمج
هذه األنواع من البيانات مع الدالة )( rangeإلضافة عناصر إلى قائمة ،مثل:
)print(sharks
الناتج:
أض فنا هن ا السلس لة النص ية ' 'sharkخمس م رات (وه و نفس ط ول القائم ة sharks
][ = integers
for i in range(10):
)integers.append(i
)print(integers
هيئنا في المث ال الس ابق قائم ًة فارغ ًة باس م integersلكن حلق ة التك رار forمألت القائم ة
ّ
][0, 1, 2, 3, 4, 5, 6, 7, 8, 9
'sammy = 'Sammy
الناتج:
S
a
m
m
y
يمكن الدوران على بنى tupleكما هو الحال في القوائم والسالسل النصية .عند المرور على
عناصر نوع البيانات ،dictionaryفمن المهم أن تبقي بذهنك البنية الخاص ة ب ه «مفت اح:قيم ة»
ٌ
بسيط نعرض فيه المفتاح ( )keyوالقيمة (:)value ٌ
مثال إليك
الناتج:
name: Sammy
animal: shark
location: ocean
color: blue
عن د اس تخدام متغ يرات من الن وع ( dictionaryق اموس) م ع حلق ات forفيك ون
ً
متعلق ا بمفت اح القيم ،وعلين ا اس تخدام الص ياغة المتغ ير المرتب ط بحلق ة التك رار
المث ال الس ابق ك ان المتغ ير المرتب ط بحلق ة التك رار باس م keyوه و يُ ِّ
مثل المف اتيح ،واس تعملنا
] sammy_shark[keyللوص ول إلى القيم ة المرتبط ة ب ذاك المفت اح .خالص ة م ا س بقُ ،تس تعمَ ل
ً
عادة للدوران على عناصر البيانات المتسلسلة وتعديلها. حلقات التكرار
ِّ
المتشعبة ج .حلقات for
يمكن تش عيب حلق ات التك رار في ب ايثون ،كم ا ه و الح ال في بقي ة لغ ات البرمج ة .حلق ة
التك رار المتش ِّعبة هي الحلق ة الموج ودة ض من حلق ة تك رار أخ رى ،وهي ش بيهة بعب ارات if
يب دأ البرن امج بتنفي ذ حلق ة التك رار الخارجي ة ،ويُ َّ
نفذ أوّ ل دوران فيه ا ،وأوَّ ل دوران س يؤدي
إلى ال دخول إلى حلق ة التك رار الداخلي ة ،مم ا ي ؤدي إلى تنفي ذها إلى أن تنتهي تمامً ا .ثم س يعود
تنفيذ البرنامج إلى بداية حلقة التكرار الخارجية ،ويبدأ بتنفيذ ال دوران الث اني ،ثم سيص ل التنفي ذ
حلق ة التك رار الخارجي ة ،وهلم ج رًا إلى أن ينتهي تنفي ذ حلق ة التك رار الخارجي ة أو إيق اف حلق ة
نفهم كي ف تعم ل بدق ة ،إذ س تمر حلق ة التك رار الخارجي ة في المث ال اآلتي على قائم ة من األرق ام
اس مها ،num_listأم ا حلق ة التك رار الداخلي ة فس تمر على قائم ة من السالس ل النص ية
اسمها :alpha_list
1
a
b
c
2
a
b
c
3
a
b
c
أن البرن امج أكم ل أوَّ ل دوران على عناص ر حلق ة التك رار الخارجي ة يُ ِ
ظه ر الن اتج الس ابق َّ
بطباع ة ال رقم ،1ومن ثم ب دأ تنفي ذ حلق ة التك رار الدخلي ة مم ا يطب ع األح رف aو bو cعلى
التوالي .وبعد انتهاء تنفيذ حلقة التكرار الداخلية ،عاد البرنامج إلى بداي ة حلق ة التك رار الخارجي ة
طابعً ا ال رقم ،2ثم ب دأ تنفي ذ حلق ة التك رار الداخلي ة (مم ا ي ؤدي إلى إظه ار aو bو cمج د ًدا).
وهكذا دواليك.
يمكن االس تفادة من حلق ات forالمتش عبة عن د الم رور على عناص ر ق وائم تت ألف من ق وائم.
فل و اس تعملنا حلق ة تك رار وحي دة لع رض عناص ر قائم ة تت ألف من عناص ر تحت وي على ق وائم،
ُ
فستعرَ ض قيم القوائم الداخلية:
الناتج:
وفي حال أردنا الوصول إلى العناصر الموجودة في القوائم الداخلية ،فيمكننا استعمال حلق ة
forمتشعبة:
الناتج:
hammerhead
great white
dogfish
0
1
2
9.9
8.8
7.7
نس تطيع االس تفادة من حلق ات forالمتش عبة عن دما نري د ال دوران على عناص ر محت وى
في قوائم.
في بعض األحي ان ،ق د يت دخل عام ل خ ارجي في طريق ة تش غيل برنامج ك ،وعن دما يح دث ذل ك،
فربم ا تري د من برنامج ك الخ روج تمامً ا من حلق ة التك رار ،أو تج اوز ج زء من الحلق ة قب ل إكم ال
تنفي ذها ،أو تجاه ل ه ذا العام ل الخ ارجي تمامً ا .ل ذا يمكن ك فع ل م ا س بق باس تخدام
ِّ
توفر لك التعليم ة breakالق درة على الخ روج من حلق ة التك رار عن د ح دوث عام ل خ ارجي.
حلقة :for
number = 0
)'print('Out of loop
تك رار forال تي تعم ل لطالم ا ك انت قيم ة المتغ ير numberأص غر من .10ثم قمن ا بزي ادة قيم ة
المتغ ير numberداخ ل حلق ة forبمق دار 1في ك ل تك رار ،وذل ك في الس طر (*) ثم ك ان هنال ك
breakللخ روج من الحلق ة ،وتوج د داخ ل حلق ة التك رار الدال ة )( printال تي ُت َّ
نفذ في ك ل تك رار
إلى أن نخرج من الحلقة عبر التعليمة ،breakإذ هي موجودة بعد التعليمة .breakلكي نتأكد أنن ا
خرجنا من الحلقة ،وضعنا عبارة )( printأخيرة موجودة خارجها .سنرى الناتج اآلتي عند
تنفيذ البرنامج:
Number is 1
Number is 2
Number is 3
Number is 4
Out of loop
أنه بمجرد أن أصبح العدد الص حيح numberمس اويً ا لل رقم ،5فس ينتهي
ظهر الناتج السابق َّ
يُ ِ
وعدم إكمال بقية الحلقة إلى نهايتها .بعبارةٍ أخرى ،سينتقل تنفي ذ البرن امج إلى أوّ ل حلق ة التك رار
عند تنفيذ التعليمة .continueيجب وضع التعليم ة continueفي الش يفرة ال تي س ُت َّ
نفذ في ك ل
ً
عادة ضمن الشرط .if تكرار للحلقة ،ويوضع
سنس تخدم نفس البرن امج ال ذي اس تعملناها لش رح التعليم ة breakأعاله ،لكنن ا سنس تخدم
number = 0
)'print('Out of loop
الف رق بين اس تخدام التعليم ة continueب داًل من breakه و إكم ال تنفي ذ الش يفرة بغض
إلى الناتج:
Number is 1
Number is 2
Number is 3
Number is 4
Number is 6
Number is 7
Number is 8
Number is 9
Number is 10
Out of loop
أن السطر ال ذي يجب أن يحت وي على Number is 5ليس موج و ًدا في المخرج ات،
نالحظ َّ
لكن س ُيكمَ ل تنفي ذ حلق ة التك رار بع د ه ذه المرحل ة مم ا يطب ع األرق ام من 6إلى 10قب ل إنه اء
تنفيذ الحلقة.
َّ
معقدة ومتش ِّعبة، يمكن ك اس تخدام التعليم ة continueلتف ادي اس تخدام تعليم ات ش رطية
ست َ
رفض نتائجها. أو لتحسين أداء البرنامج عن طريق تجاهل الحاالت التي ُ
تسمح لنا التعليمة passبالتعامل مع أحد الشروط دون إيقاف عمل حلق ة التك رار ب أي ش كل،
أي س ُت َّ
نفذ جمي ع التعليم ات البرمجي ة الموج ودة في حلق ة التك رار م ا لم تس تعمل تعليم ات تحكم
مثل breakأو continueفيها .وكما هو الحال مع التعليمات السابقة ،يجب وض ع التعليم ة pass
number = 0
)'print('Out of loop
ِّ
لنشغل البرنامج ولننظر إلى الناتج: مساواة المتغير numberللرقم .5
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
Number is 6
Number is 7
Number is 8
Number is 9
Number is 10
Out of loop
أن
تعليم ة ش رطية داخ ل حلق ة التك رار؛ إذ تخ بر التعليم ة passالبرن امج أن يكم ل التنفي ذ كم ا ل و َّ
الش رط لم يتحق ق .يمكن أن تس تفيد من التعليم ة passعن دما تكتب برنامج ك ألوّ ل م رة أثن اء
ّ
بحل مشكلة ما عبر خوارزمية ،لكن قبل أن تضع التفاصيل التقنية له. تفكيرك
.4خالصة الفصل
شرحنا في هذا الفصل كيف تعمل حلقتي التكرار ، whileو forفي بايثون وكيفية إنشائها،
إذ تس تمر األولى بتنفي ذ مجموع ة من األس طر البرمجي ة لطالم ا ك ان الش رط مس اويً ا للقيم ة true
بينم ا تس تمر الثاني ة بتنفي ذ مجموع ة من الش يفرات لع ددٍ مُ ح ِّددٍ من الم رات .انتقلن ا أخ يرًا إلى
ِّ
تكررة. والتعامل مع األحداث المفاجئة التي تحدث أثناء تنفيذ مهمة مُ
راء م ا ،ويمكن ،بع د تعريفه ا ،إع ادة الدال ة ( )functionهي كتل ة من التعليم ات ال تي ِّ
تنفذ إج ً
اس تخدامها في أك ثر من موض ع .تجع ل ال دوال الش يفرة تركيبي ة ( ،)modularمم ا يس مح
ِّ
تحول أنواع البيانات النصية أو العددية إلى أعداد صحيحة، )( intوالتي •
.1تعريف دالة
مرحبا بالعالم!" إلى دالة.
ً لنبدأ بتحويل البرنامج الذي يطبع عبارة "
أنش ئ ً
ملف ا نص ًيا جدي ًدا ،وافتح ه في مح رر النص وص المفض ل عن دك ،ثم اس تدع البرن امج
ُ .hello.pyتع رَّ ف الدال ة باس تخدام الكلم ة المفتاحي ة ،defمتبوع ة باس م من اختي ارك ،متبوعً ا
بقوسين يمكن أن يَحتويا المعامالت التي ستأخذها الدال ة ،ثم ينتهي التعري ف بنقط تين .في ه ذه
ِّ
سنعرف دالة باسم )(:hello الحالة،
def hello():
ثاني ا مُ ً
زاح ا ب أربع مس افات بيض اء ،وفي ه س نكتب التعليم ات ال تي ً بع د ه ذا ،سنض يف س ط ًرا
def hello():
)"مرحبا بالعالم"(print
لق د أتممن ا تعري ف دالتن ا ،غ ير أنن ا إن َن َّفذنا البرن امج اآلن ،فلن يح دث ُّ
أي ش يء ،ألنن ا لم
نستدع الدالة؛ لذلك ،سنستدعي الدالة بالشكل )( helloخارج كتلة تعريف الدالة:
def hello():
)"!مرحبا بالعالم"(print
)(hello
ِّ
لننفذ البرنامج: اآلن،
python hello.py
!مرحبا بالعالم
بعض الدوال أكثر تعقي ًدا بكث ير من الدال ة )( helloال تي عرَّ فناه ا أعاله .على س بيل المث ال،
ُّ
للتحقق مم ا إذا ك انت على س بيل المث ال ،تس تخدم الدال ة المُ عرَّ ف ة أدن اه تعليم ة ش رطية
الم دخالت المم رَّ رة إلى المتغ ير nameتحت وي على ح رف عل ة ( ،)vowelثم تس تخدم الحلق ة for
تس تخدم الدال ة )( namesال تي عرَّ فناه ا أعاله تعليم ة ش رطية ،وحلق ة ،forوه ذا توض يح
ً
أيض ا جع ل التعليم ة الش رطية لكيفي ة تنظيم الش فرة البرمجي ة ض من تعري ف الدال ة .يمكنن ا
تعري ف ال دوال داخ ل ال برامج يجع ل الش فرة البرمجي ة تركيبي ة ( ،)modularوقابل ة إلع ادة
االستخدام ،وذلك سيتيح لنا استدعاء نفس الدالة دون إعادة كتابة شيفرتها كل مرة.
ً
برنامج ا ص غي ًرا يأخ ذ ثالث ة مع امالت xو yو .zسننش ئ دال ة تجم ع تل ك دعن ا ننش ئ
)add_numbers(1, 2, 3
مرّ رن ا الع دد 1إلى المعام ل ،xو 2إلى المعام ل ،yو 3إلى المعام ل .zتتواف ق ه ذه القيم م ع
يُ ج ِري البرنامج العمليات الحسابية على المعامالت على النحو التالي:
a = 1 + 2
b = 1 + 3
c = 2 + 3
ِّ
لننفذ البرنامج:
python add_numbers.py
3 4 5
المع امالت هي متغ يرات ُتع رَّ ف ض من جس م الدال ة .يمكن تع يين قيم إليه ا عن د تنفي ذ الت ابع
تلقائيا آنذاك.
ً بتمرير وسائط إلى الدالة ،إذ ُتسنَد الوسائط إليها
المسماة
َّ .3الوسائط
ُتس تدعى المع امالت بحس ب ت رتيب ظهوره ا في تعري ف الدال ة ،أم ا الوس ائط المس ماة
ألن م ترجم
أي ت رتيب تري دَّ ،
عند اس تخدام الوس ائط المس مّ اة ،يمكن ك اس تخدام المع امالت ب ِّ
ِّ
ونمرر إليه ا المُ ع امِ لين username سننشئ دالة تعرض معلومات الملف الشخصي للمستخدم،
ة ي الدال عنا usernameو followersبين قوس ة ،وض ف الدال ل تعري داخ
في االس تدعاء األول للدال ة ،مرَّ رن ا اس م المس تخدم ،sammysharkوع دد المت ابعين 945
ب الترتيب ال وارد في تعري ف الدال ة .أمَّ ا في االس تدعاء الث اني للدال ة ،فق د اس تخدمنا الوس ائط
python profile.py
Username: sammyshark
Followers: 945
Username: AlexAnglerfish
Followers: 342
سنحص ل في المخرج ات على أس ماء المس تخدمين ،وأع داد المت ابعين لكال المس تخدمين.
Username: cameron-catfish
Followers: 820
يحاف ظ تعري ف الدال ة على نفس ت رتيب التعليم ات في )( ،printل ذلك يمكنن ا اس تخدام
عند استدعائها:
تلقائي ا
ً عين ع دد المت ابعين
اآلن ،يمكننا استدعاء الدالة مع تعيين اسم المستخدم فق ط ،وس ُي َّ
)"profile_info(username="JOctopus
)profile_info(username="sammyshark", followers=945
عندما ِّ
ننفذ البرنامج باستخدام األمر ،python profile.pyستظهر المخرجات التالية:
Username: JOctopus
Followers: 1
Username: sammyshark
Followers: 945
تمري ر قيم إلى المع امالت االفتراض ية س يتخطى القيم ة االفتراض ية المعط اة في
تعريف الدالة.
.5إعادة قيمة
كم ا يمكن تمري ر قيم إلى الدال ة ،فيمكن ك ذلك أن تنتج الدال ة قيم ة وتعي دها لمن اس تدعاها.
ُتعيد الدالة يء ،فس ة returnأي ش تدعي ( .)callerإذا لم يلي التعليم ا إلى المُ س ُ
يعقبه
َ
القيمة .None
ح تى اآلن ،اس تخدمنا الدال ة )( printب دالً من returnفي دوالن ا لطباع ة ش يء ب داًل من
الن اتج إلى المتغ ير ،yثم يعي ده .س نطبع المتغ ير ،resultوال ذي يس اوي ن اتج تنفي ذ
الدالة ).square(3
def square(x):
y = x ** 2
return y
)result = square(3
)print(result
ّ
لننفذ البرنامج:
python square.py
9
مخرج ات البرن امج هي الع دد الص حيح 9ال ذي أعادت ه الدال ة وه و م ا نتوقع ه ل و طلبن ا من
def square(x):
y = x ** 2
# return y
)result = square(3
)print(result
ّ
لننفذ البرنامج مرة أخرى: اآلن،
python square.py
None
االفتراضية .None
الدالة )(:print
خ ارج الدال ة ،أحلن ا إلى المتغ ير sumsنتيج ة اس تدعاء الدال ة بالوس ائط 1و 2و 3كم ا فعلن ا
ِّ
فلننفذ البرنامج مرة أخرى:
python add_numbers.py
والناتج سيكون:
)(3, 4, 5
لق د حص لنا على األع داد 3و 4و 5وهي نفس المخرج ات ال تي تلقيناه ا س ً
ابقا عن دما
ُت َ
وقف الدوال فورًا عندما تصل إلى التعليمة ،returnسواء أعادت قيمة ،أم لم ُتعِ د.
def loop_five():
for x in range(0, 25):
)print(x
if x == 5:
إيقاف الدالة عند # x == 5
return
)"print("This line will not execute.
)(loop_five
ي ؤدي اس تخدام التعليم ة returnداخ ل الحلق ة forإلى إنه اء الدال ة ،وبالت الي لن يُ َّ
نفذ
فسي َّ
نفذ الس طر )( printاألخ ير من المث ال الس ابق .نعي د ُ لو استخدمنا بداًل من ذلك ،break
أن التعليمة returnتنهي عمل الدالة ،وقد تعيد قيمة إذا أعقبها تعبير.
التذكير َّ
ً
رئيسية ً
دالة .6استخدام )(main
رغم َّ
أنه يمكن ك في ب ايثون اس تدعاء الدال ة في أس فل البرن امج وتنفي ذها (كم ا فعلن ا في
منطقية ،فتضع أهم مكونات البرنامج في دالة واحدة .كما يمكن أن يجعل البرن امج أك ثر مقروئي ة
س نبدأ بإض افة دال ة )( mainإلى برن امج hello.pyأعاله .س نحتفظ بالدال ة )( ،helloثم
ِّ
نعرف الدالة )(:main
def hello():
)"مرحبا بالعالم"(print
def main():
ً
أيض ا ضمن الدالة )( ،mainسندرج الدالة )( ،printوالتي ستعُ لِمنا َّ
بأننا في الدال ة )(.main
def hello():
)"مرحبا بالعالم"(print
def main():
)"هذه هي الدالة الرئيسية"(print
)(hello
def hello():
)"!مرحبا بالعالم"(print
def main():
)".هذه هي الدالة الرئيسية"(print
)(hello
)(main
python hello.py
النص "مرحبا بالعالم!" مرة واحدة فقط ،وذلك عقب السلسلة النصية التي أخبرتن ا بأنن ا في الدال ة
الرئيسية( .سنعمل اآلن م ع دوال مُ تع ِّددة ،ل ذلك من المستحس ن أن تراج ع نطاق ات المتغ يرات في
إذا عرَّ فت متغي ًرا داخل دال ة ،فال يمكن ك أن تس تخدم ذل ك المتغ ير إال ض من تل ك الدال ة .ل ذا،
إن أردت اس تخدام متغ ير م ا في ع دة دوال ،فق د يك ون من األفض ل اإلعالن عن ه متغ ي ًرا
( .)top-level codeعند تنفيذ برنامج من الدخل القياسي ( ،)standard inputأو من س كربت ،أو
ست َّ
نفذ الش فرة غ ير المُ تض ِّمنة في العب ارة if __name__ == '__main__':عن د التنفي ذ. ُ
ً
أيض ا الش يفرة البرمجي ة غ ير المُ تض ِّمنة في ه ذه إذا كنت تس تخدم مل ف ب ايثون كوح دة ،فس ُت َّ
نفذ
ِّ
نقس م في ه التعليم ات إلى لية بش كل ِّ
ونعدل الدالة )( namesاألص َّ في هذا البرنامج عن متغير عام،
دالتين منفصلتين.
َّ
تتحقق الدال ة األولى )( has_vowelمم ا إذا ك انت السلس لة النص ية nameتحت وي على س
النصية .name
بع د ذل ك ،دعن ا نع ِّرف الدال ة )( mainال تي َستس تدعي كال من الدال ة )(has_vowel
والدالة )(.print_letters
أخ ي ًرا ،سنض يف العب ارة if __name__ == '__main__':في أس فل المل ف .لق د وض عنا
جميع الدوال التي نو ُّد تنفيذها في الدالة )( ،mainلذا سنستدعي الدالة )( mainبعد الشرط .if
def print_letters():
for letter in name:
)print(letter
def main():
)(has_vowel
)(print_letters
python more_names.py
أن الشفرة هن ا
بيد َّ
سيعرض هذا البرنامج نفس المخرجات التي عرضها البرنامج ْ ،names.py
إذا لم ترغب في اإلعالن عن الدالة )( ،mainيمكنك بداًل من ذلك إنهاء البرنامج كما يلي:
...
if __name__ == '__main__':
)(has_vowel
)(print_letters
ارة تخدام العب ل )( ،mainواس ية مث ة رئيس تخدام دال ؤدي اس ي
مقروئية وتراكبية.
أثن اء البرمج ة ،ق د ال ت درك جمي ع ح االت االس تخدام الممكن ة للش يفرة ،ل ذا ق د ت رغب في
ا*args .
في بايثون ،يمكن اس تخدام الش كل أح ادي النجم ة *argsمع اماًل لتمري ر قائم ة غ ير مح َّددة
الطول من الوسائط غ ير المس ماة ( )non-keyworded argumentإلى ال دوال .تج در اإلش ارة إلى
أن الكلم ة argsمتع ارف عليه ا بين الم برمجين ،إال َّ
أنه ا أن النجمة (*) عنص ر ض روري هن ا ،إذ رغم َّ
َّ
غير رسمية.
عرَّ فنا في الشيفرة أعاله دالة تقبل وسيطين xو ،yعندما نستدعي هذه الدالة ،س نحتاج إلى
تمرير ع ددين م وافقين للوس يطين xو .yفي ه ذا المث ال ،س ِّ
نمرر الع دد الص حيح 5إلى ،xوالع دد
)multiply(5, 4
python lets_multiply.py
20
الحقا حساب ناتج ض رب ثالث ة أع داد ب داًل من ع ددين فق ط؟ إذا ح اولت تمري ر
ً ماذا لو قرَّ رنا
)multiply(5, 4, 3
فسي َ
طلق الخطأ التالي: ُ
ً
الحق ا ،فالح ل ه و إذا ش ككت َّ
أنك س تحتاج إلى اس تخدام المزي د من الوس ائط
اس تخدام *argsمع امال .س نزيل المُ ع املين xو yمن الش يفرة في المث ال األول ،ونض ع
مكانهما :*args
def multiply(*args):
z = 1
for num in args:
z *= num
)print(z
)multiply(4, 5
)multiply(10, 9
)multiply(2, 3, 4
)multiply(3, 5, 10, 6
عندما ِّ
ننفذ هذه الشيفرة ،سنحصل على ناتج استدعاءات الدالة أعاله:
20
90
24
900
يمكنن ا باس تخدام الوس يط *argsتمري ر أي ع دد نحب من الوس ائط عن د اس تدعاء الدال ة
باإلض افة إلى كتاب ة ش يفرة أك ثر مرون ة ،وإنش اء دوال تقب ل ع د ًدا غ ير مح دد مس ً
بقا من الوس ائط
غير المسماة.
ب**kwargs .
المعامالت (.)keywords
def print_kwargs(**kwargs):
)print(kwargs
ِّ
ونمرر إليها بعض الوسائط المسماة: سنستدعي اآلن الدالة
def print_kwargs(**kwargs):
)print(kwargs
ِّ
لننفذ البرنامج أعاله:
python print_kwargs.py
وم ا بع ده ،ستحص ل على أزواج قيم ة-مفت اح ( )key-valueمرتب ة ،ولكن في اإلص دارات الس ابقة،
عشوائيا.
ً سيكون ترتيب األزواج
سي َ
نش أ ق اموس يس مى ،kwargsوال ذي يمكنن ا التعام ل مع ه مث ل أي ق اموس ع ادي ُ
داخل الدالة.
قاموس ا من
ً سننش ئ دال ة تطب ع.**kwargs كيفية اس تخدام
َّ ً
برنامج ا آخ ر إلظه ار لننش ئ
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(my_name="Sammy", your_name="Casey")
python print_values.py
.ثانيا
ً وقد يظهر، أواًلCasey لذلك قد يظهر االسم،مرتبة
َّ قد ال تكون القواميس
أي ع دد
َّ **kwargs افية إلى الدال ة ل نرى كي ف يمكن أن تقب ل ِّ س ُن
َّ مرر اآلن وس ائط إض
:من الوسائط
def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(
name_1="Alex",
name_2="Gray",
name_3="Harper",
name_4="Phoenix",
name_5="Remy",
▲ | 308
البرمجة بلغة بايثون الدوال :تعريفها واستعمالها
"name_6="Val
)
إذا َّ
نف ذنا البرنامج اآلن ،فسنحصل على المخرجات التالية ،والتي قد تكون غير مرتبة:
ً
يرة في اس تخدام الوس ائط المس ماة .فعن د ي تيح ل ك اس تخدام **kwargsمرون ًة كب
استخدامها ،لن نحتاج إلى معرفة مسبقة بعدد الوسائط التي ستمرر إلى الدالة.
.8ترتيب الوسائط
عند الخلط بين عدة أن واع من الوس ائط داخ ل دال ة ،أو داخ ل اس تدعاء دال ة ،يجب أن تظه ر
*args •
**kwargs •
عملي ا ،عن د الجم ع بين المع امالت العادي ة ،والوس يطين *argsو ،**kwargsفينبغي أن
ً
وعن د الجم ع بين المع امالت العادي ة والمع امالت المس ماة و *argsو ،**kwargsينبغي أن
من المهم أن تأخ ذ في الحس بان ت رتيب الوس ائط عن د إنش اء ال دوال ح تى ال تتس بب في
متعلق بالصياغة.
ٍ إطالق خطٍأ
في الدالة أعاله ،هناك ثالثة معامالت ،وهي arg_1و _ argو .arg_3ستطبع الدالة كل هذه
الوس ائط .بع د ذل ك أنش أنا متغ ي ًرا ،وَأ حلن ا علي ه عنص رًا تكراريً ا (في ه ذه الحال ة ،ص ف) ،ثم مرَّ رن ا
المخرجات التالية:
arg_1: Sammy
arg_2: Casey
arg_3: Alex
ً
أيض ا *argsم ع ً
أيض ا تع ديل البرن امج أعاله ،واس تخدام قائم ة .س ندمج يمكنن ا
وسيط مسمى:
إذا َّ
نفذنا البرنامج أعاله ،فسنحصل على المخرجات التالية:
arg_1: 1
arg_2: 2
arg_3: 3
عن د تنفي ذ البرن امج أعاله باس تخدام األم ر ،python some_kwargs.pyسنحص ل على
المخرجات التالية:
kwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy
.10خالصة الفصل
معين ة داخ ل البرن امج ،كم ا
َّ ال دوال هي كت ل من التعليم ات البرمجي ة ال تي ُت ِّ
نفذ إج راءات
تس اعد على جع ل الش يفرة تركيبي ة ،وقابل ة إلع ادة االس تخدام باإلض افة إلى تنظيمه ا وتس هيل
قراءتها( .لمعرفة المزيد حول كيفية جعل الشفرة تركيبية ،يمكنك الرجوع إلى فصل الوحدات).
يمكنك اس تخدام الص ياغتين *argsو **kwargsالخاص تين ض من َتع اريف وس ائط ال دوال
أي عدد تشاء من الوسائط إليها ،إذ يُ ستحس ن اس تخدام *argsو **kwargsفي المواق ف
لتمرير ِّ
يحس ن مقروئي ة الش يفرة ،ويس ِّهل على الم برمجين ،ولكن ينبغي
ِّ اس تخدام *argsو **kwargs
استخدامهما بحذر.
ِّ
تحول القيمة المُ مرَّ رة إليها إلى عدد صحيح )(:int •
هذه الدوال المضمَّ نة مفيدة ،لكنها محدودة ،له ذا يس تخدم المط ورون الوح دات ()modules
لتط وير ب رامج أك ثر تعقي ًدا .الوح دات ( )Modulesهي ملف ات ب ايثون ذات امت داد ،.pyوال تي
في ب ايثون ،يمكن ك الوص ول إلى الوح دات باس تخدام التعليم ة .importعن د فع ل ذل ك،
س ُت َّ
نفذ ش يفرة الوح دة ،م ع االحتف اظ بنطاق ات ( )scopesالتعريف ات ح تى تك ون متاح ة في
أواًل عن وحدة مضمَّ نة باسم .helloفإن لم يجد ،فسيبحث عن ملف يسمى hello.pyفي قائمة
سيرشدك هذا الفصل إلى كيفية البحث عن الوحدات وتثبيتها ،واستيرادها ،وإع ادة تس ميتها
( ،)aliasingثم سيعلمك كيفية إنشاء وحدة كاملة واستعمالها في شيفرة أخرى.
.1تثبيت الوحدات
هن اك ع دد من الوح دات المض مَّ نة في مكتب ة ب ايثون القياس ية ال تي تحت وي على العدي د من
الوح دات ال تي ت وفر الكث ير من وظ ائف النظ ام ،أو ت وفر حل واًل قياس ية .مكتب ة ب ايثون القياس ية
أن وح دات ب ايثون ج اهزة للعم ل ،ادخ ل إلى بيئ ة برمج ة ب ايثون 3المحلي ة ،أو
للتحق ق من َّ
ِّ
وشغل مترجم بايثون في سطر األوامر على النحو التالي: بيئة البرمجة المستندة إلى الخادم،
من داخل المترجم ،يمكنك تنفيذ التعليمة importمع اسم الوحدة للتأكد من َّ
أنها جاهزة:
import math
لمَّ ا ك انت mathوح دة مض مَّ نة ،فينبغي أن يُ كم ل الم ترجم المهم ة دون أي مش اكل ،ثم يع ود
الوحدة .math
ِّ
لننفذ اآلن التعليم ة importم ع وح دة ق د ال تك ون مُ َّ
ثبت ة عن دك ،مث ل ،matplotlibوهي
import matplotlib
ٌأ
إذا لم تكن matplotlibمُ َّ
ثبتة ،فسيظهر خط مثل الخطأ التالي:
يمكنك إيقاف مترجم بايثون بالضغط على ،CTRL + Dثم تثبيت الوحدة matplotlibعبر
.2استيراد الوحدات
لالس تفادة من ال دوال الموج ودة في الوح دة ،س تحتاج إلى اس تيراد الوح دة ع بر التعليم ة
،importإذ تتألف من الكلمة المفتاحية importمعقوبة باسم الوحدة كما في المثال اآلتي.
يُ ص رَّ ح عن عملي ة اس تيراد الوح دات في أعلى ملف ات ب ايثون ،قب ل األس طر التوجيهي ة
( shebang linesأي األس طر ال تي تب دأ بـ ! ،)#أو التعليق ات العام ة .ل ذلك ،سنس تورد في مل ف
import random
عن دما نس تورد وح دة ،نجعله ا ب ذلك متاح ة في برنامجن ا الح الي بوص فها فض اء اس م
يتعين علين ا الوص ول إلى الدال ة باس تخدام الص ياغة النقطي ة
َّ ( )namespaceمنفص ل .أي س
دعن ا ننش ئ حلق ة forلتوض يح كيفي ة اس تدعاء دال ة من الوح دة randomض من
البرنامج :my_rand_int.py
import random
for i in range(10):
))print(random.randint(1, 25
يس تورد ه ذا البرن امج الص غير الوح دة randomفي الس طر األول ،ثم ينتق ل إلى الحلق ة for
امالت فهما مع حيحان 1و 25بوص ددان الص رّّ ر الع مول) .يُ م إلى ( 25مش
إلى )(.random.randint
عن د تنفي ذ البرن امج باس تخدام األم ر ،python my_rand_int.pyس تظهر 10أع داد
كما يلي:
6
9
1
14
3
22
10
1
15
9
تعليمات استيراد:
import random
import math
قد تصادف شيفرات تستورد عدة وحدات مفصولة بفواصل مثل import random, math
افية ،يمكنن ا إض افة الث ابت piمن الوح دة mathإلى برنامجن ا،
لالس تفادة من الوح دة اإلض َّ
import random
import math
for i in range(5):
))print(random.randint(1, 25
)print(math.pi
اآلن ،عن د تنفي ذ البرن امج ،سنحص ل على مخرج ات على الش كل الت الي ،م ع تق ريب للع دد pi
18
10
7
13
10
3.141592653589793
ِّ
يمكن ك من ت تيح ل ك التعليم ة importاس تيراد وح دة واح دة أو أك ثر إلى برامج ك ،وه ذا
محددة
َّ .3استيراد عناصر
لإلش ارة إلى عناص ر من وح دة مس توردة ض من فض اء األس ماء ،يمكن ك اس تخدام التعليم ة
.from ... importعن دما تس تورد الوح دات به ذه الطريق ة ،س يكون بمق دورك الرج وع إلى
ال دوال بأس مائها فق ط ،ب داًل من اس تخدام الص ياغة النقطي ة .في ه ذه الص ياغة ،يمكن ك تحدي د
في بعض ال برامج ،ق د ت رى العب ارة * ،from ... importإذ تش ير العالم ة * إلى جمي ع
هنا ،نستدعي أواًل الكلمة المفتاحية ،fromثم .randomبعد ذلك ،نس تخدم الكلم ة المفتاحي ة
اآلن ،عندما نرغب في اس تخدام ه ذه الدال ة في برنامجن ا ،لن نس تدعي الدال ة وف ق الص ياغة
ً
مباشرة ،أي )(:randint النقطية ،random.randint() ،ولكن سنستدعيها باسمها
for i in range(10):
))print(randint(1, 25
ً
مسبقا. عند تنفيذ البرنامج ،ستتلقى مخرجات مشابهة لما تلقيته
يتيح لنا استخدام from ... importالرجوع إلى العناصر المعرَّ فة في الوح دة من فض اء
األسماء الخاص ببرنامجنا ،مما يتيح لنا تجنب استخدام الصياغة النقطية الطويلة.
المفتاحية .as
أخ رى مس توردة ،أو ق د ت رغب في اختص ار اس م طوي ل تس تخدمه كث يرًا .يمكن ك ذل ك ع بر
الصياغة التالية:
)print(m.pi
)print(m.e
يشيع في بعض الوحدات استخدام أسماء مستعارة ( )aliasesمح َّددة .فمثاًل ،يدعو التوثيق
يس مح ه ذا للم برمجين بإلح اق الكلم ة القص يرة pltب أي دال ة متاح ة داخ ل الوح دة ،كم ا ه و
الحال في )(.plt.show
مخصصة واستيرادها
َّ .5كتابة وحدات
س نتعلم اآلن كتاب ة وح دات ب ايثون -بع د تعلم كيفي ة اس تيرادها -الس تخدامها في ملف ات
البرمجة األخرى.
كتابة الوحدات مشابه لكتابة أي ملف بايثون آخ ر .يمكن أن تحت وي الوح دات على تعريف ات
الدوال واألصناف والمتغيِّ رات التي يمكن استخدامها بعد ذلك في برامج بايثون األخرى.
سننشئ من بيئة البرمج ة الحالي ة الخاص ة بب ايثون 3أو بيئ ة البرمج ة المس تندة إلى الخ ادم
ً
الحقا من ملف آخر. ًّ
ملفا باسم ،hello.pyوالذي سنستورده
إذا َّ
نفذنا البرنامج في سطر األوامر باستخدام ،python hello.pyفلن يح دث ش يءَّ ،
ألنن ا
ثاني ا في نفس المجلد (أي بج انب المل ف الس ابق) باس م main_program.py
ً لننش ئ ً
ملف ا
حتى نتمكن من استيراد الوحدة التي أنشأناها للت و ،ومن ثم اس تدعاء الدال ة .يجب أن يك ون ه ذا
مكتبة بايثون.
نظرً ا ألننا اس توردنا الوح دة ،نحت اج إلى اس تدعاء الدال ة من خالل اإلش ارة إلى اس م الوح دة
بالص ياغة النقطي ة ( .)dot notationيمكنن ا ب داًل من ذل ك اس تيراد دال ة مح َّددة من الوح دة
بالتعليمة ،from hello import worldواستدعاء تلك الدالة بالشكل )( worldكما تعلمنا ذلك
python main_program.py
!Hello, world
ً
تعريف ا لمتغيِّ ر في ل نرى كي ف يمكنن ا اس تخدام المتغ يرات في الوح دات ،دعن ا نض يف
الملف :hello.py
بعد ذلك ،سنستدعي المتغير داخل الدالة )( printفي الملف :main_program.py
# استدعاء الدالة
hello.world()
# طباعة المتغير
print(hello.shark)
Hello, world!
Sammy
: إضافة إلى دالة تطبع الخاصيات عند استدعائها،color وname على الخاصيتين
# تعريف الدالة
def world():
print("Hello, world!")
# تعريف المتغير
shark = "Sammy"
# تعريف الصنف
class Octopus:
def __init__(self, name, color):
self.color = color
self.name = name
def tell_me_about_the_octopus(self):
print("This octopus is " + self.color + ".")
print(self.name + " is the octopus's name.")
▲ | 323
البرمجة بلغة بايثون الوحدات :استيرادها وإنشاؤها
َ
الصنف إلى نهاية الملف :main_program.py سنضيف اآلن
دوال وخاص يات الص نف من فض اء األس ماء الخ اص ب الملف .main_program.pyي تيح لن ا ه ذا
ً
أيض ا ،على س بيل المث ال ،اس تدعاء إح دى خاص يات الص نف ،مث ل ،jesse.colorدون يمكنن ا
!Hello, world
Sammy
This octopus is orange.
Jesse is the octopus's name.
ً
أيض ا أن من المهم أن تضع في الحسبان أن الوح دات ال تض م تعريف ات دوال فق ط ،ب ل يمكن
ِّ
وتنفذها .لتوض يح ه ذا ،دعن ا نعي د كتاب ة المل ف hello.pyلنجعل ه يق دم تق دم ش يفرات برمجي ة
ً
أيضا: الدالة )( worldوينفذها
ً
أيض ا التعريف ات األخ رى في المل ف .اآلن ،في المل ف ،main_program.py لق د ح ذفنا
!Hello, world
لت َّ
نفذ مع السكربت .main_program.py ُ main_program.py
الوح دة هي مل ف ب ايثون مؤل ف من تعريف ات و ش يفرات برمجي ة يمكن االس تفادة منه ا في
إذا أردت استخدام وحدة من مجلد آخر غير المجلد الذي يح وي البرن امج الرئيس ي ،فأمام ك
أحد الخيارات هو استدعاء مسار الوحدة من الملفات البرمجية ال تي تس تخدم تل ك الوح دة.
يُ ع د ه ذا حاًّل مؤق ًت ا يمكن اس تخدامه أثن اء عملي ة التط ويرَّ ،
ألنه ال يجع ل الوح دة متاح ة على
مستوى النظام بأكمله .إللح اق مس ار وح دة بمل ف ب رمجي آخ ر ،س تبدأ باس تيراد الوح دة ،sysإلى
زءا من مكتب ة ب ايثون القياس ية ،وت وفر مع امالت ودوال نظامي ة يمكن ك
تعد الوح دة sysج ً
استخدامها في برنامجك لتع يين مس ار الوح دة ال تي ت رغب في تق ديمها .على س بيل المث ال ،لنق ل
َّ
أنن ا نقلن ا المل ف hello.pyإلى المس ار ،/usr/sammy/بينم ا يوج د المل ف main_program.py
في مجل د آخ ر .في المل ف ،main_program.pyم ا ي زال بإمكانن ا اس تيراد الوح دة helloعن
طري ق اس تيراد الوح دة ،sysثم إض افة المس ار /usr/sammy/إلى المس ارات ال تي يبحث ب ايثون
فيها عن الملفات.
import sys
)'sys.path.append('/usr/sammy/
import hello
...
عينت مس ار المل ف hello.pyكم ا يجب ،فس يكون بمق دورك تنفي ذ المل ف
إن َّ
أي أخط اء ،وستحص ل على نفس المخرج ات ال تي حص لنا عليه ا أعاله
main_program.pyدون ِّ
الخيار الث اني ه و إض افة الوح دة إلى المس ار ال ذي يبحث في ه ب ايثون عن الوح دات والح زم،
ً
متاحة على نطاق البيئة ،أو على مستوى النظام. وهذا حل أفضل وأدوم ،إذ يجعل الوحدة
لمعرف ة المس ار ال ذي يبحث في ه ب ايثون ،ش ِّغل م ترجم ( )interpreterب ايثون من بيئ ة
البرمجة خاصتك:
python
import sys
)print(sys.path
ستحص ل على بعض المخرج ات ،وس ُيطبع مس ار نظ ام واح د على األق ل .إذا كنت تعم ل في
بيئة برمجة ،فقد تتلقى العديد منها .سيكون عليك البحث عن المسارات الموجودة في البيئة التي
ً
أيض ا في إض افة الوح دة إلى مس ار النظ ام الرئيس ي لب ايثون. حالي ا ،ولكن ق د ت رغب
ً تس تخدمها
''/usr/sammy/my_env/lib/python3.5/site-packages
يمكنك اآلن نقل الملف hello.pyإلى هذا المجلد .بعد ذلك ،يمكنك استيراد الوح دة hello
مثل المعتاد:
import hello
...
إمكانية الوصول إليها مهم ا ك ان المجل د ال ذي تعم ل في ه ،إذ ه ذا مفي د خاص ة في ح ال كنت تعم ل
.7خالصة الفصل
يس مح مفه وم الوح دات باس تدعاء دوال غ ير مض مَّ نة في ب ايثون .فبعض الوح دات مُ َّ
ثبت ة
وت دعيمها ،إذ تض ع تحت تص رُّ فنا ش فرات ج اهزة لالس تخدام ،فيمكنن ا إنش اء وح دات خاص ة بن ا،
الكائني ة ( )OOPعلى كتاب ة ش يفرات قابل ة إلع ادة االس تخدام ،على عكس البرمج ة اإلجرائي ة
تتيح البرمجة الكائنية لمبرمجي بايثون كتابة ش يفرات س هلة الق راءة والص يانة ،وه ذا مفي د
التمي يز بين األص ناف والكائن ات أح ُد المف اهيم األساس ية في البرمج ة الكائني ة ،ويوض ح
فيع ِّرف الص نف الصنف ( :)classنموذج ع ام ُتنس ج على منوال ه كائن ات يُ ِ
نش ئها الم برمجُ . •
ستنسخ ( )instantiatedمنه.
َ ً
مجموعة من الخاصيات التي تميز أي كائن يُ
ُتستخ َدم األصناف إلنشاء أنماط ،ثم ُتستعمل تلك األنماط إلنشاء الكائنات.
ابع
كيفية إنشاء األصناف والكائنات ،وتهيئ ة الخاص يات باس تخدام ت ٍ
َّ ستتعلم في هذا الفصل
.1األصناف
آنف اُ .ت َ
نش أ األص ناف األص ناف هي نم اذج عام ة ُتس تخدم إلنش اء كائن ات ،وس بق أن عرَّ فناه ا ً
باس تخدام الكلم ة المفتاحي ة ،classبش كل مش ابه لتعري ف ال دوال ال ذي يك ون باس تخدام الكلم ة
المفتاحية .def
ً
صنفا يسمى ،Sharkوننشئ له تابعين مرتبطين به swim ،و :be_awesome دعنا ِّ
نعرف
class Shark:
def swim(self):
)"print("The shark is swimming.
def be_awesome(self):
)"print("The shark is being awesome.
الوس يط األول له َ
اتين ال دالتين ه و ،selfوه و مرج ع إلى الكائن ات ال تي س ُتبنَى من ه ذا
الص نف .لإلش ارة إلى ُنس خ (أو كائن ات) من الص نف ،يوض ع selfدائمً ا في البداي ة ،لكن يمكن أن
ال ي ؤدي تعري ف الص نف Sharkإلى إنش اء كائن ات من ه ،وإنم ا يع ِّرف فق ط النم ط الع ام لتل ك
.2الكائنات
ٌ
خة ( )instanceمن ص نف ،ويمكن أن نأخ ذ الص نف Sharkالمُ ع رَّ ف أعاله، الك ائن ه و نس
ً
نسخة منه. ونستخدمه إلنشاء كائن يع ُّد
)(sammy = Shark
ً
خة من الص نف. لق د أحلن ا على الك ائن sammyن اتج الب اني )( ،Sharkوال ذي يعي د نس
)(sammy = Shark
)(sammy.swim
)(sammy.be_awesome
يس تخدم الك ائن sammyالت ابعين )( swimو )( ،be_awesomeوق د اس تدعينَاهما باس تعمال
الص ياغة النقطي ة ( ،).وال تي ُتس تخ َدم لإلش ارة إلى خاص يات ()propertiesأو تواب ع ()method
الكائنات .في هذه الحالة ،استدعينا تابعً ا ،لذلك استعملنا قوسين مثلما نفعل عند استدعاء دالة.
الكلمة selfهي معامل يُ مرَّ ر إلى توابع الصنف ،Sharkفي المث ال أعالهِّ ،
يمثل selfالك ائن
ُ
استدعيت معه. .sammyيتيح المعامل selfللتوابع الوصول إلى خاصيات الكائن الذي
الح ظ َّ
أنن ا لم نم ِّرر ش يًئا داخ ل القوس ين عن د اس تدعاء الت ابع أعاله ،ذل ك َّ
أن الك ائن sammy
ِّ
يوضح البرنامج التالي لنا األمر: تلقائيا مع العامل النقطي.
ً يُ مرَّ ر
class Shark:
def swim(self):
)"print("The shark is swimming.
def be_awesome(self):
)"print("The shark is being awesome.
def main():
)(sammy = Shark
)(sammy.swim
)(sammy.be_awesome
ِّ
لننفذ البرنامج لنرى ما سيحدث:
python shark.py
في الش يفرة أعاله ،اس تدعى الك ائن sammyالت ابعين )( swimو )( be_awesomeفي الدال ة
الرئيسية )(.main
.3الباني ()Constructor
يٌ ستخدم الباني ( )Constructor Methodلتهيئة البيانات األولية ،ويُ َّ
نفذ لحظة إنشاء الكائن.
في تعري ف الص نف ،يأخ ذ الب اني االس م __ ،__initوه و أول ت ابع يُ ع رَّ ف في الص نف ،ويب دو
كما يلي:
class Shark:
def __init__(self):
)"print("This is the constructor method.
امج
ُ إذا أض فت الت ابع __ __initإلى الص نف Sharkفي البرن امج أعاله ،فس َيطبع البرن
المخرجات التالية:
س ُن ِّ
عدل الباني أعاله ،ونجعله يستخدم متغ يرًا اس مه nameس ّ
يمثل اس م الك ائن .في الش يفرة
التالية ،سيكون المتغير nameالمعامل المُ مرَّ ر إلى الباني ،ونحيل قيمته إلى الخاصية :self.name
class Shark:
def __init__(self, name):
self.name = name
بع د ذل ك ،يمكنن ا تع ديل السالس ل النص ية في دوالن ا لإلش ارة إلى اس م الص نف ،على
النحو التالي:
class Shark:
def __init__(self, name):
self.name = name
def swim(self):
اإلشارة إلى االسم #
)"print(self.name + " is swimming.
def be_awesome(self):
اإلشارة إلى االسم #
)"print(self.name + " is being awesome.
أخ يرًا ،يمكنن ا تع يين اس م الك ائن sammyعن د القيم ة "( "Sammyأي قيم ة الخاص ية )name
class Shark:
def __init__(self, name):
self.name = name
def swim(self):
)"print(self.name + " is swimming.
def be_awesome(self):
)"print(self.name + " is being awesome.
def main():
تعيين اسم كائن # Shark
)"sammy = Shark("Sammy
)(sammy.swim
)(sammy.be_awesome
python shark.py
سنحصل على:
Sammy is swimming.
Sammy is being awesome.
اس تدعائه بش كل ص ريح ،فيكفي تمري ر الوس ائط بين القوس ين الت اليين الس م الص نف عن د إنش اء
إذا أردت إضافة معامل آخر ،مثل ،ageفيمكن ذلك عبر تمريره إلى التابع __:__init
class Shark:
def __init__(self, name, age):
self.name = name
self.age = age
ً
أيضا باإلضافة إلى اسمه: ِّ
سنمرر عُ مره عند إنشاء الكائن ،sammy
ً
إذا ،تتيح البانيات تهيئة خاصيات الكائن لحظة إنشائه.
class Shark:
def __init__(self, name):
self.name = name
def swim(self):
)"print(self.name + " is swimming.
def be_awesome(self):
)"print(self.name + " is being awesome.
def main():
)"sammy = Shark("Sammy
)(sammy.be_awesome
)"stevie = Shark("Stevie
)(stevie.swim
اس تدعينا في ه ذا المث ال الت ابع )( be_awesomeم ع الك ائن sammyوالت ابع )( swimم ع
python shark.py
يب دو ظ اه ًرا في المخرج ات أنن ا نس تخدم ك ائنين مختلفين ،الك ائن sammyوالك ائن ،stevie
تتيح لنا األصناف إنشاء ع دة كائن ات تتب ع كله ا نفس النم ط دون الحاج ة إلى بن اء ك ل واح د
منها من البداية.
يشار إلى المتغيرات على مستوى الصنف باس م «متغ يرات الص نف» ( ،)class variablesفي
حين تس مى المتغ يرات الموج ودة على مس توى النس خة باس م «متغ يرات النس خة»
(.)instance variables
إذا ت وقعت أن يك ون المتغيِّ ر متس ًقا في جمي ع نس خ الص نف ،أو عن دما ت ود تهيئ ة المتغ ير،
فاألفض ل أن ُتع ِّرف ذل ك المتغ ير على مس توى الص نف .أمَّ ا إن كنت تعلم َّ
أن المتغ ير س يختلف من
عر َفه على مستوى النس خة .يس عى أح د مب ادئ تط وير البرمجي ات
نسخة إلى أخرى ،فاألفضل أن ُت ِّ
ِّ
تكرر نفسك) إلى الحد من هو مبدأ ( DRYاختصا ًرا للعبارة ،don’t repeat yourselfوالذي يعني ال
التكرار في الشيفرة .أي تلتزم البرمجة الكائنية بمبدأ DRYعلى تقليل التكرار في الشيفرة.
ترويسة الص نف ،وقب ل الب اني ( )constructorوالتواب ع األخ رى .ولمَّ ا ك انت مملوك ة للص نف نفس ه،
فستشارَ ك مع جميع ُن َسخ ذلك الصنف .وبالتالي ،س يكون له ا نفس القيم ة بغض النظ ر عن النس خة،
ُ
معين.
َّ إال إن كنت ستستخدم متغير الصنف لتهيئة متغير
class Shark:
"animal_type = "fish
class Shark:
"animal_type = "fish
)(new_shark = Shark
)print(new_shark.animal_type
لننفذ البرنامج:
python shark.py
fish
class Shark:
"animal_type = "fish
"location = "ocean
followers = 5
)(new_shark = Shark
)print(new_shark.animal_type
)print(new_shark.location
)print(new_shark.followers
متغير آخر .استخدمنا في هذا البرنامج السالسل النصية واألعداد الص حيحة .لننف ذ البرن امج م رة
fish
ocean
5
يمكن للنس خة new_sharkالوص ول إلى جمي ع متغ يرات الص نف وطباعته ا عن د تنفي ذ
ً
مباشرة (وليس عند إنشاء نسخة منه) وتحتل موضعً ا له ا في البرنامج ،إذ ُت َ
نشأ عند إنشاء الصنف
الذاكرة ويمكن ألي كائن مُ ش َتق (نسخة) من الصنف نفسه أن يصل إليها ويقرأ قيمتها.
تختل ف متغ يرات النس خة عن متغ يرات الص نف ب أن النس خة المش تقة من الص نف هي من
وسي َ
نشأ متغيِّ رٌ مستقل في ال ذاكرة عن د ُ تملكها وليس الصنف نفسه أي تكون على مستوى النسخة
ُتعرَّ ف متغيرات النسخة ضمن التوابع على خالف متغيرات الصنف .في مثال الص نف Shark
class Shark:
def __init__(self, name, age):
self.name = name
self.age = age
class Shark:
def __init__(self, name, age):
self.name = name
self.age = age
class Shark:
def __init__(self, name, age):
self.name = name
self.age = age
عند تنفيذ البرنامج أعاله باستخدام ،python shark.pyسنحصل على المخرجات التالية:
Sammy
5
هيأناه ا ألج ل
تت ألف المخرج ات ال تي حص لنا عليه ا من قيم المتغ يرات ال تي َّ
الكائن .new_shark
class Shark:
def __init__(self, name, age):
self.name = name
self.age = age
ِّ
يمرر الكائن stevieالمعامالت إلى الباني لتعيين قيم متغيرات النسخة الخاصة به.
تسمح متغيرات النسخة ،المملوكة لكائنات الصنف ،لكل كائن أو نسخة أن تكون لها متغ يرات
ً
بعضا. خاصة بها ذات قيم مختلفة عن بعضها
class Shark:
def main():
الكائن األول ،إعداد متغيرات النسخة في الباني #
)sammy = Shark("Sammy", 5
Sammy
ocean
Stevie
This user has 77 followers
fish
.7خالصة الفصل
تطرَّ قن ا في ه ذا الفص ل إلى عِ َّدة مف اهيم ،مث ل إنش اء األص ناف ،وإنش اء الكائن ات ،وتهيئ ة
ُتع ُّد البرمجة الكائنية أحد المفاهيم الضرورية التي ينبغي أن يتعلمها كل مبرمجي بايثون ،إذ
تس اعد على كتاب ة ش يفرات قابل ة إلع ادة االس تخدام ،والكائن ات ال تي ُت َ
نش أ في برن امج م ا يمكن
البرامج مستقبال.
في البرمج ة الكائني ة ،يش ار إلى المتغ يرات المُ عرَّ ف ة على مس توى الص نف بمتغ يرات الص نف،
في حين تسمى المتغ يرات المُ عرّ ف ة على مس توى الك ائن بمتغ يرات النس خة .ي تيح لن ا ه ذا التمي يز
اس تخدام متغ يرات ذات قيم واح دة بينه ا ع بر متغ يرات الص نف ،أو اس تخدام متغ يرات مختلف ة
لك ل ك ائن على ح دة ع بر متغ يرات النس خة .كم ا يض من اس تخدام المتغ يرات الخاص ة بالص نف أو
ُت ِّسهل البرمجة الكائنية كتاب ة ش يفرات قابل ة إلع ادة االس تخدام وتجنب التك رار في مش اريع
ِّ
تحقق به ا البرمج ة الكائني ة ه ذا اله دف هي مفه وم الوراث ة التط وير .إح دى اآللي ات ال تي
ً
مسبقا. ً
أيضا) موجود أساسي ( ،base classويطلق عليه «صنف أب»
سيس تعرض ه ذا الفص ل بعض الج وانب الرئيس ية لمفه وم الوراث ة في ب ايثون ،بم ا في ذل ك
وكيفية
َّ كيفية إنشاء األصناف األساس ية ( )parent classesواألص ناف الفرعي ة (،)child classes
َّ
وكيفية
َّ وكيفية اس تخدام الت ابع )(،super
َّ إع ادة تعري ف ( )overrideالتواب ع والخاص يات،
ِّ
تعددة (.)multiple inheritance االستفادة من الوراثة المُ
.1ما هي الوراثة؟
تق وم الوراثة على اس تخدام ش يفرة ص نف معين في ص نف آخ ر أي ي رث ص نف ي راد إنش اؤه
ش يفرة ص نف آخ ر .يمكن تمثي ل مفه وم الوراث ة في البرمج ة بالوراث ة في علم األحي اء تمامً ا،
فاألبن اء يرث ون خاص يات معين ة من آب ائهم .ويمكن لطف ل أن ي رث ط ول وال ده أو ل ون عيني ه
باإلض افة إلى خاص يات أخ رى جدي دة خاص ة في ه .كم ا يتش ارك األطف ال نفس اس م العائل ة
الخاصة بآبائهم.
ً
أيضا األصناف األبن اء [ )]child classesالتواب ع ترث األصناف الفرعية (ُ ،subclassesتسمى
مثاًل ،قد يكون لدينا ص نف أساس ي يس مى Parentيح وي متغ يرات األص ناف last_name
لمَّ ا ك ان الص نف الف رعي Childي رث الص نف األساس ي ،Parentفبإمكان ه إع ادة اس تخدام
.2األصناف األساسية
أساس ا يمكن أن تس تند إلي ه األص ناف الفرعي ة المُ ِّ
تفرع ة منه ا ،إذ ً تش كل األص ناف األساس ية
تسمح األصناف األساسية بإنشاء أصناف فرعية عبر الوراثة دون الحاجة إلى كتابة نفس الش يفرة
في ك ل م رة .يمكن تحوي ل أي ص نف إلى ص نف أساس ي ،إذ يمكن اس تخدامه لوح ده ،أو جعل ه
ً
نموذجا).قالبا (
ً
تواب ع س حب وإي داع األم وال ،ل ذا يمكن أن تنتمي تل ك التواب ع إلى الص نف األساسي
ير افة إلى متغ ال ،باإلض اذج األعم جالت ونم عس ة جم لعملي
وبالمثل ،قد يحتوي الصنف Animalعلى التابعين )( eatingو )( ،sleepingوقد يتض من
الصنف الفرعي Snakeتابعين إضافيين باسم )( hissingو )( slitheringخاصين به.
األسماك .سيكون لكل واحدة من تلك األسماك أسماء أولى وأخيرة ،باإلضافة إلى خص ائص مم يزة
خاصة بها.
سننشئ ً
ملف ا جدي ًدا يس مى fish.pyونب دأ بالب اني ،وال ذي س ِّ
نعرف داخل ه متغ يري الص نف
class Fish:
def __init__(self, first_name, last_name="Fish"):
self.first_name = first_name
self.last_name = last_name
أن معظم
القيم ة االفتراض ية للمتغ ير last_nameهي السلس لة النص ية " ،"Fishألنن ا نعلم َّ
ل ُن ِ
ضف بعض التوابع األخرى:
class Fish:
def __init__(self, first_name, last_name="Fish"):
self.first_name = first_name
self.last_name = last_name
def swim(self):
)"print("The fish is swimming.
def swim_backwards(self):
)"print("The fish can swim backwards.
لق د أض فنا الت ابعين )( swimو )( swim_backwardsإلى الص نف Fishح تى يتس نى لك ل
عظميا) وليس
ً أن لها هيكال
أن معظم األسماك التي ننوي إنشاءها ستكون عظمية (أي َّ
ما دام َّ
التابع )(__:__init
class Fish:
def __init__(self, first_name, last_name="Fish",
skeleton="bone", eyelids=False):
self.first_name = first_name
self.last_name = last_name
self.skeleton = skeleton
self.eyelids = eyelids
def swim(self):
)"print("The fish is swimming.
def swim_backwards(self):
)"print("The fish can swim backwards.
ً
الحقا. األصناف الفرعية المُ عرّ فة
.3األصناف الفرعية
أن األص ناف
األص ناف الفرعي ة هي أص ناف ت رث ك ل ش يء من الص نف األساس ي .ه ذا يع ني َّ
على س بيل المث ال ،س يتمكن الص نف الف رعي Goldfishالمش تق من الص نف Fishمن
استخدام التابع )( swimالمُ عرّ ف في Fishدون الحاجة إلى التصريح عنه.
معين) ،وص ً
نفا أساس ًّيا يس مى ( Parallelogramمت وازي األض الع)، فرعيا يس مى َّ ( Rhombus
ًّ
class Trout(Fish):
ُ
الكلمة Fishالمُ درجة بين قوسين. الصنف Troutهو صنف فرعي من .Fishيدلنا على هذا
يمكننا إضافة توابع جديدة إلى األصناف الفرعي ة ،أو إع ادة تعري ف التواب ع الخاص ة بالص نف
األساس ي ،أو يمكنن ا ببس اطة قب ول التواب ع األساس ية االفتراض ية باس تخدام الكلمة
...
class Trout(Fish):
pass
يمكننا اآلن إنشاء كائن من الصنف Troutدون الحاجة إلى تعريف أي توابع إضافية.
...
class Trout(Fish):
pass
)"terry = Trout("Terry
)print(terry.first_name + " " + terry.last_name
)print(terry.skeleton
)print(terry.eyelids
)(terry.swim
)(terry.swim_backwards
لق د أنش أنا كائ ًن ا باس م terryمن الص نف ،Troutوال ذي سيس تخدم جمي ع تواب ع الص نف
نعرفه ا في الص نف الف رعي .Troutيكفي أن نم ِّرر القيم ة " "Terryإلى المتغ ير
Fishوإن لم ِّ
ً
سلفا. ،first_nameأمَّ ا المتغيرات األخرى فقد جرى تهيئتها
Terry Fish
bone
False
The fish is swimming.
The fish can swim backwards.
...
class Clownfish(Fish):
def live_with_anemone(self):
print("The clownfish is coexisting with sea anemone.")
...
casey = Clownfish("Casey")
print(casey.first_name + " " + casey.last_name)
casey.swim()
casey.live_with_anemone()
Casey Fish
The fish is swimming.
The clownfish is coexisting with sea anemone.
ابع افة إلى الت إض،Fish نف ين بالص الخاصswim() __ وinit__() ابعين الت
▲ | 351
البرمجة بلغة بايثون مفهوم الوراثة في البرمجة
إذا حاولنا استخدام التابع )( live_with_anemoneفي الكائن ،Troutفسوف يُ طلق خطأ:
)(terry.live_with_anemone
AttributeError: 'Trout' object has no attribute
''live_with_anemone
أن الت ابع )( live_with_anemoneينتمي إلى الص نف الف رعي Clownfishفق ط،
ذل ك َّ
ت رث األص ناف الفرعي ة تواب ع الص نف األساس ي ال ذي اش ُت َّقت من ه ،ل ذا يمكن لك ل األص ناف
عند إنشاء األصناف األساسية أو الفرعي ة ،فال ب د أن تك ون ل ك رؤي ة عام ة لتص ميم البرن امج
فرعي ا Sharkمش ً
تقا من الص نف األساس ي ،Fishال ذي س يمثل األس ماك ً سننش ئ ص ً
نفا
المخصص في األصل
َّ العظمية بشكل أساسي ،لذا يتعين علينا إجراء تعديالت على الصنف Shark
لألس ماك الغض روفية .من منظ ور تص ميم ال برامج ،إذا ك انت ل دينا أك ثر من س مكة غ ير عظمي ة
تمتلك أسماك الق رش ،على عكس األس ماك العظمي ة ،هياك ل مص نوعة من الغض اريف ب داًل من
ابع اني )(__ __initوالت ف الب نعيد تعري ات ،س ذه المعلوم وء ه على ض
...
class Shark(Fish):
def __init__(self, first_name, last_name="Shark",
skeleton="cartilage", eyelids=True):
self.first_name = first_name
self.last_name = last_name
self.skeleton = skeleton
self.eyelids = eyelids
def swim_backwards(self):
print("The shark cannot swim backwards, but can sink
)"backwards.
لق د أع دنا تعري ف المع امالت ال تي تمت تهيئته ا في الت ابع )(__ ،__initفأخ ذ المتغ ير
ُأ
last_nameالقيم ة " ،"Sharkكم ا س نِد إلى المتغ ير skeletonالقيم ة " ،"cartilageفيما
ُأ
س ِن َدت القيم ة المنطقي ة Trueإلى المتغ ير .eyelidsيمكن لجمي ع ُنس خ الص نف إع ادة تعري ف
هذه المعامالت.
ألن أسماك القرش غير قادرة على السباحة للخلف كما تفعل األسماك العظمية.
األساسي َّ ،Fish
يمكنن ا اآلن إنش اء نس خة من الص نف الف رعي ،Sharkوال ذي سيس تخدم الت ابع )(swim
...
)"sammy = Shark("Sammy
)print(sammy.first_name + " " + sammy.last_name
)(sammy.swim
)(sammy.swim_backwards
)print(sammy.eyelids
)print(sammy.skeleton
Sammy Shark
The fish is swimming.
The shark cannot swim backwards, but can sink backwards.
True
cartilage
لق د أع اد الص نف الف رعي Sharkتعري ف الت ابعين )(__ __initو )(swim_backwards
اص ابع )( swimالخ وقت الت ي ،Fishوورث في نفس ال نف األساس ين بالص الخاص
بالصنف األساسي.
الفرعي .على سبيل المثال ،قد نرغب في إعادة تعريف جانب من التابع األساسي وإض افة وظ ائف
معينة إليه ،ثم بعد ذلك نستدعي التابع األساسي إلنهاء بقية العمل.
في برن امج خ اص بتق ييم الطالب مثاًل ،ق د ن رغب في تعري ف ص نف ف رعي
ابع ف الت ه تعري د في ي ،Gradeونعي نف األساس رث الص Weighted_gradeي
)( calculate_gradeالخاص بالصنف األساسي من أجل تضمين شيفرة خاصة بحساب التق دير
َّ
المرجح ( ، )weighted gradeمع الحفاظ على بقية وظائف الصنف األساسي .عبر استدعاء التابع
على األرجح إلى إض افة بعض الوظ ائف الخاص ة إلى الص نف الف رعي قب ل إكم ال التهيئ ة من
الصنف األساسي.
لنض رب مثاًل لتوض يح ذل ك ،دعن ا نع ِّدل الص نف الف رعي .Troutنظ ًرا َّ
ألن س مك الس لمون
َّ
المرقط من أس ماك المي اه العذب ة ،فلنض ف متغ يرًا اس مه waterإلى الت ابع )(__ ،__initول ُنعط ه
القيمة " ،"freshwaterولكن مع الحفاظ على باقي متغيرات ومعامالت الصنف األساسي:
...
class Trout(Fish):
def __init__(self, water = "freshwater"):
self.water = water
)super().__init__(self
...
لق د أع دنا تعري ف الت ابع )(__ __initفي الص نف الف رعي ،Troutوغيرن ا س لوكه موازن ًة
ً
راحة ض من الت ابع )(__ __initالخ اص الت ابع )(__ __initالخ اص بالص نف Fishص
بالصنف .Trout
بع د إع ادة تعري ف الت ابع ،لم نع د بحاج ة إلى تمري ر first_nameمع اماًل إلى ،Troutوفي
ح ال فعلن ا ذل ك ،فس يؤدي ذل ك إلى إع ادة تع يين freshwaterب دالً من ذل ك .س ُنهيِّ ئ بع د ذل ك
ُأ
اآلن يمكنن ا اس تدعاء متغ يرات الص نف األساس ي ال تي ع ِّدت ،وك ذلك اس تخدام المتغيِّ ر
...
)(terry = Trout
Terry Fish
False
freshwater
المتغ ير waterالخ اص بت ابع الص نف الف رعي )(__ ،__initإض افة إلى اس تدعاء المتغ يرات
first_nameو last_nameو eyelidsالخاص ة بالت ابع )(__ __initالمُ ع رَّ ف في الص نف
األساسي .Fish
يسمح لنا الت ابع )( superالمُ ض من في ب ايثون باس تخدام تواب ع الص نف األساس ي ح تى بع د
ص نف أساس ي واح د .ه ذا من ش أنه تقلي ل التك رار في ال برامج ،ولكنَّه ق د يُ ِّ
عقد العم ل ،ل ذلك يجب
class Coral:
def community(self):
)"print("Coral lives in a community.
class Anemone:
def protect_clownfish(self):
يحت وي الص نف Coralعلى ت ابع يس مى )( ،communityوال ذي يطب ع س طرًا واح ًدا ،بينم ا
مرر الص نفين كالهم ا بين قوس ين في تعري ف الص نف ،CoralReefم ا يع ني َّ
أنه س يرث س ُن ِّ
...
)(great_barrier = CoralReef
)(great_barrier.community
)(great_barrier.protect_clownfish
أن التواب ع من كال الص نفين األساس يين اس ُتخدِ ما بفعالي ة في ُت ِ
ظه ر المخرج ات َّ
الصنف الفرعي.
ِّ
تعد دة بإعادة استخدام الشيفرات البرمجية المكتوبة في أكثر من ص نف تسمح لنا الوراثة المُ
أساسي واحد .وإذا تم تعريف التابع نفسه في أكثر من ص نف أساس ي واح د ،فسيس تخدم الص نف
الف رعي الت ابع الخ اص بالص نف األساس ي ال ذي ظه ر أواًل في قائم ة األص ناف المُ م رَّ رة إلي ه
عند تعريفه.
.7خالصة الفصل
وكيفية إع ادة تعري ف تواب ع
َّ وفرعية،
َّ كيفية إنش اء أص ناف أساس ية
َّ تعلمن ا في ه ذا الفص ل
وخاص يات األص ناف األساس ية داخ ل األص ناف الفرعي ة باس تخدام الت ابع )( ،superإض افة إلى
الوراثة هي إحدى أهم ميزات البرمجة الكائنية ال تي تجعله ا متوافق ة م ع مب دأ ( DRYال تك رر
نفسك) ،وهذا يحسن إنتاجية المبرمجين ،ويساعدهم على تصميم برامج فعالة وواضحة.
مختلف ة ،مث ل أن واع البيان ات أو األص ناف ،وه ذا يس مح لل دوال باس تخدام كيان ات من
سوف تتعلم في هذا الفصل كيفية تطبيق التعددية الشكلية على أصناف بايثون.
هن اك تواب ع له ا نفس األس ماء في ع دة أص ناف ،أو أص ناف فرعي ة .يس مح ذل ك لل دوال باس تخدام
يمكن تنفي ذ التعددي ة الش كلية ع بر الوراث ة ،أو باس تخدام تواب ِع األص ناف الفرعي ة ،أو إع ادة
تعريفها (.)overriding
يس تخدم ب ايثون نظ ام أن واع ( )typingخ اص ،يس مى «نظ ام التحق ق من األن واع :البط ة
ً
نموذجا» ( ،)Duck Typingوه و حال ة خاص ة من أنظم ة التحق ق من األن واع الديناميكي ة
( .)Dynamic Typingيس تخدم ه ذا النظ امُ التع ُّددي َة الش كلية ،بم ا في ذل ك الرب ط المت أخر
( ،)late bindingواإليف اد ال ديناميكي ( .)Dynamic dispatchيعتم د ه ذا النظ ام على «نم وذج
«عن دما أرى ط ائ ًرا يمش ي مث ل بط ة ،ويس بح مث ل بط ة ،وص وته كص وت البط ة،
ً
بطة» فسأع ُّد هذا الطائر
ُخ ِّ
صص ه ذا المفه وم من قب ل مهن دس الحاس وب اإليط الي أليكس م ارتيلي ( )Alex Martelli
البط ة ،يَ تح َّدد ذل ك بوج ود التواب ع والخاص يات الض رورية ل ذلك الغ رض ب داًل من الن وع الحقيقي
ُّ
التحقق مم ا إذا ك ان ذل ك للك ائن .بمع نى آخ ر ،إذا أردت أن تع رف إن ك ان الك ائن بط ًة أم ال ،فعلي ك
ً
بطة. مشي البطة ،وصوته كصوت البطة ،بداًل من أن تسأل عما إذا كان الكائن
َ الكائن يمشي
عندما تحتوي عدة أص ناف أو أص ناف فرعي ة على تواب ع له ا نفس األس ماء ،ولكن بس لوكيات
يمكن استخدامها مع كيانات من أنواع مختلفة .يمكن للدوال تقييم ومعالجة هذه التواب ع متع ِّددة
مختلفين .يحتاج هذان الصنفان المختلفان إلى واجه ة موح دة يمكن اس تخدامها بطريق ة تع ُّددي ة
ِّ
سنعرف فيهما توابع مختلفة ،ولكن لها نفس االسم. الشكل ( ،)polymorphicallyلذلك
class Shark():
def swim(self):
)".القرش يسبح"(print
def swim_backwards(self):
ال يمكن للقرش أن يسبح إلى الوراء ،لكن يمكنه أن يغوص "(print
)".إلى الوراء
def skeleton(self):
)".هيكل القرش مصنوع من الغضروف"(print
class Clownfish():
def swim(self):
)".سمكة المهرج تسبح"(print
def swim_backwards(self):
)".يمكن لسمكة المهرج أن تسبح إلى الخلف"(print
def skeleton(self):
)".هيكل سمكة المهرج مصنوع من العظام"(print
بي د
في الش يفرة أعاله ،ل دى الص نفين Sharkو Clownfishثالث ة تواب ع تحم ل نفس االس م ْ
...
)(sammy = Shark
)(sammy.skeleton
)(casey = Clownfish
)(casey.skeleton
أن
عند تنفيذ البرن امج باس تخدام األم ر ،python polymorphic_fish.pyيمكنن ا أن ن رى َّ
اآلن وقد أصبح لدينا كائنين يستخدمان نفس الواجه ة ،فبمق دورنا اس تخدام ه ذين الك ائنين
الطريقة ،سننشئ أوالً حلقة ،forوالتي ستمر على صف من الكائنات .ثم سنستدعي التواب ع بغض
أن تلك التواب ع موج ودة في ك ل النظر عن نوع الصنف الذي ينتمي إليه كل كائن .إال َّ
أننا سنفترض َّ
تلك األصناف.
...
)(sammy = Shark
)(casey = Clownfish
ل دينا كائن ان sammy ،من الص نف ،Sharkو caseyمن الص نف .Clownfishتم ر حلق ة for
على ه ذين الك ائنين ،وتس تدعي التواب ع )( swimو )( swim_backwardsو )( skeletonعلى
كل منها.
.القرش يسبح
.ال يمكن للقرش أن يسبح إلى الوراء ،لكن يمكنه أن يغوص إلى الوراء
.هيكل القرش مصنوع من الغضروف
.سمكة المهرج تسبح
.يمكن لسمكة المهرج أن تسبح إلى الخلف
.هيكل سمكة المهرج مصنوع من العظام
مرت الحلق ة forعلى الك ائن sammyمن الص نف ،Sharkثم على الك ائن caseyالمنتمي إلى
بالصنف .Clownfish
أن ب ايثون تس تخدم ه ذه التواب ع دون أن تع رف أو تعب أ بتحدي د ن وع الص نف ي ُّ
دل ه ذا على َّ
ِّ
تعد َدة األشكال. الخاص بالكائنات .وهذا مثال حي على استخدام التوابع بطريقة مُ
لننشئ دال ة تس مى )( ،in_the_pacificوال تي تأخ ذ كائ ًن ا يمكنن ا تس ميته .fishرغم َّ
أنن ا
…
def in_the_pacific(fish):
بع د ذل ك ،س نجعل الدال ة تس تخدم الك ائن fishال ذي مرَّ رن اه إليه ا .وفي ه ذه الحال ة،
ِّ
المعرف في كل من الصنفين Sharkو :Clownfish سنستدعي التابع )(swim
...
def in_the_pacific(fish):
)(fish.swim
ِّ
لنمررهم ا بع د ً
نسخا ( )instantiationsمن الص نفين Sharkو Clownfish بعد ذلك ،سننشئ
...
def in_the_pacific(fish):
)(fish.swim
)(sammy = Shark
)(casey = Clownfish
)in_the_pacific(sammy
)in_the_pacific(casey
.القرش يسبح
.سمكة المهرج تسبح
زلن ا ق ادرين على اس تخدامها اس تخدامً ا فع ااًل ،وتمري ر نس خ من الص نفين Sharkو Clownfish
.5خالصة الفصل
تس مح التع ُّددي ة الش كلية باس تخدام الكائن ات بغض النظ ر عن نوعه ا ،وه ذا ي وفر لب ايثون
التنقيح (– )debuggingفي تط وير البرمجي ات– هي عملي ة البحث عم ح ل المش اكل ال تي
ب رامج ب ايثون ،إذ ت دعم ض بط مواض ع التوق ف ( )breakpointsالش رطية ،وتنفي ذ الش يفرات
ِّ
مكدس ( )stackاالستدعاء ،وخالف ذلك. المصدرية سطرً ا بسطر ،وتفحص
تفاعليا
ً .1تشغيل منقح بايثون
جزءا من تث بيت ب ايثون القياس ي بش كل وح دة باس م .pdbيمكن توس عة
ً يأتي ِّ
منقح بايثون
ِّ
المنقح بمزيد من الوظائف ،ويُ عرَّ ف بالصنف .Pdbيمكنك الع ودة إلى التوثي ق الرس مي للمنقح pdb
( )global variablesودال ة ( )functionال تي تحت وي على حلق ة تك رار forمتش ِّعبة ،والبني ة
def nested_loop():
for number in num_list:
)print(number
for letter in alpha_list:
)print(letter
يمكننا اآلن تشعيل البرنامج باستخدام منقح بايثون عبر األمر اآلتي:
سيؤدي استخدام خي ار س طر األوام ر -mإلى اس تيراد أي وح دة ب ايثون تري دها ،وفي حالتن ا
فسنستورد الوحدة ،pdbوالتي س نمررها إلى الخي ار -mكم ا ه و م بيِّ ن في األم ر الس ابق .ستحص ل
)(>> /Users/sammy/looping.py(1)<module
]-> num_list = [500, 600, 700
)(Pdb
حالي ا (كم ا ه و
ً الحظن ا في أول س طر من المخرج ات احت واءه على اس م الوح دة ال تي َّ
تنفذ
موضح بالكلم ة < >moduleم ع كام ل مس ار الس كربت ،ويلي ه رقم الس طر ال تي ُن ِّفذ أول م رة (وفي
هذه الحالة سيكون الرقم ،1لكن ق د توج د تعليق ات أو أس طر غ ير قابل ة للتنفي ذ في بداي ة المل ف،
تفاعلي ا فس يوفر لن ا س طر أوام ر تف اعلي للتنقيح .ويمكن ك كتاب ة األم ر helpللتع رف على األوام ر
ً
معين.
َّ أمر
الخاصة بالمنقح ،و help commandلمزيد من المعلومات حول ٍ
وقت تري د للخ روج من المنقح .أمَّ ا إذا أردت إع ادة تش غيل المنقح من بداي ة البرن امج
ٍ في أي
ضمن الشيفرة .سنشرح هذه األوامر في ه ذا القس م .يمكنن ا كتاب ة األم ر listض من منقح ب ايثون
التف اعلي للحص ول على الش يفرات المحيط ة بالس طر الح الي ،فل و نف ذناه عن د الس طر األول من
(Pdb) list
1 ]-> num_list = [500, 600, 700
2 ]'alpha_list = ['x', 'y', 'z
3
4
5 def nested_loop():
6 for number in num_list:
7 )print(number
8 for letter in alpha_list:
9 )print(letter
10
11 if __name__ == '__main__':
)(Pdb
يُ شار إلى السطر الحالي بالمحرفين > -اللذين يشيران في حالتنا إلى أول سطر من البرنامج.
ولمَّ ا ك ان برنامجن ا قص ي ًرا ،فسنحص ل على كام ل البرن امج عن د اس تخدام األم ر .listفحين
ً
محيط ا بالس طر الح الي ،لكن اس تخدام األم ر listدون أيَّ ة وس ائط ،فس يعرض أح د عش ر س ط ًرا
طلبن ا في المث ال الس ابق أن يع رض المنقح األس طر 3إلى ،7وذل ك باس تخدام األم ر
.list 3, 7للتنقل عبر البرنامج سط ًرا بسطر ،فيمكننا استخدام األمر stepأو :next
(Pdb) step
)(>> /Users/sammy/looping.py(2)<module
]'-> alpha_list = ['x', 'y', 'z
)(Pdb
(Pdb) next
)(>> /Users/sammy/looping.py(2)<module
]'-> alpha_list = ['x', 'y', 'z
)(Pdb
فس ِّ
تنفذ ال دوال وتتوق ف في الس طر الت الي من تنفي ذ الدال ة .س نرى ه ذا الف رق رأي العين حين
نتعام ل م ع الدال ة الموج ودة في برنامجن ا .األم ر stepس يمر على الحلق ات خط ً
وة خط وة ح تى
) print(numberثم ننطلق إلى طباعة األحرف ) print(letterثم نعود إلى الرقم وهكذا.
(Pdb) step
)(>> /Users/sammy/looping.py(5)<module
-> def nested_loop():
(Pdb) step
> /Users/sammy/looping.py(11)<module>()
-> if __name__ == '__main__':
(Pdb) step
> /Users/sammy/looping.py(12)<module>()
-> nested_loop()
(Pdb) step
--Call--
> /Users/sammy/looping.py(5)nested_loop()
-> def nested_loop():
(Pdb) step
> /Users/sammy/looping.py(6)nested_loop()
-> for number in num_list:
(Pdb) step
> /Users/sammy/looping.py(7)nested_loop()
-> print(number)
(Pdb) step
500
> /Users/sammy/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb) step
> /Users/sammy/looping.py(9)nested_loop()
-> print(letter)
(Pdb) step
x
> /Users/sammy/looping.py(8)nested_loop()
-> for letter in alpha_list:
(Pdb) step
> /Users/sammy/looping.py(9)nested_loop()
-> print(letter)
(Pdb) step
y
> /Users/sammy/looping.py(8)nested_loop()
-> for letter in alpha_list:
▲ | 373
البرمجة بلغة بايثون ِّ استخدام:تنقيح الشيفرات
منقح بايثون
(Pdb)
ِّ
:المنقح مجد ًدا ِّ ثم ُنexit الحالية باستخدام األمر
شغل
(Pdb) next
> /Users/sammy/looping.py(5)<module>()
-> def nested_loop():
(Pdb) next
> /Users/sammy/looping.py(11)<module>()
-> if __name__ == '__main__':
(Pdb) next
> /Users/sammy/looping.py(12)<module>()
-> nested_loop()
(Pdb) next
500
x
y
z
600
x
y
z
700
x
y
z
--Return--
> /Users/sammy/looping.py(12)<module>()->None
▲ | 374
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
)(-> nested_loop
)(Pdb
تفحص القيم المُ سنَدة إلى المتغيرات أثناء مرورك على الشيفرة ،ويمكنك فع ل
ُّ قد ترغب في
ذلك باستخدام األمر ،ppوالذي يطبع قيمة التعبير المُ مرَّ ر إليه باستخدام الوحدة :pprint
(Pdb) pp num_list
][500, 600, 700
)(Pdb
تمل ك أغلبي ة األوام ر في المنقح pdbاختص ارات له ا ،فمثاًل الش كل المختص ر من األم ر step
ه و ،sوالمختص ر من nextه و .nس يعرض ل ك األم ر helpقائم ة االختص ارات المتاح ة .يمكن ك
أيضا إعادة استدعاء آخر أمر ُن ِّفذ في المنقح بالضغط على زر اإلدخال .Enter
ً
.3نقاط التوقف
من المرجح َّ
أنك ستعمل على برمجيات أكبر بكثير من المثال الس ابق ،ل ذا ق د ت رغب بتفحص
دوال أو أس طر معين ة ب داًل من الم رور على كام ل البرن امج ،ويمكن ك أن تض بط نق اط التوق ف
( )breakpointsباس تخدام األم ر ،breakفس يعمل البرن امج ح تى نقط ة التوق ف المح ددة .عن دما
تضيف نقطة توق ف فسيس ند المنقح رقمً ا إليه ا ،وه ذه األرق ام متتالي ة وتب دأ من ،1وال تي يمكن ك
االستفادة منها حين التعامل مع نقاط التوقف .يمكن إضافة نقاط توقف في أسطر برمجية معين ة
اكتب clearثم yإلزال ة جمي ع نق اط التوق ف الحالي ة ،يمكن ك بع دها أن تض ع نقط ة توق ف
إلزال ة نق اط التوق ف الحالي ة ،اكتب clearثم yمج د ًدا .يج در بال ذكر َّ
أنك تس تطيع أن
ً
شرطا: تضيف
حينما نستعمل اآلن األمر continueفسيتوقف تنفيذ البرنامج عندما تكون قيمة الرقم أكبر
من ( 500أي عندما يكون مساويًا إلى ،600وذلك في الدورة الثانية لحلقة التكرار الخارجية):
(Pdb) continue
500
x
y
z
)(> /Users/sammy/looping.py(7)nested_loop
)-> print(number
)(Pdb
وسائط ،وستحصل على معلومات حول نقاط التوقف جميعها التي ضبطتها:
(Pdb) break
Num Type Disp Enb Where
1 breakpoint keep yes at /Users/sammy/looping.py:7
stop only if number > 500
ً
إذ. م ع رقم نقط ة التوق فdisable أيض ا تعطي ل نقط ة توق ف باس تخدام األم ر يمكن ك
:clear األمر
(Pdb) enable 1
Enabled breakpoint 1 at /Users/sammy/looping.py:7
(Pdb) clear 2
Deleted breakpoint 2 at /Users/sammy/looping.py:11
(Pdb)
ً
وهنال ك وظ ائف إض افية له ا،دقيق ا في عملي ة التنقيح تحكمً اpdb تمنحك نقاط التوقف في
(كم ا فيignore تتضمن تجاهل نقاط التوقف في الجلس ة الحالي ة من البرن امج باس تخدام األم ر
(كم ا في األمرcommand وتشغيل إجراءات في نقاط التوقف باس تخدام األم ر،)ignore 1 األمر
▲ | 377
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
األمر ( tbreakفلو أردنا إنشاء نقطة توقف مؤقتة في السطر الثالث مثاًل ،نكتب .)tbreak 3
قبل السطر الذي تريد بدء جلسة التنقيح منه .إذ سنضيف في مثالن ا الس ابق عب ارة importونب دأ
def nested_loop():
for number in num_list:
)print(number
ِّ
المنقح إلى ش يفرتك ،فلن تحت اج إلى تش غيل برنامج ك بطريق ة خاص ة ،أو ت ذكر بإض افة
ضبط نقاط التوقف .يسمح لك اس تيراد الوح دة pdbواس تدعاء الدال ة )( pdb.set_traceبب دء
ِّ
المنقح أثناء تنفيذ البرنامج. برنامج مثل المعتاد ،وتشغيل
def print_sammy():
][ = sammy_list
"sammy = "sammy
for letter in sammy:
)sammy_list.append(letter
)print(sammy_list
إذا شغلنا البرنامج بالشكل المعت اد باس تخدام األم ر python letter_list.pyفسنحص ل
]'['s
]'['s', 'a
]'['s', 'a', 'm
]'['s', 'a', 'm', 'm
]'['s', 'a', 'm', 'm', 'y
أمَّ ا مع منقح بايثون ،فس نرى كي ف يمكنن ا تغي ير ت رتيب التنفي ذ بتخطي أول دورة من تنفي ذ
▲ | 380
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
(Pdb) continue
]'['s
]'['s', 'm
]'['s', 'm', 'm
]'['s', 'm', 'm', 'y
جلسة التنقيح السابقة تضع نقطة توقف في السطر الخامس لمن ع المنقح من تنفي ذ الش يفرة
التي تلي هذه النقطة ،ثم تكمل تنفيذ الشيفرة (مع طباعة قيمة letterلنرى ما الذي يحدث) ،ثمَّ
سنس تخدم األم ر jumpللتخطي إلى الس طر الس ادس ،وفي ه ذه النقط ة ك انت قيم ة
المتغير letterتساوي السلسلة النصية ' ،'aلكنن ا لمَّ ا تجاوزن ا الش يفرة ،فلن تض اف ه ذه القيم ة
إلى القائم ة ( )listالمس ماة ،sammy_listومن بع دها عطلن ا نقط ة التوق ف لالس تمرار في تنفي ذ
يمكنن ا اآلن إع ادة تش غيل المنقح للع ودة إلى البرن امج وإع ادة تش غيل األم ر البرمجي ة ال تي
ِّ
المنقح: ً
مسبقا ،وفي هذه المرة سنشغل أول حلقة تكرار في forفي جرى تنفيذه
)(>> /Users/sammy/letter_list.py(1)<module
-> def print_sammy():
(Pdb) list
1 -> def print_sammy():
2 ][ = sammy_list
3 "sammy = "sammy
4 for letter in sammy:
5 )sammy_list.append(letter
6 )print(sammy_list
7
8 if __name__ == "__main__":
9 print_sammy()
10
11
(Pdb) break 6
Breakpoint 1 at /Users/sammy/letter_list.py:6
(Pdb) continue
> /Users/sammy/letter_list.py(6)print_sammy()
-> print(sammy_list)
(Pdb) pp letter
's'
(Pdb) jump 5
> /Users/sammy/letter_list.py(5)print_sammy()
-> sammy_list.append(letter)
(Pdb) continue
> /Users/sammy/letter_list.py(6)print_sammy()
-> print(sammy_list)
(Pdb) pp letter
's'
(Pdb) disable 1
Disabled breakpoint 1 at /Users/sammy/letter_list.py:6
(Pdb) continue
['s', 's']
['s', 's', 'a']
['s', 's', 'a', 'm']
['s', 's', 'a', 'm', 'm']
['s', 's', 'a', 'm', 'm', 'y']
ثم «قفزن ا» إلى الس طر،أض فنا في جلس ة التنقيح الس ابقة نقط ة توق ف في الس طر الس ادس
' ق د أض يفت م رتين إلى القائم ةs' ورأين ا أن السلس لة النص ية،الخ امس بع د اإلكم ال
َّ ثم،sammy_list
ورأين ا في،عطلن ا نقط ة التوق ف في الس طر الس ادس وأكملن ا تنفي ذ البرن امج
َ
.sammy_list ' مضافين إلى القائمةs' حرفي المخرجات وجود
▲ | 382
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
ِّ
المنقح بعض أن واع القف زات ،مث ل القف ز داخ ل وخ ارج بني ة تحكم ،فمثاًل ال يمكن أن يمن ع
يمكن ك أن تقف ز إلى تنفي ذ دال ة قب ل تعري ف وس ائطها ،وال يمكن ك أن تقف ز إلى داخ ل عب ارة
ً
أيض ا أن تقف ز خ ارج بني ة .finallyتس مح لن ا عب ارة jumpالموج ودة .try:exceptوال يمكن ك
في ِّ
منقح بايثون بتغيير تسلسل تنفيذ البرنامج أثن اء تنقيح ه ل نرى إن ك ان باإلمك ان تحس ين ه ذا
منقح بايثون:
يمكنك قراءة المزيد عن األوامر السابقة والتعامل مع المنقح عبر توثيق بايثون الرسمي.
ً
فرصة لتجربة الشيفرة التي تكتبها. ( )interpreterالتفاعلي ،إذ توفر هذه الوحدة
ألنها ستمكنك من استخدام م ترجم دون التض حية بالتعقي د واالس تدامة ٌ
مفيدة َّ هذه الوحدة
البرن امج عن د اس تدعائها ،وت وفر ل ك س طر أوام ر تف اعلي ح تى تتمكن من فحص الوض ع
الحالي لبرنامجك.
ُت ِّ
نفذ ه ذه الدال ة حلق ة اق رأ-قيِّ م-اطبع (تختص ر إلى ،REPLأي ،Read–eval–print loop
بايثون التفاعلي.
المعامل exitmsgجديد ،ولم يظهر حتى إصدار بايثون ،3.6لذلك إن كنت تس تخدم إص دا ًرا
ِّ
فحدثه ،أو ال تستخدم المعامل .exitmsg أقدم،
محليا.
ًّ سنعين المعامل المحلي عند القيمة )( localsلجعل فضاء األسماء
ّ .balances.py
bal_a = 2324
bal_b = 0
bal_c = 409
bal_d = -2
def display_bal():
for balance in account_balances:
if balance < 0:
"print("Account balance of {} is below 0; add funds now.
)).format(balance
else:
print("Account balance of {} is above
))0.".format(balance
)(display_bal
لق د اس تدعينا الدال ة )( code.interactم ع المعام ل )( local=localsالس تخدام فض اء
ل ُن ِّ
نفذ البرن امج أعاله باس تخدام األم ر python3إذا لم نكن تعم ل في بيئ ة افتراض ية ،أو
python balances.py
)>>> print(bal_c
409
)>>> print(account_balances
][2324, 0, 409, -2
))(>>> print(display_bal
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
None
)>>> print(display_bal
><function display_bal at 0x104b80f28
نرى َّ
أنه باستخدام فضاء األسماء المحلي ،يمكننا طباعة المتغيرات ،واس تدعاء الدال ة .يُ ظه ر
بعد أن تنتهي من العمل على المترجم ،يمكنك الضغط على CTRL + Dفي األنظم ة المس تندة
إلى يونكس ،أو CTRL + Zفي أنظمة ويندوز لمغادرة سطر األوامر ومتابعة تنفيذ البرنامج.
إذا أردت الخروج من سطر األوامر دون تنفي ذ الج زء المتبقي من البرن امج ،ف اكتب )(،quit
وسيتوقف البرنامج.
)(display_bal
Start
>>>
ي تيح ل ك اس تخدام المعام ل bannerتع يين ع َّدة نق اط داخ ل ش يفرتك ،م ع الق درة على
تحدي دها .على س بيل المث ال ،يمكن أن يك ون ل ديك معام ل bannerيطب ع السلس لة النص ية
بالضبط في الشيفرة.
من هنا ،يمكننا اس تخدام الم ترجم مث ل المعت اد .بع د كتاب ة CTRL + Dللخ روج من الم ترجم،
End
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
بمجرد االنتهاء من استخدام الوحدة codeلتنقيح الش يفرة ،يجب علي ك إزال ة دوال الوح دة
تحصل أثناء تش غيل البرن امج ،ويمكنن ا إض افة اس تدعاءات للتس جيل ض من الش يفرة لإلش ارة إلى
معين .تس مح الوح دة loggingبالتس جيل ألغ راض استكش اف المش اكل وإص الحها،
َّ ح دوث أم ر
وتس جيل األح داث المتعلق ة بتش غيل التط بيق ،إض ً
افة إلى س جل األح داث ال ذي يس ِّجل تف اعالت
تبقي الوح دة loggingس جاًل باألح داث ال تي وقعت ض من البرن امج ،مم ا يس مح برؤي ة
ُّ
التحقق المخرجات المتعلقة بأي ح دث ال تي تح دث أثن اء تش غيل البرن امج .ق د تك ون معت ا ًدا على
أساس ية لمحاول ة تنقيح الش يفرة وح ل المش كالت .لكن اس تخدام printلتنقيح البرن امج وتتب ع
عبا التفري ق بين مخرج ات التنقيح والمخرج ات العادي ة للبرن امج ،فس تختلط
سيصبح ص ً •
المخرجات مع بعضها.
ال توج د طريق ة س هلة لتعطي ل ال دوال printعن د اس تخدامها متن اثرة في مواض ع •
مختلفة في الشيفرة.
بموثوقية عالية.
َّ ال يوجد سجل يوضح ما هي معلومات التشخيص واستكشاف ألخطاء •
تعرض سلوك وأخطاء التطبيق على فترة من الزمن ،فستحصل على صورة ش املة عمَّ ا يح دث في
كنت معتا ًدا على استخدام الدالة printلترى ماذا يحدث في تطبيق ك ،فس تكون معت ا ًدا
َ إذا
ً
صنفا ويُ هيِّ ئ الكائنات فيه: على رؤية تطبيق مثل المثال اآلتي الذي يُ ِّ
عرف
class Pizza():
def __init__(self, name, price):
self.name = name
self.price = price
print("Pizza created: {} (${})".format(self.name,
self.price))
واآلخ ر باس م، إلنش اء البي تزاmake() أح دهما باس م، ول دى الص نف ت ابعين.Pizza من الص نف
. بقيم ة ابتدائي ة تس اويquantity ه ذان التابع ان يقبالن مع اماًل باس م:-p ألك ل البي تزاeat()
ِّ
:لنشغل البرنامج
python pizza.py
▲ | 391
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
صحيح أننا نستخدم الدالة printلرؤية كيف تعم ل الش يفرة ،لكن يمكنن ا اس تخدام الوح دة
ٌ
يفرة، ودة في الش ة printالموج نزل الدال ا .ل داًل منه كب ل ذل loggingلفع
import logging
class Pizza():
def __init__(self, name, value):
self.name = name
self.value = value
…
مس توى أعلى بدرج ة واح دة من ( DEBUGتنقيح) ،ولمَّ ا كنَّا نري د اس تخدام الوح دة logging
للتنقيح في هذا المثال ،فعلينا تغي ير الض بط لكي يك ون مس توى التس جيل ه و ،logging.DEBUG
import logging
)logging.basicConfig(level=logging.DEBUG
class Pizza():
.10 هيDEBUG وقيم ة المس توى، إلى قيم ة رقمي ة ثابت ةlogging.DEBUG تش ير القيم ة
وعلى النقيض من،logging.debug() ابع إلى التprint دوال ع ال ِّدل اآلن جمي لنب
ٌ
اص خlogging.debug() إن الت ابع
َّ ف، ال تي هي قيم ة عددي ة ثابت ةlogging.DEBUG
وعند التعامل م ع ه ذا الت ابع فيمكنن ا اس تخدام نفس السلس لة النص ية المُ م رَّ رة،logging بالوحدة
import logging
logging.basicConfig(level=logging.DEBUG)
class Pizza():
def __init__(self, name, price):
self.name = name
self.price = price
logging.debug("Pizza created: {} (${})".format(self.name,
self.price))
▲ | 393
البرمجة بلغة بايثون ِّ استخدام:تنقيح الشيفرات
منقح بايثون
pizza_01.eat()
: فسنحصل على الناتج اآلتيpython pizza.py عندما نشغل البرنامج باستخدام األمر
) مختل ف لك ل وح دة منlogger( لذا يمكنك استخدام مس ِّجل،المسجالت التي لها أسماء مختلفة
يمكنن ا إس ناد أك ثر من مس ِّجل معً ا وإعطائه ا، على س بيل المث ال.وح دات ب ايثون الخاص ة ب ك
:أسماء مختلفة
logger1 = logging.getLogger("module_1")
logger2 = logging.getLogger("module_2")
logger1.debug("Module 1 debugger")
logger2.debug("Module 2 debugger")
DEBUG:module_1:Module 1 debugger
DEBUG:module_2:Module 2 debugger
▲ | 394
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
كيفية اس تخدام الوح دة loggingلطباع ة الرس ائل إلى الطرفي ة ،فلننتق ل إلى
َّ بع د أن فهمن ا
اله دف الرئيس ي من الوح دة loggingهي تس جيل الرس ائل إلى مل ف ب داًل من طباعته ا إلى
الطرفية ،إذ يؤدي وجود ملف يحت وي على البيان ات المُ َّ
خزن ة على ف ترة زمني ة طويل ة إلى إحص اء
وتق دير م ا هي التغي يرات ال تي يجب إجراؤه ا على الش يفرة أو البرن امج كك ل .يمكنن ا تع ديل
الت ابع )( logging.basicConfigلب دء التس جيل إلى مل ف ،وذل ك بتمري ر المعام ل ،filename
import logging
)logging.basicConfig(filename="test.log", level=logging.DEBUG
class Pizza():
def __init__(self, name, price):
self.name = name
self.price = price
logging.debug("Pizza created: {} ($
)){})".format(self.name, self.price
))self.name
الش يفرة الس ابقة مش ابهة كث يرًا للش يفرة الموج ودة في القس م الس ابق ،باس تثناء أنن ا أض فنا
اس م المل ف filenameلتخ زين مخرج ات الس جل .وبع د تش غيل الس كربت باس تخدام األم ر
نشأ ٌ
ملف جدي ٌد في المجلد الخ اص بن ا باس م .test.log python pizza.pyفمن المفترض أن يُ َ
vi test.log
ُّ
تفحص محتويات الملف ،فسنرى ما يلي: عند
الناتج شبيه بمحتويات الطرفية ال تي رأيناه ا في القس م الس ابق ،لكنَّه ا مُ َّ
خزن ة اآلن في مل ف
.test.logلنع د إلى تع ديل المل ف pizza.pyلتع ديل الش يفرة ،س نبقي أغلبي ة الش يفرة على
import logging
logging.basicConfig(filename="test.log", level=logging.DEBUG)
class Pizza():
def __init__(self, name, price):
self.name = name
self.price = price
logging.debug("Pizza created: {} ($
{})".format(self.name, self.price))
▲ | 397
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
vi test.log
ً
موجودة: الماضية ما تزال
َّ المرة
أن هذه المعلومات مفيدة بكل تأكيد ،لكن يمكننا أن نجعل السجل مليًئا بالمعلومات
وصحيح َّ
ٌ
بإض افة خاص ية .LogRecordوأهم م ا نري د فعل ه ه و إض افة بص مة وقت قابل ة للق راءة بس هولة
ال تي تخبرن ا م تى ُأ ِ
نش ئ الس جل .سنض يف ذل ك إلى المعام ل ،formatإذا نض ع %(asctime)s
لة مين السلس توى ( )DEBUGفيجب تض م المس اء اس وقت ،وإلبق افة ال إلض
النص ية ،%(levelname)sولإلبق اء على الرس ائل ال تي نطلب من المس جل أن يس جلها ،فعلين ا
تض مين ،%(message)sك ل سلس لة نص ية من الخاص يات الس ابقة مفص ولة عن بعض ها بنقط تين
import logging
logging.basicConfig(
filename="test.log",
level=logging.DEBUG,
format="%(asctime)s:%(levelname)s:%(message)s"
)
class Pizza():
def __init__(self, name, price):
self.name = name
self.price = price
logging.debug("Pizza created: {} ($
{})".format(self.name, self.price))
فستحص ل على أس طرpython pizza.py عن د تش غيل الش يفرة الس ابقة باس تخدام األم ر
▲ | 399
البرمجة بلغة بايثون تنقيح الشيفرات :استخدام ِّ
منقح بايثون
جدي دة في المل ف test.logال تي تتض من بص مة ال وقت ومس توى التس جيل ( )DEBUGوالرس ائل
المرتبطة بها:
اعتم ا ًدا على احتياجات ك ،ربم ا تس تعمل خاص يات LogRecordفي ش يفراتك لتخصيص ها.
ً
فرصة لتصحيح وتعديل الشيفرات ببصيرة. الزمن ،مما يعطيك
يمكن ك إس ناد مس توى أهمي ة إلى الح دث باس تخدام مس تويات التس جيل .مس تويات
دءا من
ً التس جيل هي قيم عددي ة (ثابت ة) ،وال تي تك ون من مض اعفات الع دد ،10ب
ً
أيض ا تعري ف المس تويات المس توى NOTSETال ذي يه يئ المس ِّجل بقيم ة عددي ة تس اوي .0يمكن ك
عرفت مستوى بقيمة عددية مساوية للقيمة العددية لمس توى موج ود مس ً
بقا، َ الخاصة بك ،لكن إذا
يُ ِ
ظه ر الج دول اآلتي مختل ف مس تويات التس جيل م ع القيم العددي ة المرتبط ة به ا ،وم ا هي
الدالة التي يمكن استعمالها الستدعاء المستوى ،وألي مستوى من الرسائل تستخدم:
و ERRORو CRITICALافتراض ًيا .ففي المث ال اآلتي س نعدل الض بط لإلش ارة لتض مين
مستوى :DEBUG
)logging.basicConfig(level=logging.DEBUG
يمكن ك التع رُّ ف على المزي د من األوام ر والتعام ل معه ا ب االطالع على توثي ق
loggingالرسمي.
.9خالصة الفصل
عملي ة التنقيح هي خط وة مهم ة في جمي ع مش اريع التط وير البرمجي ة .وي وفر لن ا ِّ
منقح
بايثون pdbبيئة تنقيح تفاعلية يمكن استخدامها مع أي برنامج بايثون نكتبه .باستفادتنا للميزات
التي تسمح لنا بتوقف عمل البرنامج مؤق ًت ا ،وإلق اء نظ رة على المتغ يرات ،وإكم ال تنفي ذ البرن امج
خط ً
وة بخط وة ،مم ا يمكنن ا من فهم م اذا يفع ل البرن امج بالتفص يل ويس اعدنا على اكتش اف العل ل
بقص د فهم س لوكها ،وتع ديل الش يفرة إن ل زم األم ر .لق راءة المزي د ح ول ه ذا الموض وع ،يمكن ك
تساعد الوحدة – loggingال تي هي ج زء من مكتب ة ب ايثون القياس ية– بتتب ع األح داث ال تي
تحصل أثناء تش غيل البرن امج ،ويمكن إخ راج ه ذه األح داث إلى ملف ات منفص لة للس ماح بتتب ع م ا
يحدث عن دما تعم ل الش يفرة .وه ذا ي وفر لن ا الفرص ة لتنقيح الش يفرة اعتم ا ًدا على فهمن ا لمختل ف
قبل أن ننظر إلى إمكانيات إصدارَ ي بايثون 2وبايثون ( 3مع االختالفات البرمجي ة الرئيس ية
.1بايثون 2
ُن ِش رَ ه ذا اإلص دار في أواخ ر ع ام ،2000وأص بحت ب ايثون 2لغ ة برمج ة ش املة موازن ًة
باإلص دارات ال تي تس بقها وذل ك بع د تط بيق اق تراح ،)Python Enhancement Proposal ( PEP
يزات
ٍ مواصفة ( )specificationتقني ٌة ت ِّ
وفر معلوم ات إلى أعض اء مجتم ع ب ايثون أو تص ف م ٌ وهو
" "cycle-detecting garbage collectorألتمتة عملية إدارة الذاكرة ،وزيادة دعم يونيكود لت دعم
اللغة جميع المح ارف المعياري ة …إلخ .وأثن اء عملي ة تط وير ب ايثون 2أض يفت م يزات جدي دة بم ا
في ذل ك توحي د األن واع واألص ناف في ب ايثون في بني ة هيكلي ة وحي دة (وذل ك في إص دار 2.2
من بايثون).
.2بايثون 3
تع ّد بايثون 3مستقبل لغة بايثون وهي قيد التطوير من اللغة ،وه ذا إص دارٌ رئيس ٌ
ي ُن ِش ر في
أواخر عام 2008إلصالح بعض المشاكل الجوهرية في تصميم اإلصدارات السابقة من اللغ ة ،وك ان
التركيز أثناء تطوير بايثون 3هو تحسين الشيفرات التي تبنى عليها اللغ ة وح ذف التك رارات ،مم ا
معينة.
َّ أن هنالك طريقة وحيدة فقط إلنجاز مهمَّ ة
يعني َّ
التع ديالت األساس ية ال تي ح دثت في ب ايثون 3.0تتض من تغي ير التعليم ة printإلى دال ة
مُ ضمَّ نة باللغة ،وتحسين قسمة األعداد الصحيحة ،وتوفير دعم إضافي ليونيكود.
في البداية ،انتشرت بايثون 3ببطء نتيج ًة لع دم توافقيته ا م ع ب ايثون ،2مم ا يع ني َّ
أن على
المستخدمين اختي ار م ا ه و اإلص دار ال ذي عليهم اس تخدامه .باإلض افة إلى ذل ك ،ك انت الكث ير من
المكتب ات البرمجي ة متاح ًة فق ط لب ايثون ،2لكن بع د تقري ر فري ق تط وير ب ايثون َّ 3
أنه يجب أن
التخلي عن دعم ب ايثون ،2فب دأت عملي ة تحوي ل المكتب ات إلى ب ايثون .3يمكنن ا معرف ة زي ادة
االعتماد على بايثون 3من خالل عدد الحزم البرمجية التي ت دعم ب ايثون ،3وال تي هي (في وقت
.3بايثون 2.7
بع د إص دار ب ايثون 3.0في ،2008ص دِ رَ ت نس خة ب ايثون 2.7في تم وز 2010وهي آخ ر
ُأ
ب ايثون 2.xلتحوي ل ب رامجهم إلى ب ايثون 3بتوف ير بعض التوافقي ة بينهم ا .وه ذه التوافقي ة
ولكونه ا جس رًا واص اًل بين اإلص دارات القديم ة من ب ايثون 2وبين ب ايثون ،3.0فأص بحت خي ا ًرا
تمامً ا في .2020
الش يفرات وفي طريق ة تفس يرها .س أعرض هن ا بعض األمثل ة ،لكن علي ك أن تعلم َّ
أنك س تواجه
اprint .
في ب ايثون ُ ،2تعامَ ل printمعامل ة التعليم ات البرمجي ة ( )statementب داًل من كونه ا دال ة،
ً
ارتباكا ،إذ تتطلب الكثير من األمور داخل بايثون تمرير وس ائط ( )argumentsبين وهذا كان يثير
فسر بايثون 2لطباعة " ،"Sammy the Shark is my favorite sea creature
فتحت مُ ِّ
َ قوسين ،إذا
أمَّ ا في ب ايثون ،3فس ُتعامَ ل )( printمعامل ة ال دوال ،ل ذا لطباع ة السلس لة النص ية الس ابقة،
كالية عن دما تح اول قس مة األع داد الص حيحة على بعض ها ،فتتوق ع في بعض األحي ان
َّ ت أتي اإلش
ً
أيض ا باألع داد ذات الفاص لة [ )]floatكم ا في العملي ة حص ولك على ع ددٍ عش ري (تس مى
الرياضية التالية:
5 / 2 = 2.5
العملية التي
َّ لكن األعداد الصحيحة في بايثون 2لن تتحوَّ ل إلى أعداد عشريَّ ة عندما تتطلب
َّ
a = 5 / 2
print a
2
إلع ادة ع دد عش ري ،فيجب إض افة فواص ل عش ريَّ ة إلى األرق ام ال تي س ُتجري عليه ا عملي ة
القسمة كما في 5.0 / 2.0لكي تحص ل على النتيج ة المنطقي ة .2.5أم ا في ب ايثون ،3فقس مة
a = 5 / 2
print a # 2.5
َ
أردت تق ريب ن اتج القس مة فاس تخدم يمكن ك اس تخدام 5.0 / 2.0إلع ادة ،2.5لكن إن
a = 5 // 2
print a
2
هذا التعديل في بايثون 3جعل من قسمة األعداد الصحيحة أمرًا سهاًل ،لكن ه ذه الم يزة غ ير
ٌ
سلسلة من المحارف)، عندما تتعامل لغات البرمجة مع السالسل النصية ( ،stringsوالتي هي
فهي تفعل ذلك بطرائق مختلفة لكي تتمكن الحواسيب من تحويل األعداد إلى أحرف ورموز.
"Hello, تس تعمل ب ايثون 2مح ارف ASCIIافتراض ًيا ،ل ذا عن دما تكتب "!Sammy
خصوصا المحارف غير الالتينية (مث ل العربي ة مثال) .إن أردت اس تخدام ترم يز مح ارف يونيك ود
ً
( )Unicodeال ذي ي دعم أك ثر من 128000مح رف ت ابع للكث ير من اللغ ات والرم وز ،فعلي ك أن
تس تعمل ب ايثون 3مح ارف يونيك ود ( )Unicodeافتراض يا ،مم ا ي ِّ
وفر علي ك بعض ال وقت ً
أثناء التطوير ،ويمكن ك كتاب ة وع رض ع دد أك بر بكث ير من المح ارف في برنامج ك بس هولة .ي دعم
يونيكود الكثير من المحارف بما في ذل ك الوج وه التعبيري ة ( ،)emojisواس تعمالها ترم يز مح ارف
أن
تلقائي ا .إذا كنت تحب َّ
ً أن األجه زة المحمول ة س تكون مدعوم ًة في مش اريعك
افتراض ي يع ني َّ
الفارق الرئيسي بين بايثون 3وبايثون 2ليس في البني ة اللغوي ة وإنم ا في َّ
أن إص دار ب ايثون
فأنص حك ب التفكير بمس تقبل ب ايثون ،فسيس تمر تط وير ودعم ب ايثون 3بينم ا س يوقف دعم
كنت ُت ِّ
خطط لالنض مام لفري ق تط وير َ ب ايثون 2.7عمَّ ا ق ريب (إن لم يكن ق د توق ف .) D-:أمَّ ا إذا
أحد المشاريع ،فعليك أن تنظر ما هو إصدار بايثون المستخدم فيه ،وكيف ي ؤدي اختالف اإلص دار
إلى اختالف طريق ة تعامل ك م ع الش يفرات ،وإذا م ا ك انت المكتب ات البرمجي ة المس تعملة في
ً
مدعومة في مختلف اإلصدارات ،وما هي تفاصيل المشروع نفسه. المشروع
توافقية أق ل م ع
َّ األولية من ب ايثون 3له ا
َّ ً
سابقا ،اإلص دارات إصدارات بايثون المدعومة .وكما قلنا
المكتب ات المبني ة لب ايثون ،2لكن الكث ير منه ا ق د ج رى تحويل ه إلى ب ايثون ،3وسيس تمر ذل ك في
آليات وممارس ات ترحي ل الش يفرات من ب ايثون 2إلى ب ايثون ،3وم ا إن ك ان علي ك جع ل الش يفرة
الش فافية والش مولية ،إذ ش مل ه ذا اإلص دار العدي د من الم يزات البرمجي ة ،واس تمر في إض افة
في خض م ذل ك ،ج اء اإلص دار ب ايثون 2.7في ع ام 2010ليك ون آخ ر إص دارات ب ايثون 2.x
ولي ِّسهل على مستخدمي ب ايثون 2.xاالنتق ال إلى ب ايثون 3من خالل توف ير ق در من التواف ق بين
ُ
لالنتق ال إلى ب ايثون ،3أو ل دعم ب ايثون 2وب ايثون 3معً ا ،يجب علي ك التأك د من َّ
أن ش يفرة
يعم ل العدي د من المط ورين حص ريًا بش يفرات ب ايثون ،2.7أمَّ ا الم برمجون ال ذي يعمل ون
كنت تعم ل بإص دار س ابق من ب ايثون ،2فس تجد نفس ك تتعام ل م ع مش كالت في ش يفرة لم تع د
ً
أيض ا بعض األدوات ال تي ِّ
تس هل ترحي ل الش يفرة ،مث ل مدعوم ة ،ولم تع د ثغراته ا ُتص َّحح .هن اك
الحزم ة Pylintال تي تبحث عن األخط اء البرمجي ة ،لكن ال ت دعمها إص دارات ب ايثون الس ابقة
لإلصدار .2.7
أن ب ايثون 2.7م ا زالت قي د ال دعم والص يانة في من المهم أن تض ع في حس بانك َّ
أنه رغم َّ
ب .االختبار
ي من عملي ة ترحي ل ش يفرة ب ايثون 2إلى ب ايثون .3ف إذا كنت اختب ار الش يفرة ج ٌ
زء أساس ٌّ
يمكنك إضافة حاالت ب ايثون التفاعلي ة ( )interactive Python casesإلى السالس ل النص ية
التوثيقية ( )docstringsالخاص ة بكاف ة ال دوال والتواب ع واألص ناف والوح دات ثم اس تخدام
َّ
نفذ .يمكن أن تطب ع Cover.pyتقري رًا في س طر األوام ر ،أو تنتج مس تند ُ .HTMLتس تخدم
لم ُت َّ
ُ
اخت ِب رت ،واألج زاء ال تي ع ً
ادة لقي اس فعالي ة االختب ارات ،إذ توض ح األج زاء من الش يفرة ال تي
لم ُت َ
ختبر.
أي شيفرة غامض ة أو غ ير عادي ة. ذكر أنه ليس عليك اختبار كل شيء ،لكن َّ
تأكد من تغطية ّ َت َّ
للحصول على أفضل النتائج ،يُ نصح أن تشمل التغطية ٪80من الشيفرة.
ً
أيض ا مراجع ة توثي ق ً
مسبقا إلى بعض االختالفات الرئيسية بين اإلصدارين ،ويمكنك تطرقنا
عند البدء في ترحيل الشيفرة ،فهناك بعض التغييرات في الصياغة عليك تعديلها فوريً ا.
:Printحلت الدالة )( printفي بايثون 3مكان التعليمة printفي بايثون .2 •
بايثون # 2
"!print "Hello, World
بايثون # 3
)"!print("Hello, World
ً
دالة تسمح بتمرير متغيرات محلية تغيرت التعليمة execفي بايثون 2وأصبحت
َّ :exec •
بايثون # 2
exec code # 1
بايثون # 3
)exec(code # 1
/و ُ ://تج ِري ب ايثون 2القس مة التقريبي ة ( )floor divisionبالعام ل ،/بينم ا تخص ص •
بايثون # 2
5 / 2 = 2
بايثون # 3
5 / 2 = 2.5
5 // 2 = 2
:raiseفي ب ايثون ،3يتطلب إطالق االس تثناءات ذات الوس ائط اس تخدام األق واس، •
بايثون # 2
raise Exception, args # 1
بايثون # 3
raise Exception # 1
)raise Exception(args
:exceptفي بايثون ،2كان من الصعب إدراج االس تثناءات المُ تع ِّددة لكن ذل ك َّ
تغير في •
بايثون # 2
except Exception, variable:
بايثون # 3
except AnException as variable:
except (OneException, TwoException) as variable:
:defفي ب ايثون ،2يمكن لل دوال أن تقب ل سالس ل مث ل الص فوف أو الق وائم .أمَّ ا في •
بايثون # 2
def function(arg1, (x, y)):
بايثون # 3
def function(arg1, x_y): x, y = x_y
:exprلم تعد صياغة عالمة االقتب اس المائل ة `` في ب ايثون 2ص الحة ،واس تخدم ب داًل •
بايثون # 2
`x = `355/113
بايثون # 3
x = repr(355/113):
تنس يق السالس ل النص ية ( :)String Formattingلق د تغ يرت ص ياغة تنس يق السالس ل •
بايثون # 2
)"%d %s" % (i, s # 1
)"%d/%d=%f" % (355, 113, 355/113 # 2
بايثون # 3
)"{} {}".format(i, s # 1
)"{:d}/{:d}={:f}".format(355, 113, 355/113 # 2
ت ذكر كيفي ة اس تخدام تنس يقات السالس ل النص ية من فص ل كيفي ة اس تخدام آلي ة تنس يق
بايثون # 2
class MyClass(object):
pass
بايثون # 3
class MyClass:
pass
بايثون # 2
class MyClass:
__metaclass__ = MyMeta
class MyClass(MyBase):
__metaclass__ = MyMeta
بايثون # 3
class MyClass(metaclass=type):
pass
class MyClass(MyBase, metaclass=MyMeta):
pass
.8تحديث الشيفرة
توافقيته ا م ع
َّ تلقائيا إلى ب ايثون 3م ع الحف اظ على
ً هناك أ َداتان ّ
رئيسيتان لتَحديث الشيفرة
هات ان األدات ان في إع ادة كتاب ة الش يفرة وتحدي د ورص د المش اكل المحتمل ة وتص حيحها .يمكن ك
أن ُّ
والتحقق منه ا بص ريً ا ،والتأك د من َّ تش غيل األداة ع بر مجموع ة unittestلفحص الش يفرة
ُأ
المراجع ات التلقائي ة ال تي ج ريَ ت دقيق ة .وبمج رد انته اء االختب ارات ،يمكن ك
تحويل الشيفرة.
بع د ه ذا ،س تحتاج على األرجح إلى إج راء مراجع ة يدويَّ ة ،وخاص ة اس تهداف االختالف ات
بين ب ايثون 2و 3الم ذكورة في القس م أعاله .إن أردت اس تخدام ،futureفعلي ك إض افة عب ارة
أخ يرًا ،يمكن ك اس تخدام الحزم ة pylintلتحدي د ورص د أي مش كالت محتمل ة أخ رى في
الشيفرة .تحتوي هذه الحزمة على مئات القواعد التي تغطي مجموعة واسعة من المش كالت ال تي
قد تطرأ ،بما فيها قواعد الدليل ،PEP 8باإلضافة إلى أخطاء االستخدام.
أن بعض أج زاء ش يفرتك ترب ك pylintوأدوات الترحي ل التلق ائي األخ رى .ح اول
ق د تج د َّ
اإلط ار unittestباس تمرار وف ق مب دأ التكام ل المس تمر (وليس ي دويًا) ،أي أن تفع ل ذل ك أك بر ع دد
التوافقية بين
َّ ممكن من الم رات أثن اء عملي ة التط وير .إذا كنت تس تخدم الحزم ة sixلص يانة
بايثون 2و ،3فستحتاج إلى استخدام ع َّدة بيئات عمل ألجل االختبار.
الحزمة مع مختلف إصدارات بايثون ،وإجراء االختبارات في كل بيئ ة من بيئ ات عمل ك ،كم ا يمكن
.10خالصة الفصل
ممتازا وسهلة التعلم ،ومهما كان اختيارك (ب ايثون 2أو
ً ً
توثيقا لغة بايثون كبيرة ج ًدا وموثقة
أن ب ايثون 2.7 المحورية ،لكن ليس من الصعب االنتقال من بايثون 3إلى ب ايثون ،2وس تجد ع ً
ادة َّ
أن ترك يز المط ورين والمجتم ع أص بح منص ًّبا نح و ب ايثون ،3وستص بح ه ذه اللغ ة رائ ً
دة في َّ