Data Loading...

Python-1 Flipbook PDF

Python-1


181 Views
681 Downloads
FLIP PDF 536.73KB

DOWNLOAD FLIP

REPORT DMCA

‫ﺗﻢ ﺗﺤﻤﻴﻞ اﻟﻤﻠﻒ ﻣﻦ ﻣﻮﻗﻊ‬ ‫اﻟﺒﻮﺻﻠﺔ اﻟﺘﻘﻨﻴﺔ‬ ‫‪www.boosla.com‬‬

‫تعلم بايثون بكل سهولة‬

‫بقلم‪:‬‬

‫فهد بن عامر السعيدي‬ ‫‪OMLX‬‬ ‫‪2005‬‬

‫‪1‬‬

‫مقدمة‬ ‫لغة بايثون تتميز بالسهولة من حيث الكتابة و القراءة ومن حيث التركيب‬ ‫النحوي لها‪ ،‬و تستطيع أن تبرمج بها في كل المنصات المعروفة اﻵن‪ ،‬فهي‬ ‫تضارع لغة ‪ Java‬العريقة‪ ،‬و تصلح لكل اﻷغراض تقريبا‪.‬‬ ‫ولقمد شجعنمي على كتابمة هذه الورقات القليلة‪ ،‬التمي أسمأل ال أن يممن علي‬ ‫بإتمامهما قلة المصمادر العربيمة التمي تتكلم عمن هذه اللغمة‪ ،‬وكأن هذه اللغمة‬ ‫ليست موجودة في عالم التقنية‪ ،‬فتجشمت عناء كتابة هذه الورقات‪.‬‬ ‫ملحظات حول الكتاب‪:‬‬ ‫هذا الكتاب مفتوح (حر) خاضع لرخصة ‪( GNU FDL‬أي ‪GNU Free‬‬ ‫‪ )Documentation License‬نسخ أو تصوير أو القتباس من هذا الكتاب ل يعد مخالفاً‬ ‫للقانون إذا حصلت عليه بأي طريقه (شراء أو هدية أو استعارة أو تنزيل من الشبكة ‪ )...‬فإنه‬ ‫يحق لك نسخه والتعديل فيه ‪ ،‬ويمكنك تنزيله مجاناً‪ .‬ولكن إذا استخدمته في عمل منتج مشتق‬ ‫فإنه يصبح خاضعاً لرخصة ‪ FDL‬كما ل يمكنك الدعاء بأنك من قام بهذا العمل وعليك‬ ‫الشارة لمؤلفه الصلي يقدم هذا الكتاب كما هو من دون أي كفالة أو ضمان لمحتوياته لسنا‬ ‫مسؤولين عن أي أثر سلبي (ل بشكل مباشر ول ضمني) يقع عليك و على جهازك أو على‬ ‫قطتك‪.‬‬ ‫كتب هذا الكتاب على منصة أرابيان ‪ 0.6‬باستخدام برنامج ‪ OpenOffice.org 2.0‬لذا‬ ‫إذا حاولت فتحه على منصة الويندوز فلربما يذهب التنسيق‪ ،‬فحاول أن تعدل عليه في المنصة‬ ‫التي إنشأ فيها لتجنب إعادة الجهد من جديد‪.‬‬ ‫هذا الكتاب ناقص‪ ،‬ويسعد المؤلف أن يجد أناس عندهم الحماس لكماله‪ ،‬حتى يتم العمل‬ ‫بصورة جيدة‪،‬‬

‫معلومات عن الكتاب‬

‫‪:‬‬

‫تأليف‪ :‬فهد بن عامر السعيدي‬ ‫بريد الكتروني ‪[email protected]‬‬ ‫ص‪.‬ب ‪370‬‬ ‫الخابورة‪ -‬سلطنة عمان‬ ‫الرمز البريدي ‪326‬‬ ‫حقوق الطبع محفوظة وفق رخصة ‪FDL‬‬ ‫‪Copyright (c) 2005 under terms of FDL license‬‬ ‫‪2‬‬

‫الوحدة اﻷولى ‪ :‬أساسيات ‪Python‬‬ ‫الفصل اﻷول ‪ :‬البداية‬ ‫الفصل الثاني‪ :‬اﻷنواع و العمليات‬ ‫الفصل الثالث‪ :‬التعابير اﻷساسية‬ ‫الفصل الثالث‪ :‬الوظائف‬ ‫الفصل الرابع‪ :‬الوحدات‬ ‫الفصل الخامس‪ :‬الصفوف‬ ‫الفصل السادس‪:‬الستثناءات‬

‫‪3‬‬

‫الفصل اﻷول ‪ :‬البداية‬ ‫النقاط المهمة‪:‬‬ ‫لماذا لغة ‪ Python‬؟‬ ‫كيف تشغل برنامج مكتوب بلغة ‪Python‬؟‬ ‫معرفة بيئات التطوير الخاصة بـ ‪Python‬‬ ‫في هذا الفصل سنمضي سويا في رحاب لغة بايثون‪ ،‬لنعرف كيف نشأة لغة بايثون؟ و لماذا نتعلم‬ ‫لغة بايثون؟ و ما مجالت التي تصلح لها لغة بايثون؟ كل هذه اﻷسئلة ضرورية لمن يريد أن يبدأ في‬ ‫تعلم أي لغة ! ‪ ،‬فلننتقل سريعا ‪...‬‬

‫لماذا لغة ‪ Python‬؟‬ ‫في عام ‪١٩٩٠‬م قام ‪ Guido van Rossum‬باختراع لغة بايثون‪ ،‬وقد استقى هذه اللغة‬ ‫من عدة لغات سابقة من أمثال‪ C :‬و ‪ C++‬و ‪ Modula-3‬و ‪ ABC‬و ‪.Icon‬‬ ‫وتعتمبر بايثون ممن اللغات النصمية التمي ل تحتاج إلى بناء لتشغيمل البرناممج المكتوب بهما‪ ،‬وهمي ممن‬ ‫اللغات السممهلة و المنظمممة بشكممل صممارم مممما أهلهمما أن تكون الخيار اﻷول فممي صممنف اللغات‬ ‫اﻷكاديميمة التمي تعتممد فمي الجامعات‪ ،‬وسمنلخص مميزات لغمة بايثون فمي جدول و نمبين فائدة كمل‬ ‫مميزة ‪..‬‬

‫المميزات‬ ‫ل تحتاج إلى بناء أو ربط مثل لغة السي‬ ‫ل تحتوي على أنواع المتغيرات‬ ‫إدارة آلية للذاكرة‬ ‫برمجة غرضية التوجه‬ ‫إمكانية التضمين و التمدد مع لغة السي‬ ‫البساطة و الوضوح في قواعد الكتابة و التصميم‬ ‫محمولية عالية‬ ‫مفتوحة المصدر‬

‫الفوائد‬ ‫تسريع دورة التطوير فيها بشكل ملحوظ‬ ‫البرامج تصبح أسهل و أبسط و أكثر مرونة‬ ‫مجمع النفايات يجنبك الجهد في تنقيح الكود‬ ‫يمنحك التكامل مع ‪ C++‬و ‪ Java‬و ‪COM‬‬ ‫تحسين اﻷداء و إمكانية التحاور مع النظام‬ ‫درجة عالية من المقروئية و إمكانية الصيانة و‬ ‫سهولة التعليم‬ ‫تعمل على عدة منصات‪ :‬الويندوز و اللينكس و‬ ‫الماكنتوش و اليونكس بدون تغيير الكود‬ ‫تعطيك الحرية في توزيعها و التعديل فيها و ضامن‬ ‫لبقائها‬ ‫‪4‬‬

‫المميزات‬ ‫دعم أنواع البيانات و العمليات عالية المستوى‬ ‫تحميل ألي لوحدات السي‬ ‫دعم بروتوكولت اﻹنترنت القياسية‬ ‫كثرة المكتبات المضمنة و من أطراف ثالثة‬

‫الفوائد‬ ‫تطوير سريع باستخدام أنواع الكائنات المدمجة‬ ‫امتدادات مبسطة و تصغير الملفات التنفيذية‬ ‫تسهيل الوصول إلى البريد اللكتروني و ‪.. HTTP‬‬ ‫تسريع و تسهيل تطوير البرامج‬

‫و أهم مميزاتها أنها سهلة التعلم ‪ ،‬وهذا ما ستلحظه أثناء تعلمك لها مع قوتها في آن واحد مما‬ ‫جعلها الخيار اﻷمثل لكثير من الشركات‪ ،‬وسنذكر مجموعة منها‪:‬‬

‫–‪ Yahoo Maps ‬‬ ‫‪ ‬‬ ‫‪Yahoo Groups‬‬ ‫–‪ ‬‬ ‫‪ ‬‬ ‫‪Google‬‬ ‫–‪ ‬‬ ‫‪ ‬‬ ‫‪Ultraseek‬‬ ‫–‪ ‬‬ ‫‪ ‬‬ ‫‪Jasc Software, Paint Shop Pro‬‬ ‫–‪ ‬‬ ‫‪ ‬‬ ‫‪National Weather Service‬‬ ‫–‪ ‬‬ ‫‪ ‬‬ ‫‪NASA‬‬ ‫–‪ ‬‬ ‫‪ Red Hat‬‬ ‫‪ ‬‬ ‫–‪ ‬‬ ‫‪ ‬‬ ‫‪SGI, Inc‬‬ ‫–‪ ‬‬ ‫–‪   ‬‬ ‫‪IBM‬‬ ‫‪ ‬‬ ‫‪Real Networks‬‬ ‫–‪ ‬‬

‫ما مجالت لغة بايثون ؟‬ ‫باختصار شديد‪ ،‬بايثون خاضت جميع المجالت التي تتطلب سرعة التطوير و السهولة في‬ ‫المجال اﻷول‪ ،‬و تأخرت قليل في المجالت التي تحتاج إلى سرعة التطبيق‪ ،‬فمن المجالت‬ ‫التي تتميز فيها لغة بايثون‪:‬‬ ‫– مجال اﻷدوات التي تتعامل مع النظام مباشرة‬ ‫– مجال برمجة اﻹنترنت‬ ‫– مجال برمجة واجهات المستخدم الرسومية‬ ‫– مجال برمجة قواعد البيانات‬ ‫– مجال البرمجة الموزعة‬ ‫‪5‬‬

‫وغيرها الكثير من المجالت‪ ،‬مما سهّل لها وجود أدوات كثيرة تسهل عمل المبرمج بشكل‬ ‫ملحظ‪ ،‬فمن أشهر هذه اﻷدوات‪:‬‬ ‫اﻷدوات‬

‫المجال‬ ‫برمجة النظام‬

‫‪ Sockets‬و ‪threads‬و ‪ signals‬و ‪ pipes‬و ‪RPC‬‬

‫واجهات المستخدم الرسومية‬

‫‪ Tk‬و ‪ PMW‬و ‪ MFC‬و ‪ X11‬و ‪ wxPython‬و ‪ KDE‬و‬

‫واجهات قواعد البيانات‬

‫‪ Oracle‬و ‪ sybase‬و ‪PostGres‬و ‪ mSQL‬و‬

‫أدوات ‪Microsoft Windows‬‬

‫‪ MFC‬و ‪ COM‬و ‪ ActiveX‬و ‪ ASP‬و ‪ ODBC‬و ‪NET.‬‬

‫أدوات النترنت‬

‫‪ Jpython‬و ‪ CGI tools‬و ‪ HTML/XML parsers‬و‬

‫الكائنات الموزعة‬

‫‪ DCOM‬و ‪ CORBA‬و ‪ ILU‬و ‪Fnorb‬‬

‫أدوات أخرى مشهورة‬

‫‪ SWIG‬و ‪ PIL‬و ‪ regular expressions‬و ‪ numPy‬و‬

‫‪ calls‬و ‪POSIX bindings‬‬

‫‪Gnome‬‬

‫‪ persistence‬و ‪dbm‬‬

‫‪ email tools‬و ‪Zope‬‬

‫‪cryptography‬‬

‫كيف تشغل برنامج مكتوب بلغة ‪Python‬؟‬ ‫بما أن لغة بايثون نصية ‪ ،‬فإنه يتوجب عليك أن يكون لديك مفسر اللغة فقط لتشغيل البرنامج‪ ،‬و‬ ‫للحصول على المفسر اذهب إلى موقع لغة بايثون ‪ ،‬و نزل المفسر حسب النظام الذي تعمل‬ ‫عليه ‪:‬‬ ‫‪http://www.python.org‬‬

‫لغة بايثون في نظام اللينكس من للغات اﻷساسية‪ ،‬فهي افتراضيا مثبة على النظام‬ ‫لذلك يفضل استخدام هذا النظام ‪ ،‬وخاصة أن هذه الدروس ستكون مبنية على توزيعة أرابيان‬ ‫و لكن ل يمنع هذا من العمل على منصة الويندوز‬

‫بطبيعة الحال لكتابة برنامج بايثون ستحتاج إلى محرر نصوص ثم حفظ الملف بلحقة ‪.py‬‬ ‫بعد ذلك ادخل على سطر اﻷوامر و اكتب‪:‬‬ ‫‪6‬‬

‫‪> > python progra m.py‬‬

‫بحيث ‪ program‬اسم الملف‪ ،‬و للتعامل مباشرة مع محث لغة بايثون ‪ ،‬اكتب في سطر‬ ‫اﻷوامر ‪:‬‬ ‫‪> > python‬‬

‫و لكتابة أول برنامج لك ‪ ،‬اكتب ‪:‬‬ ‫'‪> > > print ' My name is Fahad Al- Saidi‬‬

‫بعد كتابتك ﻷول برنامج لك بواسطة بايثون‪ ،‬ستعرف بنفسك مدى سهولة بايثون و قوتها‪.‬‬

‫بيئات التطوير الخاصة بـ ‪Python‬‬ ‫سترغب مع الوقت في امتلك بيئة تطوير تسهل عليك أداء الكثير من العمليات الروتنية‪ ،‬وهناك‬ ‫الكثير من بيئات التطوير الخاصة بلغة بايثون ‪ ،‬ما عليك إل أن تختار حسب رغباتك ‪ ،‬فقط تابع‬ ‫هذين الرابطين ‪:‬‬ ‫‪http://wiki.python.org/moin/PythonEditors‬‬ ‫‪http://wiki.python.org/moin/IntegratedDevelopmentEnvironments‬‬

‫و لكن يكفيك أن تملك مفسر لغة بايثون مع محرر نصوص عادي لتكمل مشوارك معنا في تعلم‬ ‫لغة بايثون‬

‫‪7‬‬

‫الفصل الثاني‪ :‬اﻷنواع و العمليات‬ ‫النقاط المهمة‪:‬‬ ‫بنية برنامج بايثون‬ ‫لماذا نستخدم النواع المدمجة؟‬ ‫العداد‬ ‫السلسل النصية‬ ‫القوائم‬ ‫القواميس‬ ‫المجموعات‬ ‫الملفات‬ ‫الخصائص العامة للكائنات‬ ‫تلميحات مهمة‬ ‫الملخص‬

‫بنية برنامج بايثون‬ ‫قبل البدء في خوض غمار تفاصيل لغة بايثون‪ ،‬من المهم أن نعرج على بنية البرنامج المكتوب‬ ‫بلغة بايثون‪ ،‬ليتكون لديك تصور واضح بشكل عام حول البرمجة بلغة بايثون‪ ،‬وباختصار نقول‪:‬‬ ‫برنامج بايثون يمكن أن يحلل إلى ثلثة أجزاء‪ :‬وحدات‪ ،‬و عبارات‪ ،‬وكائنات‪ ،‬على نحو التالي‪:‬‬ ‫‪ -١‬البرنامج يتكون من وحدات‬ ‫‪ -٢‬و الوحدات تحتوي على عبارات‬ ‫‪ -٣‬و العبارات تنشأ الكائنات و تعالجها‪.‬‬

‫لماذا نستخدم النواع المدمجة؟‬ ‫إذا كنت قد برمجت سابقا باستخدام السي أو السي بلس بلس أو الجافا ستدرك كم من الوقت‬ ‫‪8‬‬

‫يستغرق ترتيب الكائنات و تنسيقها في الذاكرة بما يسمى بنى المعطيات‪،‬وكم هو مرهق للعصاب‬ ‫ترتيب تلك الكائنات في الذاكرة و التعامل مع الذاكرة و كيفية الوصول إليها و ترتيبها و البحث‬ ‫من خللها‪..‬‬ ‫فمي براممج بايثون المثاليمة ‪،‬معظمم ذلك الجهمد يذهمب عنمك بعيدا ‪ ،‬ﻷن بايثون تزودك بكائنات ممن‬ ‫صملب اللغمة تجعمل برمجمة تلك اﻷشياء بمنتهمى السمهولة‪ ،‬فقمط فكمر فمي حمل المشكلة ثمم اكتمب‬ ‫الحل‪ ،‬ل داعي من اﻵن فصاعدا أن ترهق نفسك في ترتيب الكائنات‪ .‬في الحقيقة‪ ،‬كل ما تريده‬ ‫ستجد تلك اﻷنواع تزودك به ما لم تكن بحاجة إلى أنواع خاصة‪.‬‬ ‫ستجد في غالب اﻷحيان أنك تفضل تلك الكائنات ‪،‬لعدة أسباب منها‪:‬‬ ‫كائنات المدمجة تجعل البرامج البسيطة سهلة الكتابة‬ ‫للمهمات البسميطة سمتجد أن أنواع الكائنات المضمنمة تلبمي جميمع احتياجاتمك بعيدا عمن مشاكمل‬ ‫بنمممى المعطيات‪.‬ﻷن سمممتجد اﻷشياء مثمممل المجموعات ( القوائم) و الجداول (القواميمممس) فمممي‬ ‫متناول يدك‪ ،‬وستجد أن كثيرا من العمل أنجز فقط باستخدام كائنات بايثون المدمجة‪.‬‬ ‫بايثون تزودك بالكائنات و تدعم التوسعات‬ ‫بايثون تسمتعير فمي بعمض الطرق ممن اللغات التمي تدعمم اﻷدوات المضمنمة مثمل ‪ Lisp‬و اللغات‬ ‫التي تعتمد على المبرمج في تزويدها باﻷدوات المطلوبة أو إطار العمل الذي يحتاجه مثل ‪C++‬‬ ‫و بالرغمم ممن أنمك سمتطيع أن تنشيمء أنواع كائنات فريدة فمي بايثون إل أنمك فمي الغالب ل تحتاج‬ ‫إلى ذلك‪.‬‬ ‫الكائنات المدمجة أكثر كفاءة من بنى المعطيات المخصصة‬ ‫اﻷنواع المدمجممة فممي بايثون تسممتخدم خوارزميات بنممى معطيات محسممنة و معمولة بالسممي لزيادة‬ ‫السممرعة‪ ،‬وبالرغممم أنممك تسممتطيع أن تكتممب أنواع كائنات مشابهممة إل أنممك سممتبذل جهدا مضاعفمما‬ ‫للحصول على أداء أنواع الكائنات في بايثون‪.‬‬ ‫الجدول التالي يممبين أنواع الكائنات المدمجممة التممي سممنأخذها فممي هذا الفصممل‪ ،‬إذا كنممت قممد‬ ‫اسممتعملت لغممة قبممل ذلك سممتجد أن بعممض هذه الكائنات متشابهممة مثممل ( اﻷعداد و السمملسل‬ ‫‪9‬‬

‫النصمية و الملفات) وسمتجد أيضما أنواع قويمة وعاممة مثمل (القوائم و القواميمس) تزودك بهما بايثون‬ ‫بدون تعب خلفا لكثير من اللغات مثل ‪ C‬و ‪ C++‬و ‪.Java‬وسنقوم بشرحها واحدا واحدا‬ ‫نوع الكائن‬ ‫اﻷعداد ‪Number s‬‬

‫مثال عليه‬ ‫‪999L, 3+4j ,1234 ,3.1415‬‬

‫سلسل نصية ‪Strings‬‬

‫' ‪"spam', "guido's‬‬

‫قوائم ‪Lists‬‬

‫[ ‪]three'], 4 ' ,2 [ ,1‬‬

‫قواميس ‪Dictionaries‬‬ ‫المجموعات ‪Tuples‬‬

‫{' ‪}'food':'spa m', 'taste':'yum‬‬ ‫( ‪)'spam', 4, 'U ',1‬‬

‫الملفات ‪Files‬‬

‫)(‪text = open('eggs', 'r').read‬‬

‫العداد‬ ‫تدعم لغة بايثون تشكيلة واسعة من أنواع اﻷعداد ‪ :‬اﻷعداد الصحيحة و اﻷعداد ذات النقطة‬ ‫العائمة‪ ،‬و هذا مألوف لمن تعامل مع لغات سابقة‪ ،‬و أيضا تدعم أنواع مركبة من اﻷعداد مثل‬ ‫اﻷعداد المركبة و اﻷعداد ذات دقة الفاصلة العائمة غير محدود و تشكلية واسعة من اﻷدوات‬ ‫و فيما يلي سنشرح النوعين‪:‬‬ ‫أنواع العداد القياسية‪:‬‬ ‫بايثون تدعم اﻷنواع القياسية في بقية اللغات و أتت بأنواع جديدة و في ما يلي جدول يبين تلك‬ ‫اﻷنواع مع أمثلة لكل نوع‪:‬‬ ‫النوع‬

‫تفسيره‬

‫‪1234, - 24, 0‬‬

‫)‪Normal integers (C longs‬‬

‫‪9999999999 99L‬‬

‫)‪Long integers (unlimited size‬‬

‫‪1.23, 3.14e - 10, 4E210, 4.0e+ 21 0‬‬

‫)‪Floating - point (C doubles‬‬

‫‪0177, 0x9ff‬‬

‫‪Octal and hex consta nt s‬‬

‫‪3+4j, 3.0+4.0j, 3J‬‬

‫‪Complex number constan t s‬‬

‫–اﻷعداد الصحيحة و اﻷعداد ذات الفاصلة العائمة‬ ‫‪10‬‬

‫اﻷعداد الصمحيحة همي مجموعمة ممن اﻷعداد العشريمة مثمل ( ‪ ، )10‬و اﻷعداد ذات الفاصملة‬ ‫العائمة هي التي تحتوي على فاصلة مثل ( ‪.)10 ٫10‬‬ ‫–الدقة الرقمية‬ ‫اﻷعداد الصحيحة تعامل معاملة ‪ longs‬في لغة السي مما يعني أنها غير محدود بدقة رقمية‪،‬‬ ‫و اﻷعداد ذات الفاصلة العائمة تعامل معاملة ‪ doubles‬في لغة السي مما يعني أنك يمكنك‬ ‫أن تكتب أي رقم يخطر على بالك‪ ،‬مع ملحظة أنك إذا ألحقت حرف ‪ L‬أو ‪ l‬فإنك تخبر مفسر‬ ‫لغة بايثون أن هذا العدد عدد صحيح طويل على مقايس لغة باثيون‪.‬‬ ‫–اﻷعداد الثمانية و الستعشرية‬ ‫اﻷعداد الثمانية هي التي تبدأ بالصفر ‪ 0‬و اﻷعداد الستعشرية هي التي تبدأ بم ‪ 0x‬أو ‪.0X‬‬ ‫اﻷعداد المركبة‬‫لغة بايثون تزودك بهذا النوع و هو يكتب كالتالي (الجزء الحقيقي ‪ +‬الجزء التخيلي) ( ‪real-‬‬ ‫‪ )part + imaginary - part‬و ينتهي باللحقة ‪ j‬أو ‪. J‬‬ ‫تعابير المعاملت في بايثون‪:‬‬ ‫ربما اﻷداءة اﻷساسية في معالجة اﻷعداد هي التعابير وهي عبارة عن مجموعة من اﻷعداد ( أو‬ ‫كائنات أخرى) و معاملت تنتنمج قيممة عنمد تنفيذهما فمي بايثون‪ ،‬و المثال على ذلك عندمما تريمد أن‬ ‫تجمع عددين مثل ‪ x‬و ‪ y‬فإنك تقول ‪ x + y‬فالمعامل هنا ‪. +‬‬ ‫تزودنما بايثون بقائممة طويلة ممن هذه المعاملت و الجدول التالي يبينهما و يشرحهما و يمبين أسمبقيتها‬ ‫عند التنفيذ تنازليا‪:‬‬

‫الوصف‬

‫المعامل‬ ‫‪x or y‬‬

‫معامل المنطقي "أو"‬

‫‪x and y‬‬

‫معامل المنطقي "و"‬

‫‪11‬‬

‫المعامل‬ ‫‪not x‬‬

‫الوصف‬ ‫معامل المنطقي "عكس"‬

‫‪in, not in‬‬

‫اختبار العضوية الكائن‬

‫‪is, is not‬‬

‫اختبار هوية الكائن‬

‫‪x| y‬‬

‫معامل "أو" على مستوى البت‬

‫‪x^ y‬‬

‫معامل "عكس" على مستوى البت‬

‫‪x &y‬‬

‫معامل "و" على مستوى البت‬

‫‪x < < y, x > > y‬‬ ‫‪x + y, x – y‬‬ ‫‪x * y, x / y, x % y‬‬

‫إزاحة ‪ x‬يمينا أو شمال بمقدار ‪ y‬من البتات‬ ‫معامل الطرح و الجمع‬ ‫معامل الضرب و القسمة و باقي القسمة‬

‫العمل على العداد‬ ‫أحسن طريقة لفهم اﻷشياء النظرية هي تجربتها عمليا و واقعيا‪ ،‬فدعنا نشغل سطر اﻷوامر لنطبع‬ ‫عليه بعض اﻷسطر التي ستشرح ما قلناه سابقا عمليا‪.‬‬

‫العمليات اﻷسياسية‪:‬‬ ‫قبمل كمل شيمء نحتاج إلى إنشاء كائن ممن فئة اﻷعداد مثمل ‪ x‬و ‪ ، b‬لكمي نطبق عليمه معاملت ‪،‬‬ ‫في اللغات اﻷخرى ستحتاج إلى ذكر نوع الكائن ثم تسميته ثم إسناد قيمة إليه لكي نتعامل معه‪،‬‬ ‫ولكمن فمي بايثون فقمط سمم الكائن ثمم أسمند إليمه قيممه و تتولى الباقمي بايثون للتعرف على نوعمه ‪،‬‬ ‫وهذا بشكل عام في كائنات بايثون يكفي فقط اسناد القيمة إلى الكائن لتعريف بنوعه‪.‬‬ ‫لتطبيق ذلك عمليا ‪،‬اكتب التالي في سطر اﻷوامر ‪:‬‬ ‫‪# name created‬‬

‫‪% python‬‬ ‫‪>>> a = 3‬‬ ‫‪>>> b = 4‬‬

‫وبهذا نكون قد أنشأنا كائنين من فئة اﻷعداد وأسندنا إليهما قيمتين ‪ ،‬ولعلك لحظت كيفية إضافة‬ ‫التعليقات في بايثون فكل ما بعد ‪ #‬فهو تعليق ‪ ،‬وللتعليق أهمية كبرى في توضيح الكود وسهولة‬ ‫قراءته وسهولة تطويره من قبل مطورين آخرين‪.‬‬ ‫‪12‬‬

‫بعد إنشاء الكائنات ستحتاج إلى تطبيق بعض المعاملت ‪ ،‬وكلما كانت المعاملت بين اﻷقواس‬ ‫كلما كانت اﻷمور أوضح ‪ ،‬ولكن هذا ل يعني أن المعاملت ل تعمل بدون اﻷقواس‪ ،‬ولكن انتبه‬ ‫إلى أسبقية المعاملت على حسب ما ذكر سابقا ‪ ،‬و إليك بعض اﻷمثلة ‪:‬‬ ‫‪>>> b / 2 + a‬‬ ‫)‪# same as ((4 / 2) + 3‬‬ ‫‪5‬‬ ‫))‪> > > b / (2.0 + a) # same as (4 / (2.0 + 3‬‬ ‫‪0.8‬‬

‫فكما هو واضح في المثال اﻷول أن بايثون تولت ترتيب المعاملت في اﻷقواس‪ ،‬وبما أن المعامل‬ ‫القسممة أسمفل ممن معاممل الجممع فهمو مقدم ‪ ،‬ولكمن فمي المثال أضفنما إلى التعمبير قوسمين فأجبرنما‬ ‫بايثون على تنفيذ المعاملت التي نريد تقديمها أول ‪ ،‬وفي النهاية يجب مراعاة مثل هذه اﻷمور عند‬ ‫كتابة برامجك في لغة بايثون‪.‬‬ ‫ولعلك تسمأل مما فائدة إضافمة النقطمة العائممة فمي المثال الثانمي ‪ ،‬سمأقول لك جرب تنفيمذ المثال‬ ‫بدون إضافة النقطة العائمة وستجد أن النتيجة هي ‪ ، 0‬ماذا حصل؟ لقد تعاملت بايثون على أنه‬ ‫عدد صحيح‪ ،‬ولكن عندما تكتب النقطة العائمة فإنك تخبر بايثون أني أريد النتيجة كما هي بدون‬ ‫تقريب وكذلك إذا أضفت صفرين ستلحظ النتيجة بنفسك‪.‬‬

‫معاملت على مستوى البت‪:‬‬ ‫سمتحتاج إلى التعاممل على المسمتوى البمت فمي بعمض اﻷحيان فيجمب عليمك أن تعرف العمد الثنائي‬ ‫أول وستتضح لك اﻷمثلة التالية ‪:‬‬ ‫‪# 0001‬‬ ‫‪# shift left 2 bits: 0100‬‬ ‫‪# bitwise OR: 0011‬‬ ‫‪# bitwise AND: 0001‬‬

‫‪x= 1‬‬ ‫‪x >>‬ ‫>>>‬ ‫‪4‬‬ ‫>>>‬ ‫‪3‬‬ ‫>>>‬ ‫‪1‬‬

‫إذا لم تفهم ولم تدرس اﻷعداد الثنائية ‪ ،‬فل عليك ‪ ،‬استمر ‪ ،‬وستجد أنه هذه الجزئية ل‬ ‫‪13‬‬

‫يحتاجها إل من يطلبها !!‬

‫اﻷعداد المركبة ‪:‬‬ ‫اﻷعداد المركبمة ممن تخصمصات الهندسمة و الكهرباء ‪ ،‬كشخمص ل تخصمص عندك فمي مثمل هذه‬ ‫اﻷمور ‪،‬مممر على هذه الجزئيممة مرور الكرام ‪ ،‬ﻷنممك لكممي تفهمهمما سممتحتاج إلى أكثممر مممن فصممل‬ ‫دراسي ‪ ،‬ونحن نريد أن نوصلك إلى فهم البرمجة باستخدام الباثون في وقت قياسي ‪ ،‬أما إذا‬ ‫كان هذه اﻷعداد من لب تخصصه فإنك ستجد بايثون توفر لك الكثير ‪ ،‬فانظر إلى هذه اﻷمثلة‪:‬‬ ‫‪> > > 1j * 1J‬‬ ‫)‪(- 1+0j‬‬ ‫‪> > > 2 + 1j * 3‬‬ ‫)‪(2+3j‬‬ ‫‪> > > (2+1j)*3‬‬ ‫)‪(6+3j‬‬

‫للستزاده في هذا المجال راجع وثائق بايثون للمزيد من التفصيل‪.‬‬

‫المزيد من اﻷدوات ‪:‬‬ ‫توفر لك بايثون عدة أدوات تتعامل مع الرياضيات ‪ ،‬وتقدم وحدة ‪ math‬التي تتعامل مع جميع‬ ‫قوانين الرياضيات ‪ ،‬ولكن يجب عليك أن تستورد هذه الوحدة ‪ ،‬و إليك المثال‪:‬‬ ‫‪> > > import math‬‬ ‫‪> > > math.pi‬‬ ‫‪3.14159 26 5 3 5 9‬‬ ‫>>>‬ ‫)‪> > > abs(- 42), 2**4, pow(2, 4‬‬ ‫)‪(42, 16, 16‬‬

‫و سنتكلم عن وحدات بشيء من التفصيل في الفصول القادمة بإذن ال تعالى ‪.‬‬

‫‪14‬‬

‫السلسل النصية‬ ‫النوع الثانمي ممن الكائنات المدمجمة الرئيسمية فمي بايثون همو السملسل النصمية‪،‬والسملسل النصمية‬ ‫عبارة عن تجمع حروف لتخزين اسم أو بيانات في وحدة واحدة ‪،‬وبمعنى آخر يمكنك استخدام‬ ‫السملسل النصمية فمي كمل شيمء يقبمل تمثيله كنمص مثمل الروابمط و اﻷسمماء و الكلمات ومما شابمه‬ ‫ذلك‪.‬‬ ‫إذا كنمت اسمتخدمت لغات أخرى قبمل بايثون سمتجد أنهما تحتوي على الكائن سملسل النصمية و‬ ‫أيضا كائن حرف ‪ char‬في بايثون الحروف تعامل كسلسل نصية وذلك تسهيل للتعلم وتسريعا‬ ‫للبرمجة‪.‬‬ ‫بايثون تزودنا بالكثير من الدوال التي تتعامل مع السلسل النصية مثل الفهرسة و التقطيع و معرفة‬ ‫طول السلسلة و تجميع السلسل ‪،‬وهناك وحدات مستقلة لمعالجة السلسل النصية في بايثون‬ ‫مثل ‪ string‬و ‪ regex‬و ‪.re‬‬ ‫و الجدول التالي يعرض بشكل سريع كيفية إنشاء السلسل النصية وبعض دوالها ‪:‬‬ ‫شرحها‬

‫العملية‬

‫' ' = ‪S1‬‬ ‫"‪s2 = "spam's‬‬ ‫"""‪block = """...‬‬ ‫‪s1 + s2,‬‬ ‫‪s2 * 3‬‬ ‫‪s2[i],‬‬ ‫‪s2[i:j],‬‬ ‫)‪len(s2‬‬ ‫'‪"a %s parrot" % 'dead‬‬ ‫‪for x in s2,‬‬ ‫‪'m' in s2‬‬

‫سلسلة فارغة‬ ‫علمات اقتباس مزدوجة‬ ‫ثلث علمات تنصيص‬ ‫الجمع‬ ‫التكرار‬ ‫الفهرسة‬ ‫التقطيع‬ ‫معرفة الطول‬ ‫تهيئة السلسل النصية‬ ‫الحلقة تكرارية‬ ‫العضوية‬

‫لحظ أنه ل فرق بين علمة القتباس المفردة و المزدوجة ‪ ،‬فكلهن يؤدين العمل نفسه‪ ،‬ولك‬ ‫حرية اﻷختيار‪.‬‬ ‫‪15‬‬

‫العمل على السلسل النصية‬ ‫كما مر عليك أن إنشاء كائن من السلسل النصية يكفي له أن تذكر اسمه وتسند له قيمة من نوع‬ ‫السملسل النصمية ‪ ،‬وقمد ممر عليمك ثلثمة أمثلة فمي الجدول السمابق‪ ،‬فدعنما نسمتكشف الجوانمب‬ ‫اﻷخرى‪..‬‬

‫العمليات الساسية‬ ‫لقممد مممر عليممك المعامممل الجمممع ‪ +‬و معامممل الضرب * وعرفممت كيممف التعامممل معهمما فممي كائنات‬ ‫اﻷعداد ‪ ،‬أمما كائنات السملسل النصمية فهمي تعاممل الجممع كإضافمة و الضرب كتكرار للنمص ‪،‬‬ ‫ولكن يشترط في معامل الجمع‪ ،‬أن يكون كل الطرفين سلسل نصية‪.‬‬ ‫وتزودنا بايثون بدالة تحسب لنا طول السلسلة النصية وهي الدالة ‪ len‬و هي مدمجة مع اللغة ل‬ ‫تحتاج إلى استيراد ‪ ،‬وهذه بعض اﻷمثلة‪:‬‬ ‫‪# length: number items‬‬ ‫‪# concatenation: a new string‬‬ ‫‪# like "Ni!" + "Ni!" + ...‬‬

‫‪% python‬‬ ‫)'‪> > > len('abc‬‬ ‫‪3‬‬ ‫'‪> > > 'abc' + 'def‬‬ ‫'‪'abcdef‬‬ ‫‪> > > 'Ni!' * 4‬‬ ‫'!‪'Ni!Ni!Ni!Ni‬‬

‫سنأتي اﻵن إلى عمل حلقة تكرارية في السلسلة النصية وذلك باستخدام ‪ for‬و اختبار العضوية‬ ‫باستخدام ‪: in‬‬ ‫‪# step though items‬‬

‫‪# 1 means true‬‬

‫‪16‬‬

‫"‪myjob = "hacker‬‬ ‫‪for c in myjob: print c,‬‬ ‫‪k er‬‬ ‫‪"k" in myjob‬‬

‫>>>‬ ‫>>>‬ ‫‪...‬‬ ‫‪h ac‬‬ ‫>>>‬ ‫‪1‬‬

‫الفهرسة و التقطيع السلسلة النصية‬ ‫بما أن السلسل النصية تعرف في بايثون كأنها مجموعة من الحروف ‪ ،‬فإن هذا التركيب يعطينا‬ ‫مميزات المجموعة من إمكانية الوصول إلى أي من أعضاءه بما يسمى المفهرس ‪ ،‬وكذلك توفر‬ ‫لنا بايثون إمكانية تقطيع تلك السلسلة باستخدام المفهرس‪ ،‬ولكن لحظ أن بايثون تبدأ العد من‬ ‫الصفر في المفهرس وليس الواحد مثل كل لغة مشتقة من السي‪ ،‬واﻵن إليك هذه اﻷمثلة ‪:‬‬ ‫'‪> > > S = 'spam‬‬ ‫]‪> > > S[0], S[- 2‬‬ ‫‪# indexing from front or end‬‬ ‫)'‪('s', 'a‬‬ ‫]‪> > > S[1:3], S[1:], S[:- 1‬‬ ‫‪# slicing: extract section‬‬ ‫)'‪('pa', 'pam', 'spa‬‬

‫قمنا أول بتعريف متغير ‪ s‬بأنه سلسلة نصية وأسندنا إليه قيمة معينة ‪ ،‬ثم قمنا بعملية الفهرسة من‬ ‫البدايمة وممن النهايمة ‪ ،‬فمم[ ‪ S]0‬تعنمي أظهمر الحرف الذي فهرسمته ‪ 0‬و الناتمج كان ‪ ، s‬و[ ‪S]-2‬‬ ‫تعني أظهر الحرف الذي فهرسته ‪ 2‬من اﻷخير‪.‬‬ ‫بعد ذلك قمنتا بعملية التقطيع باستخدام المفهرس فم[ ‪ S]1:3‬تعني اجلب من الحرف اﻷول فما‬ ‫أعلى ولكمن ل تجلب الحرف الثالث ومما فوقمه ‪ ،‬أمما[‪ S ] 1 :‬فتعنمي اجلب ممن الحرف اﻷول فمما‬ ‫فوقه إلى النهاية ‪ ،‬أما [ ‪ S]:-1‬فتعني اجلب كل السلسلة ماعدا الحرف اﻷخير‬

‫تهيئة السلسل النصية‬ ‫إذا كان عندك سممملسلة طويلة وأردت أن تضيمممف إليهممما كائنات متغيرة فهناك عدة طرق‪ ،‬ولكمممن‬ ‫بايثون توفر لك طريقة تستعملها لغة السي بشكل كبير ‪،‬ولغة ‪ C#‬حديثا ‪ ،‬انظر المثال التالي‪:‬‬

‫‪17‬‬

‫'‪> > > S = 'spam‬‬ ‫"‪> > > S[0] = "x‬‬ ‫!‪Raises an error‬‬ ‫'!‪> > > S = S + 'Spam‬‬ ‫‪# to change a string, make a new one‬‬ ‫‪>>> S‬‬ ‫'!‪'spamSpa m‬‬ ‫]‪> > > S = S[:4] + 'Burger' + S[- 1‬‬ ‫‪>>> S‬‬ ‫'!‪'spamBurger‬‬ ‫‪> > > 'That is %d %s bird!' % (1, 'dead') # like C sprintf‬‬ ‫!‪That is 1 dead bird‬‬

‫لحظ أن بايثون أعادة تعريف المعامل ‪ %‬ليعمل مع السلسل النصية ‪ ،‬وعند اﻷعداد كباقي‬ ‫القسمة‪ ،‬كما قلنا سابقا أن السطر اﻷخير استخدم هيئة السي في ترتيب النص وخاصة الدالة‬ ‫‪ sprintf‬و أخذ كل قواعدها‪ ،‬وهي بسيطة تعني ما كل على اليسار يساوي ما على اليمين على‬ ‫الترتيب ‪ ،‬وإليك أمثلة أكثر على هذه التهيئة‪:‬‬ ‫"‪> > > exclamatio n = "Ni‬‬ ‫‪> > > "The knights who say %s!" % exclamation‬‬ ‫'!‪'The knights who say Ni‬‬ ‫)‪> > > "%d %s %d you" % (1, 'spam', 4‬‬ ‫'‪'1 spam 4 you‬‬ ‫)]‪> > > "%s - - %s - - %s" % (42, 3.14159, [1, 2, 3‬‬ ‫']‪'42 - - 3.14159 - - [1, 2, 3‬‬

‫ولكن هل الحروف بعد ‪ %‬اعتباطية ؟ نقول ل ولكنها كل واحدة تدل على شيء ‪ ،‬أما ‪ %s‬فهي‬ ‫عامة لكل كائن سواء أكان عددا أو سلسلة نصية أو غيره ‪ ،‬أما البقية فالجدول التالي يشرحها‪:‬‬ ‫عدد ستعشري ‪Hex integer‬‬

‫‪ %X‬سلسلة نصية ‪String‬‬

‫الفاصلة العائمة الهيئة ‪Floating - 1‬‬ ‫‪point‬‬

‫‪ %e‬حروف ‪Character‬‬

‫‪%c‬‬

‫الفاصلة العائمة الهيئة ‪Floating - 2‬‬ ‫‪point‬‬

‫‪ %E‬عدد عشري ‪Decimal‬‬

‫‪%d‬‬

‫الفاصلة العائمة الهيئة ‪Floating - 3‬‬ ‫‪point‬‬

‫‪ %f‬عدد صحيح‬

‫‪Integer‬‬

‫‪%i‬‬

‫)‪Unsigned (int‬‬

‫‪%u‬‬

‫الفاصلة العائمة الهيئة ‪Floating - 4‬‬ ‫‪point‬‬

‫‪%g‬‬

‫الفاصلة العائمة الهيئة ‪Floating - 5‬‬ ‫‪point‬‬

‫‪ %G‬عدد ثماني ‪Octal integer‬‬

‫‪18‬‬

‫‪%‬‬

‫‪%o‬‬

‫‪ %%‬عدد ستعشري ‪Hex integer‬‬

‫حرف ‪%‬‬

‫‪%x‬‬

‫أدوات العامة لسلسل النصية‬ ‫كما قلنا سابقا بايثون تزودنا بوحدات خاصة للتعامل مع السلسل النصية‪ ،‬ولعل أشهر واحدة‬ ‫وأقواها هي ‪ . string‬فهي تزودنا بالعديد من الدوال فمنها القدرة على تحويل الحروف من‬ ‫الكبيرة إلى الصغيرة والعكس ‪،‬وكذلك البحث في السلسل المعرفة ‪ ،‬وكذلك تحويل السلسلة‬ ‫النصية إلى عدد ‪ ،‬وغيرها الكثير ‪ ،‬راجع وثائق بايثون للمعرفة جميع اﻷدوات‪ ،‬وهذا مثال على‬ ‫قدرة وحدة ‪:string‬‬ ‫‪> > > import string‬‬ ‫‪# standar d utilities module‬‬ ‫"‪> > > S = "spam mify‬‬ ‫)‪> > > string.up p er(S‬‬ ‫‪# convert to uppercase‬‬ ‫'‪'SPAMMIFY‬‬ ‫)"‪> > > string.find(S, "mm‬‬ ‫‪# retur n index of substring‬‬ ‫‪3‬‬ ‫‪> > > string.atoi("42") # convert from / t o string‬‬ ‫‪42‬‬ ‫)"‪> > > string.join(string.split(S, "mm"), "XX‬‬ ‫'‪'spaXXify‬‬

‫لعمل المثال اﻷخيمر وهمو اﻷكثمر تعقيدا‪،‬فهمو سمهل الفهمم فكمل مما فمي القضيمة أن الدالة ‪split‬‬ ‫قامت بتجزئة السلسلة إلى قسمين عند الحرف ‪ ، mm‬ثم قامت الدالة ‪ join‬بدمج ‪ XX‬بين‬ ‫القسمين السابقين ‪ ،‬يمكنك تجربة كل دالة واحدة ومعرفة كيفية عملها‪.‬‬ ‫لحمظ أن الدالة ‪ atoi‬تقوم بتحويمل السملسلة النصمية إلى عدد فقمط ‪ ،‬ولكمن توجمد دالة أخرى‬ ‫مدمجمة تسممى ‪ eval‬تقوم بتحويمل السملسلة النصمية إلى أي نوع ولكنهما أبطمأ بطبيعمة الحال ممن‬ ‫الدالة اﻷولى‪.‬‬

‫الختلفات في كتابة السلسلة النصية‬ ‫فمي نهايمة كلمنما عمن السملسل النصمية ‪ ،‬سمنتكلم عمن أحرف الهروب التمي بهما تسمتطيع أن تنسمق‬ ‫النمص بشكمل جيمد ‪ ،‬مثمل حرف بدايمة السمطر وغيرهما والجدول التالي يمبين لك هذه اﻷحرف فمي‬ ‫‪19‬‬

‫بايثون‪:‬‬ ‫‪\n‬‬

‫سطر جديد‬

‫‪ \newli‬الستمرار‬ ‫‪ne‬‬ ‫\\‬

‫إظهار \‬

‫‪\v‬‬

‫‪ Tab‬عمودية‬

‫'\‬

‫إظهار علمة اقتباس واحدة‬

‫‪\t‬‬

‫‪ Tab‬رأسية‬

‫"\‬

‫إظهار علمة اقتباس مزدوجة‬

‫‪\r‬‬

‫العودة إلى بداية السطر‬ ‫‪Carriage retur n‬‬

‫‪\a‬‬

‫جرس‬

‫‪\f‬‬

‫صفحة جديدة ‪Formfeed‬‬

‫‪\b‬‬

‫مفتاح الحذف الخلفي‬ ‫‪Backspace‬‬

‫‪\0XX‬‬

‫‪Octal value XX‬‬

‫‪\e‬‬

‫زر الهروب ‪Escape‬‬

‫‪\xXX‬‬

‫‪Hex value XX‬‬

‫‪ Null‬عدم إنهاء السلسلة‬

‫‪ \ot he r‬أي حرف آخر‬

‫‪\000‬‬

‫القوائم‬ ‫نكمل مشوارنا في غمار لغة بايثون ونصل إلى كائن يعتبر أكثر الكائنات المدمجة مرونة وترتيب أل‬ ‫وهمو القائممة ‪ ، list‬تمتاز القوائم عمن السملسل النصمية أنهما تسمتطيع أن تجممع فمي ضمنهما عدة‬ ‫كائنات وليسممت النصمموص فقممط ‪ ،‬فالقائمممة يمكممن أن تكون مممن سمملسلة نصممية و أعداد و كائنات‬ ‫أخرى حتمى قوائم أخرى‪ .‬وتقوم القائممة مقام بنمى المعطيات فمي اللغات اﻷخرى مثمل لغمة السمي و‬ ‫الجافا‪،‬وتتميز القوائم في بايثون بعدة مميزات منها‪:‬‬ ‫مجموعة مرتبة من كائنات غير متجانسة‬ ‫من الناحية الوظيفية‪ ،‬القائمة مكان للتجميع الكائنات لذا يمكنك أن تنظمهم كمجموعة و القائمة‬ ‫أيضا تقوم بترتيبهم من اليسار إلى اليمين ‪.‬‬ ‫الوصول باستخدام المفهرس‬ ‫مثل السلسل النصية تستطيع أن تصل إلى أعضاء القائمة باستخدام المفهرس‪ ،‬وإجراء عملية‬ ‫التقطيع والسلسلة‪.‬‬ ‫مرونة عالية‬ ‫تتمتع القوائم بمرونة عالية أكبر من مرونة السلسل النصية‪ ،‬بحيث يمكن أن تكبر وتصغر حسب‬ ‫متطلبات برنامجك‪ ،‬ويمكنك وضع قوائم في قوائم بحيث تصير متشابكة‪.‬‬ ‫‪20‬‬

‫مصفوفة من الكائنات المرجعية‬ ‫من الناحية التقنية تعتبر القوائم نوع خاص من المصفوفات في لغة السي‪،‬وهي من هذه الناحية‬ ‫عبارة عممن كائنات مرجعيممة‪ ،‬ونقصممد هنمما بقولنمما مرجعيممة ‪ ،‬أي عندممما نتعامممل معهمما ب ‪can't‬‬ ‫‪read superblock‬عد تعريفها فإننا نتعامل مع مؤشر يؤشر إلى الكائن وليس نسخة عنه‪،‬‬ ‫وهذا يعطينا سرعة أكبر و يسهل علينا البرمجة‪.‬‬ ‫الجدول التالي يوضح أهم عمليات القوائم‪:‬‬ ‫الوصف‬

‫العملية‬ ‫][ = ‪ L1‬قائمة فارغة‬

‫]‪ L2 = [0, 1, 2, 3‬أربعة عناصر و اﻷدلة من ‪ 0‬إلى ‪3‬‬ ‫]]'‪ L3 = ['abc', ['def', 'ghi‬قوائم متداخلة‬ ‫]‪ L2[i], L3[i][j‬الفهرسة‬ ‫‪ L2[i:j],‬التقطيع‬ ‫)‪ len(L2‬الطول‬ ‫‪ L1 + L2,‬سلسلة‬ ‫‪ L2 * 3‬إعادة‬ ‫‪ for x in L2,‬تكرار‬ ‫‪ 3 in L2‬العضوية‬ ‫‪L2.appen d(4),‬‬ ‫‪L2.sort(),‬‬ ‫‪L2.index(1),‬‬ ‫)(‪L2.reverse‬‬

‫الدوال‪:‬‬ ‫توسيع‬ ‫ترتيب‬ ‫البحث‬ ‫عكس‬

‫‪ del L2[k],‬النكماش‬ ‫][ = ]‪L2[i:j‬‬ ‫‪ L2[i] = 1,‬إسناد الفهرس‬ ‫]‪ L2[i:j] = [4,5,6‬اسناد المقطع‬ ‫)‪ range(4), xrange(0, 4‬إنشاء قوائم أو مجموعات من اﻷعداد‬

‫سممتلحظ أنممك قممد رأيممت معظممم العمليات التممي ذكرت فممي الجدول السممابق قممد مرت عليممك فممي‬ ‫السملسل النصمية ‪ ،‬إل بعمض العمليات التمي تدعمهما القوائم ول تدعمهما السملسل النصمية مثمل‬ ‫إسناد الفهرس و إسناد المقاطع و التوسع والنكماش‪.‬‬

‫‪21‬‬

‫العمل على القوائم‬ ‫أفضممل طريقممة لفهممم القوائم هممي العمممل عليهمما‪،‬ومرة أخرى سممنأخذ العمليات التممي ذكرت فممي‬ ‫الجدول السابق ونحاول أن نشرحها بشيء من اﻷمثلة العملية‪.‬‬

‫العمليات اﻷساسية‬ ‫القوائم تدعم معظم العمليات التي تدعمها السلسل النصية و إليك المثال التالي ‪:‬‬ ‫‪% python‬‬ ‫)]‪> > > len([1, 2, 3‬‬ ‫‪# length‬‬ ‫‪3‬‬ ‫]‪> > > [1, 2, 3] + [4, 5, 6‬‬ ‫‪# concatena tion‬‬ ‫]‪[1, 2, 3, 4, 5, 6‬‬ ‫‪> > > ['Ni!'] * 4‬‬ ‫‪# repetition‬‬ ‫]'!‪['Ni!', 'Ni!', 'Ni!', 'Ni‬‬ ‫‪> > > for x in [1, 2, 3]: print x,‬‬ ‫‪# iteration‬‬ ‫‪...‬‬ ‫‪1 2 3‬‬

‫الفهرسة والتقطيع‬ ‫بمما أن القوائم عبارة عمن سملسل ‪،‬فإن عمليتمي الفهرسمة والتقطيمع تعممل عليهما بشكمل جيمد مثمل‬ ‫السلسل النصية مع ملحظة الموقع الحقيقي لكل كائن ‪ ،‬وإليك هذا المثال‪:‬‬ ‫]'!‪> > > L = ['spam', 'Spam', 'SPAM‬‬ ‫]‪> > > L[2‬‬ ‫‪# offsets start at zero‬‬ ‫'!‪'SPAM‬‬ ‫]‪> > > L[- 2‬‬ ‫‪# negative: count from the right‬‬ ‫'‪'Spam‬‬ ‫]‪> > > L[1:‬‬ ‫‪# slicing fetches sections‬‬ ‫]'!‪['Spam', 'SPAM‬‬

‫اﻹسناد في القوائم‬ ‫اﻷشياء التي أتت بها القوائم وتعتبر متميزة عن السلسل النصية هي المقدرة على إسناد قيم‬ ‫جديدة إلى الفهارس والمقاطع في القوائم و ذلك بخلف السلسل النصية التي تحتاج لفعل‬ ‫ذلك إلى إنشاء نسخة جديدة من الكائن‪.‬‬ ‫‪22‬‬

‫عند استخدام القوائم تستطيع تغيير المحتوى باستخدام الفهرس أو المقطع كما يبين ذلك‬ ‫المثال التالي ‪:‬‬ ‫]'!‪> > > L = ['spam', 'Spam', 'SPAM‬‬ ‫'‪> > > L[1] = 'eggs‬‬ ‫‪# index assignm e n t‬‬ ‫‪>>> L‬‬ ‫]'!‪['spam', 'eggs', 'SPAM‬‬ ‫]'‪> > > L[0:2] = ['eat', 'more‬‬ ‫‪# slice assignm e n t: delete +i n s er t‬‬ ‫‪>>> L‬‬ ‫‪# replaces items 0,1‬‬ ‫]'!‪['eat', 'more', 'SPAM‬‬

‫مع ملحظة أن بايثون حين تقوم باﻹسناد إلى القوائم عن طريق المقاطع ‪ ،‬فإنها أول تقوم بحذف‬ ‫المقطع المختار ثم تضع القيمة الجديدة مكانه ولو كانت القيمة أكثر من كائن واحد‪ ،‬على سبيل‬ ‫المثال عندنا قائمة ‪ L‬تساوي [ ‪ ]3 ,2 ,1‬فعند تطبيق عملية اﻹسناد باستخدام المقطع التالي‬ ‫‪ ]L[1:2] = [4, 5‬فإن النتيجة ستكون [ ‪.]3 ,5 ,4 ,1‬‬ ‫القوائم تدعم بعض الدوال منها توسيع و الترتيب و البحث و العكس و إليك المثال التالي‪:‬‬ ‫)'‪> > > L.appen d('please‬‬ ‫‪>>> L‬‬ ‫]'‪['eat', 'more', 'SPAM!', 'please‬‬ ‫)(‪> > > L.sort‬‬ ‫‪>>> L‬‬ ‫]'‪['SPAM!', 'eat', 'more', 'please‬‬ ‫)(‪> > > L.reverse‬‬ ‫‪>>> L‬‬ ‫]'!‪['please', 'more', 'eat', 'SPAM‬‬ ‫)'‪> > > L.index('eat‬‬ ‫‪2‬‬

‫وأخيرا بما أن القوائم عبارة عن سلسلة مرنة ‪ ،‬فإنها تدعم الحذف باستخدام الفهرس أو‬ ‫المقطع‪ ،‬وذلك عن طريق السناد إلى قائمة فارغة أو الحذف عن طريق الفهرس أو المقطع ‪:‬‬

‫‪23‬‬

‫)(‪> > > L.sort‬‬ ‫‪>>> L‬‬ ‫]'‪['SPAM!', 'eat', 'more', 'please‬‬ ‫]‪> > > del L[0‬‬ ‫‪# delete one item‬‬ ‫‪>>> L‬‬ ‫]'‪['eat', 'more', 'please‬‬ ‫]‪> > > del L[1:‬‬ ‫‪# delete an entire section‬‬ ‫‪>>> L‬‬ ‫][ = ]‪# same as L[1:‬‬ ‫]'‪['eat‬‬

‫القواميس‬ ‫باﻷضافة إلى القوائم تعتبر القواميس من أهم الكائنات المدمجة المرنة في لغة بايثون‪،‬وإذا كنا‬ ‫اعتبرنا أن القوائم عبارة عن مجموعة من الكائنات المرتبة ‪ ،‬فإن القواميس بعكس ذلك فهي‬ ‫مجموعة من الكائنات غير المرتبة‪ ،‬ويعتبر الشيء الرئيسي في القوائم الذي يقوم عليه ترتيب و‬ ‫إحضار عناصر القاموس هو المفتاح وليس موقع العنصر‪.‬‬ ‫وكما تلحظ فإن القواميس استطاعت استبدال الكثير من خوارزميات و بنى المعطيات التي‬ ‫ستضطر إلى استخدامها يدويا في بعض اللغات منخفضة المستوى‪ ،‬وأيضا تستخدم القواميس في‬ ‫بعض اﻷحيان ﻷداء عمل الجداول في بعض اللغات منخفضة المستوى‪.‬‬ ‫وتتميز القواميس بعدة خصائص منها‪:‬‬ ‫الوصول باستخدام المفتاح وليس الموقع‬ ‫القواميس في بعض اﻷحيان يطلق عليها المصفوفات المترابطة‪،‬هذا الترابط يضع القيم باستخدام‬ ‫المفاتيح‪ ،‬وباستطاعتك إحضار أي عنصر في القاموس باستخدام المفتاح الذي خزن به‪،‬‬ ‫ستستخدم نفس عمليات الفهرس ولكن باستخدام المفتاح وليس باستخدام الموقع‪.‬‬ ‫مجموعة غير منظمة من كائنات غير متجانسة‬ ‫بخلف القوائم‪ ،‬العناصر في القواميس ل تبقى على ترتيب معين‪،‬في الحقيقة بايثون تقدم ترتيب‬ ‫عشوائي يضمن تقديم مشاهدة سريعة‪ ،‬المفاتيح تقدم راوبط (غير فيزيائية) إلى أماكن العناصر‬ ‫في القواميس‪.‬‬ ‫خصائص مرنة‬ ‫‪24‬‬

‫مثل القوائم القواميس تزودك بميزة التوسيع والتقلص بدون إنشاء نسخة جديدة‪ ،‬وكذلك يمكنها‬ ‫تحتوي على عناصر من كل نوع‪،‬وكذلك ميزة التداخل بحيث يمكنك أن تنشأ قواميس في‬ ‫قواميس وكذلك يمكنك قوائم في قواميس‪،‬وأيضا يمكنك أن تسند قيم جديدة بالعتماد على‬ ‫المفاتيح‬ ‫جداول من كائنات المرجعية‬ ‫إذا كنا قلنا أن القوائم عبارة عن مصفوفة من الكائنات المرجعية ‪ ،‬فإن القواميس عبارة عن‬ ‫جداول غير منظمة من الكائنات المرجعية‪ .‬داخليا القواميس تستخدم جداول من بنى المعطيات‬ ‫تدعم ميزة السترجاع السريع وهي تبدأ صغيرة و تكبر حسب الطلب‪ ،‬وعلوة على ذلك بايثون‬ ‫توظف خوارزميات محسنة ﻹيجاد المفاتيح مما يعطي السترجاع سرعة كبيرة‪ .‬وعند التعمق‬ ‫نجد أن القواميس تخزن مراجع الكائنات وليس نسخ منها مثل القوائم بالضبط‪.‬‬ ‫الجدول التالي يوضح أهم العمليات الشائعة على القواميس‪ ،‬لحظ أنها تشابه القوائم‪ .‬تكتب‬ ‫القواميس على شكل التالي‪key:value :‬‬ ‫الوصف‬

‫العملية‬ ‫} { = ‪ D1‬قاموس فارغ‬

‫}‪ d2 = {'spam': 2, 'eggs': 3‬عنصرين في القاموس‬ ‫}}‪ d3 = {'food': {'ham': 1, 'egg': 2‬التداخل‬ ‫]'‪ d2['eggs'], d3['food']['ha m‬الفهرسة باستخدام المفتاح‬ ‫‪ d2.has_key('eggs'),‬الدوال ‪ :‬دالة العضوية‬ ‫‪ d2.keys(),‬قائمة المفاتيح‬ ‫)(‪ d2.values‬قائمة القيم‬ ‫)‪ len(d1‬الطول (عدد اﻹدخالت المخزنة)‬ ‫‪ d2[key] = new,‬اﻹضافة والتعديل‬ ‫]‪ del d2[key‬الحذف‬

‫العمل على القواميس‬ ‫دعنا نرجع إلى المفسر لنأخذ حريتنا في تطبيق بعض العمليات التي ذكرت في الجدول السابق‪:‬‬ ‫العمليات اﻷساسية‪:‬‬

‫بشكمل عام ‪ ،‬يمكنمك إنشاء قاموس والوصمول إلى عناصمره باسمتخدام المفتاح ‪ ، key‬و الدالة‬ ‫‪25‬‬

‫‪ len‬المدمجمة تعممل أيضما ممع القواميمس‪ ،‬وهمي ترجمع عدد العناصمر المخزنمة فمي القاموس أو‬ ‫بمعنى آخر ترجع طول قائمة المفاتيح‪ .‬وعند حديثنا عن المفاتيح فإن الدالة ‪ keys‬ترجع كل‬ ‫المفاتيممح فممي القاموس مجموعممة فممي قائمممة‪ ،‬هذا يعتممبر أداة قويممة لمعالجممة القواميممس بشكممل‬ ‫متسلسل‪ ،‬ولكن ل تعتمد عليه في ترتيب قائمة المفتايح ‪(،‬تذكر أن القواميس عشوائية)‪.‬‬ ‫‪% python‬‬ ‫}‪> > > d2 = {'spam': 2, 'ham': 1, 'eggs': 3‬‬ ‫]' ‪> > > d2['spa m‬‬ ‫‪# fetch value for key‬‬ ‫‪2‬‬ ‫)‪> > > len(d2‬‬ ‫‪# num ber of entries in dictionary‬‬ ‫‪3‬‬ ‫)'‪> > > d2.has_key('ha m‬‬ ‫)‪# key member s hi p test (1 means true‬‬ ‫‪1‬‬ ‫)(‪> > > d2.keys‬‬ ‫‪# list of my keys‬‬ ‫]'‪['eggs', 'spam', 'ham‬‬

‫التغيير في القواميس‬

‫كما قلنا أن القواميس غير مرتبة‪ ،‬فلذا تستطيع أن تكبر و تصغر و اسناد قيم جديدة أيضا ‪،‬بدون‬ ‫الحاجة إلى إنشاء قواميس جديدة مثل القوائم بالضبط‪ ،‬فقط عليك إسناد قيمة أو تغييرها ﻹنشاء‬ ‫مدخلة جديدة في القاموس‪ .‬والدالة ‪ del‬تعمل أيضا على القواميس مثلما تعمل على القوائم‬ ‫بالضبط ‪ ،‬إليك المثال التالي‪:‬‬ ‫]'‪> > > d2['ham'] = ['grill', 'bake', 'fry‬‬ ‫‪# change entry‬‬ ‫‪> > > d2‬‬ ‫}]'‪{'eggs': 3, 'spam': 2, 'ham': ['grill', 'bake', 'fry‬‬ ‫]'‪> > > del d2['eggs‬‬ ‫‪# delete entry‬‬ ‫‪> > > d2‬‬ ‫}]'‪{'spam': 2, 'ham': ['grill', 'bake', 'fry‬‬ ‫'‪> > > d2['bru nch'] = 'Bacon‬‬ ‫‪# add new entry‬‬ ‫‪> > > d2‬‬ ‫}]'‪{'brunch': 'Bacon', 'spam': 2, 'ham': ['grill', 'bake', 'fry‬‬

‫لحظ هنا الطريقة في إنشاء مدخلة جديدة في القاموس المثال اﻷخير ‪ ،‬فهي تختلف عن طريقة‬ ‫‪26‬‬

‫إضافة مدخلة الجديدة في القوائم ‪ ،‬وذلك أن القواميس ل تعتمد على موقع بل على المفتاح‬ ‫فهي عشوائية و ل يهمها المكان‪ ،‬بعكس القواميس فهي تحتاج إلى الدالة ‪ appen d‬ﻹضافة‬ ‫مدخلة جديدة في القائمة‪.‬‬ ‫مثال واقعي‬

‫سنأخذ هنا مثال أكثر واقعية وهو إنشاء جدول يحوي أسماء اللغات ‪-‬ثلث هنا‪ -‬في العمود‬ ‫اﻷول ‪-‬المفتاح‪ -‬والعمود الثاني يحوي أسماء مؤلفيها – القيمة‪،-‬ركز في هذا المثال وحاول‬ ‫تطبيقه‪:‬‬ ‫‪> > > table = {'Python': 'Guido van Rossum',‬‬ ‫‪...‬‬ ‫‪'Perl': 'Larry Wall',‬‬ ‫‪...‬‬ ‫‪'Tcl':‬‬ ‫} ' ‪'John Ousterho u t‬‬ ‫‪...‬‬ ‫'‪> > > language = 'Python‬‬ ‫]‪> > > creator = table[language‬‬ ‫‪> > > creator‬‬ ‫'‪'Guido van Rossu m‬‬ ‫]‪> > > for lang in table.keys(): print lang, '\t', table[lang‬‬ ‫‪...‬‬ ‫‪Tcl‬‬ ‫‪John Ousterh o u t‬‬ ‫‪Python Guido van Rossu m‬‬ ‫‪Perl Larry Wall‬‬

‫لحظ اﻷمر اﻷخير‪،‬ﻷن القواميس ليست متسلسلة فل يمكن أن تكررها بشكل مباشر باستخدام‬ ‫‪ for‬مثل السلسل النصية أو القوائم‪ .‬ولكن إذا أردت أن تعرض جميع عناصر القاموس‪،‬‬ ‫فقم أول باستخدام الدالة ‪ keys‬لجلب قائمة المفاتيح في القاموس ثم كررها واعرض قيمتها‬ ‫باستخدام ‪ ، for‬إذا لم تكن تعرف ‪ for‬فل تتضايق فسوف ندرسها بالتفصيل في الدروس‬ ‫القادمة‪.‬‬ ‫وهنا بعض الملحظات يجب أن تتذكرها حول القواميس قبل أن ننتقل إلى الكائنات اﻷخرى‪:‬‬ ‫–العمليات التي تعتمد على التسلسل ل تعمل مع القواميس مثلما رأينا في المثال اﻷخير‬ ‫–عند إسناد قيمة جديدة فإنك تضيف مدخلة جديدة في القاموس‬ ‫–ليس شرطا أن يكون المفتاح سلسلة نصية ‪ ،‬بل تعمل كل الكائنات ماعدا القوائم‬ ‫‪27‬‬

‫المجموعات‬ ‫آخر نوع في اسكشافنا لبايثون ﻷنواع المجمعات هي المجموعات‪،‬المجموعات تتركب ببساطة‬ ‫من مجموعة من الكائنات‪،‬وهي تعمل بالضبط مثل القوائم باستثناء أن القوائم ل يمكن أن تتغير‬ ‫من مكانها فهي ثابتة وتكتب عادة كعناصر متسلسلة محصورة بين قوسين وليس بين قوسين‬ ‫معكوفين مثل القوائم‪.‬والمجموعات تستمد معظم خصائصها من القوائم وهي‪:‬‬ ‫مجموعة منظمة من الكائنات‬ ‫مثل السلسل النصية والقوائم المجموعات عبارة عن مجموعة من الكائنات المنظمة في نسق‬ ‫معين ومثل القوائم يمكن أن تحتوي على كل أنواع الكائنات‬ ‫الوصول باستخدام الموقع‬ ‫مثل السلسل النصية والقوائم يمكنك الوصول إلى أي عنصر في المجموعة باستخدام موقعه‬ ‫وليس مفتاحه‪ ،‬و المجموعات تدعم كل العلميات التي تستخدم الموقع والتي سبق وأن أخذناها‬ ‫مثل الوصول باستخدام الفهرس والتقطيع‪.‬‬ ‫سلسلة ثابتة من الكائنات‬ ‫مثل السلسل النصية المجموعات ثابتة ويعني ذلك أنها ل تدعم أي عملية تغيير في المكان‬ ‫(السناد) مثل التي رأيتها في القوائم‪ ،‬وهي أيضا ل تدعم التوسع والتقلص بل يجب لفعل‬ ‫ذلك إنشاء نسخة جديدة من المجموعة المراد تكبيرها أو تصغيرها‪.‬‬ ‫مصفوفة من الكائنات المرجعية‬ ‫مثل القوائم بالضبط‪ ،‬المجموعة عبارة عن مصفوفة من الكائنات المرجعية‪.‬‬ ‫الجدول التالي يوضح أهم العمليات على المجموعات‪ ،‬مع ملحظة لكي تنشيء مجموعة فارغة‬ ‫فقط يكفي وضع قوسين فقط‪.‬‬ ‫الوصف‬

‫العملية‬ ‫)( مجموعة فارغة‬

‫)‪ t1 = (0,‬عنصر واحد في المجموعة‬ ‫)‪ t2 = (0, 1, 2, 3‬أربعة عناصر‬ ‫‪ t2 = 0, 1, 2, 3‬أربعة عناصر أيضا‬

‫‪28‬‬

‫الوصف‬

‫العملية‬ ‫))'‪t3 = ('abc', ('def', 'ghi‬‬ ‫]‪t1[i], t3[i][j‬‬ ‫‪t1[i:j],‬‬ ‫)‪len(t1‬‬

‫التداخل‬ ‫الفهرسة‬ ‫التقطيع‬ ‫الطول‬

‫‪ t1 + t2‬الجمع‬ ‫‪ t2 * 3‬اﻹعادة‬ ‫‪ for x in t2,‬التكرار‬ ‫‪ 3 in t2‬العضوية‬

‫أربعة الصفوف اﻷولى في الجدول تستحق إيضاحا أكثر‪ ،‬بسبب أن اﻷقواس تستخدم في إغلق‬ ‫المعاملت ( راجع اﻷعداد) فإنك تحتاج إلى شيء مميز ﻹخبار بايثون أن كائنا واحدا بين‬ ‫القوسين هو من فئة المجموعات وليس عبارة عن تعبير بسيط‪،‬بكل بساطة ضع فاصلة سفلية قبل‬ ‫إقفال القوسين‪ ،‬وبذلك تخبر بايثون أن ما بين القوسين هو عبارة عن مجموعة‪.‬‬ ‫وكحالة خاصة فإن بايثون تتيح لك الحرية في وضع اﻷقواس أو ل في إنشاء المجموعات كما في‬ ‫الصف الرابع‪ ،‬ولكن يفضل دائما إذا سمحت لك الفرص بأن تستخدم اﻷقواس ﻷنها تضمن‬ ‫لك عدم التشويش‪.‬‬ ‫في العمليات اﻷخيرة في الجدول السابق فهي مشابهة تماما لمثيلتها على السلسل النصية‬ ‫والقوائم فلذا ل يوجد داعي لشرحها مرة أخرى ‪ ،‬فقط يكفي أن تتطبقها أنت على مفسر بايثون‬ ‫للتأكد من فهمك لها‪.‬‬

‫لماذا نستخدم المجموعات؟‬ ‫أول سؤال يتبادر للمبتدئ لماذا نستخدم المجموعات إذا كان عندنا القوائم؟ قد يكون هذا‬ ‫تاريخيا ولكن أفضل إجابة أن ثبات المجموعات يوفر العديد من مميزات‪ ،‬مثل يمكن باستخدام‬ ‫المجموعات التأكد أن الكائنات ل تتغير باستخدام مراجع أخرى في مكان آخر في البرنامج‪.‬‬ ‫بعض العمليات المدمجة تحتاج إلى المجموعات وليس القوائم‪ ،‬وبشكل عام استخدم القوائم‬ ‫في المجموعات المنظمة التي يطرأ عليها التغيير أما في بقية الحالت فاستخدم المجموعات‪.‬‬

‫‪29‬‬

‫الملفات‬ ‫على أمل أن معظم القراء عندهم خلفية عن فكرة أسماء الملفات التي تخزن المعلومات في‬ ‫الكميبوتر و التي يديرها نظام التشغيل‪،‬يكون آخر كائن مدمج في بايثون يزودنا بطريقة الوصول‬ ‫إلى تلك الملفات ضمن برامج بايثون‪.‬إن الدالة مدمجة ‪ open‬تنشأ كائن الملف في بايثون وهي‬ ‫تقدم لنا خدمة الربط إلى الملف المستقر على جهازنا‪،‬بعد مناداة الدالة ‪، open‬يمكننا القراءة‬ ‫والكتابة من الملف المربوط‪،‬بمناداة دوال الكائن ملف‪.‬‬ ‫عند مقارنة كائن الملفات بالكائنات اﻷخرى سنجده غريبا قليل‪ ،‬ﻷنه ليس عددا و كائنات‬ ‫متسلسلة أو خرائطية‪ ،‬إنما هو استخدام دوال لمعالجة العمليات الشائعة في الملفات‪ ،‬وهذا‬ ‫الكائن ليس موجودا في اللغات اﻷخرى ‪ ،‬وإنما يدرس في مجال معالجة الخرج والدخل‪،‬وهو‬ ‫ليس مستقل و إنما يستخدم دوال أخرى لمعالجة الملفات‪.‬‬ ‫الجدول التالي يوضح ملخص ﻷهم العلميات على الملفات‪ ،‬لفتح الملف يجب مناداة الدالة‬ ‫‪ open‬و تزويدها بمعاملين اﻷول اسم الملف مع مساره ‪،‬و الثاني طريقة معاملة الملف للقراء‬ ‫‪ r‬للكتابة ‪ w‬للكتابة في آخر الملف ‪ ، a‬مع ملحظة أن كل المعاملين يجب أن يكونا سلسل‬ ‫نصية‪:‬‬ ‫الوصف‬

‫العملية‬

‫)'‪ output = open(' / t m p / s p a m ', 'w‬إنشاء ملف ‪ output‬في نمط الكتابة‬ ‫)'‪ input = open('data', 'r‬إنشاء ملف ‪ output‬في نمط القراءة‬ ‫)(‪ S = input.read‬اسناد خرج الملف بالكامل إلى سلسل‬ ‫نصية‬ ‫)‪ S = input.read(N‬قراءة ‪ N‬من البايتات (واحد أو أكثر)‬ ‫)(‪ S = input.readline‬قراءة السطر التالي‬ ‫)(‪ L = input.readlines‬قراءة خرج الملف ووضعه في قائمة بحيث‬ ‫كل سطر في الملف يساوي عنصر في‬ ‫القائمة‬ ‫)‪ output.write(S‬كتابة ‪ S‬داخل الملف ‪outpu t‬‬ ‫)‪ output.writelines(L‬كتابة جميع أسطر السلسلة النصية في‬ ‫قائمة ‪ L‬داخل الملف ‪outpu t‬‬ ‫)(‪ output.close‬إغلق الملف‪ ،‬بعد إغلق الملف ل يمكن‬ ‫القراءة منه أو الكتابة عليه ويعطي خطأ‬ ‫عند محاولة ذلك‬

‫‪30‬‬

‫عند إنشائك للملف يمكنك الكتابة والقراءة منه‪ ،‬وفي كل الحالت بايثون تتعامل مع محتويات‬ ‫الملف كسلسل نصية ولو كانت أعداد‪ ،‬وكذلك عند الكتابة إلى الملفات فهي تعاملها كسلسل‬ ‫النصية‪ ،‬الجدول السابق يحوي أهم العمليات و يمكنك مراجعة وثائق بايثون للحصول على كل‬ ‫عمليات الملفات‪.‬‬ ‫عملية إغلق الملف ‪ ،close‬تعمل على إغلق التصال بين البرنامج والملف الخارجي وهي‬ ‫مهم لتحرير مساحة من الذاكرة‪ ،‬ولكن كما تعلم أن بايثون تملك مجمع نفايات يقوم بغلق‬ ‫التصال عندما ل تكون في حاجة إليه تلقائي‪ ،‬وعملية إغلق الملف لتضر في البرامج الصغيرة‬ ‫مثل سكربتات‪ ،‬ولكن عند العمل على أنظمة كبيرة يجب أل تتهاون عن غلق الملفات بنفسك‬ ‫وعدم العتماد على مجمع النفايات لتضمن أداء جيدا‪.‬‬ ‫العمل على الملفات‬ ‫هنممما مثال بسممميط يوضمممح كيفيمممة العممممل على الملفات‪ ،‬أول شيمممء قمنممما بفتمممح ملف فمممي نممممط‬ ‫الكتابمة‪،‬فيقوم المفسمر بالبحمث عمن السمم المعطمى فإن لم يجده يقوم بإنشاء ملف جديمد و يعطيمه‬ ‫السمم الذي أعطيناه إياه‪ ،‬ثمم قمنما بالكتابمة فمي الملف المنشمئ سمطر واحمد ممع ملحظمة إعطاءه‬ ‫علممة سمطر جديمد‪ ،‬ثمم قمنما بإغلق الملف‪ ،‬ثمم قمنما بفتحمه فمي نممط القراءة وقمنما بقراءة السمطر‬ ‫اﻷول منه‪،‬ثم حاولنا قراءة السطر الثاني فأعطنا الناتج فراغ ﻷنه السطر الثاني فارغ‪:‬‬ ‫)‪# open for outpu t (creates‬‬ ‫‪# write a line of text‬‬

‫)'‪> > > myfile = open('myfile', 'w‬‬ ‫)'‪> > > myfile.write('hello text file\ n‬‬ ‫)(‪> > > myfile.close‬‬ ‫)'‪> > > myfile = open('myfile', 'r‬‬ ‫)(‪> > > myfile.readline‬‬ ‫'‪'hello text file\0 1 2‬‬ ‫)(‪> > > myfile.readline‬‬ ‫''‬

‫‪# open for input‬‬ ‫‪# read the line back‬‬ ‫‪# empty string: end of file‬‬

‫وهناك بعض الملحظات حول الملفات‪:‬‬ ‫–من اﻹصدار ‪ 2.2‬لبايثون استبدلت الدالة ‪ open‬بالدالة ‪ file‬فيمكنك استخدام الدالة‬ ‫‪31‬‬

‫‪ file‬مكان الدالة السابقة‪ ،‬وكذلك يمكنك استخدام الدالة السابقة ﻷنها تعمل كقناع للدالة‬ ‫الجديدة في اﻹصدارات الجديدة‬ ‫–لحظ أن قراءة الملف تتم مرة واحدة و الملف عند عرضه مرة ثانية باستخدام الدالة ‪read‬‬ ‫ل يتم عرضه ويعطي فراغ‪ ،‬فيجب إعادة قراءة الملف مرة ثانية(هذا ما لحظته على اﻹصدار‬ ‫‪ 2.3‬من بايثون)‬

‫الخصائص العامة للكائنات‬ ‫اﻵن وبعد أن أنهينا جميع الكائنات المدمجة في بايثون‪ ،‬دعنا نأخذ جولة سريعة عن الخصائص‬ ‫العامة للكائنات المدمجة في باثيون التي تتشارك فيها‪.‬‬

‫تصنيف الكائنات‬ ‫الجدول التالي يصنف جميع اﻷنواع التي رأيناها سابقا‪:‬‬ ‫نوع الكائن‬

‫صنفه‬

‫قابل للتوسع؟‬

‫اﻷعداد ‪Number s‬‬

‫عددي‬

‫ل‬

‫السلسل النصية ‪Strings‬‬

‫متسلسل‬

‫ل‬

‫القوائم ‪Lists‬‬

‫متسلسل‬

‫نعم‬

‫القواميس ‪Dictionaries‬‬

‫تخطيطي‬

‫نعم‬

‫المجموعات ‪Tuples‬‬

‫متسلسل‬

‫ل‬

‫الملفات ‪Files‬‬

‫امتدادي‬

‫‪N/A‬‬

‫كما نرى من الجدول فإن السلسل النصية و القوائم والمجموعات تشترك في أنها متسلسلة‪،‬و أن‬ ‫القوائم و القواميس فقط تدعم قابلية التوسع و اﻹنكماش فقط أما غيرها فل‪ .‬الملفات تستخدم‬ ‫دوال للتوسع‪،‬فهي ليست قابلة للتوسع بالضبط‪ ،‬صحيح تتوسع حين يتم الكتابة‪ ،‬ولكن ليس‬ ‫بالقيود التي تفرضها بايثون على اﻷنواع‪.‬‬

‫العمومية‬ ‫لقد رأينا العديد من الكائنات المركبة‪ ،‬وبشكل عام نستطيع أن نقول‪:‬‬ ‫القوائم والقواميس والمجموعات يمكنها أن تخزن أي نوع من الكائنات‬‫القوائم والقواميس والمجموعات تدعم التداخل المركب‬‫‪32‬‬

‫القوائم والقواميس تستطيع أن تكبر وتصغر دينامكيا‬‫بسبب أن هذه الكائنات تدعم التداخل المركب فهي مناسبة جدا للتمثيل المعلومات المركبة في‬ ‫التطبيق‪،‬انظر إلى المثال التالي‪:‬‬ ‫]‪> > > L = ['abc', [(1, 2), ([3], 4)], 5‬‬ ‫]‪> > > L[1‬‬ ‫])‪[(1, 2), ([3], 4‬‬ ‫]‪> > > L[1][1‬‬ ‫)‪([3], 4‬‬ ‫]‪> > > L[1][1][0‬‬ ‫]‪[3‬‬ ‫]‪> > > L[1][1][0][0‬‬ ‫‪3‬‬

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

‫المراجع المشتركة‬ ‫لقد قلنا سابقا إننا نخزن مراجع إلى الكائنات وليس نسخة عنها‪،‬وعمليا هذا ما تريده في أغلب‬ ‫اﻷحيان‪،‬ولكن أحيانا ينبغى عليك التركيز في هذه النقطة وخاصة إذا كانت هناك مراجع مشتركة‬ ‫فإن أي تغيير في المرجع اﻷصلي يغيير كل النتائج‪ ،‬على سبيل المثال إذا أنشأنا قائمة ‪ X‬ثم‬ ‫قمنا بإنشاء قائمة أخرى ‪ L‬وضمناها مرجعا إلى القائمة ‪ X‬ثم قمنا إنشاء قاموس ‪ D‬وكذلك ضمنا‬ ‫أحد قيم مدخلته مرجع إلى القائمة ‪ X‬سيكون المثال على الشكل التالي‪:‬‬ ‫]‪> > > X = [1, 2, 3‬‬ ‫]'‪> > > L = ['a', X, 'b‬‬ ‫}‪> > > D = {'x':X, 'y':2‬‬

‫في هذه الحالة هناك مرجعين إلى القائمة ‪ ،X‬وبما أن القوائم تقبل إسناد قيم جديدة إليها‪،‬‬ ‫فانظر ماذا يحدث عند إسناد قيمة جديدة‪:‬‬

‫‪33‬‬

‫'‪> > > X[1] = 'surprise‬‬ ‫!‪# changes all three references‬‬ ‫‪>>> L‬‬ ‫]'‪['a', [1, 'surp rise', 3], 'b‬‬ ‫‪>>> D‬‬ ‫}‪{'x': [1, 'surprise', 3], 'y': 2‬‬

‫فكنا منتبها لهذه النقطة‪.‬‬

‫المقارنة ‪،‬والمساواة و التحقق‬ ‫جميع كائنات في بايثون تستجيب لعمليات المقارنة وعمليات التحقق فيما بينها‪ ،‬وكأنها أعداد‬ ‫وهذا بخلف كثير من اللغات التي ل تسمح بمثل هذه المقارنات‪ ،‬انظر إلى المثال التالي‪:‬‬ ‫‪# same value, unique objects‬‬ ‫?‪# equivalent?, same object‬‬

‫])‪> > > L1 = [1, ('a', 3‬‬ ‫])‪> > > L2 = [1, ('a', 3‬‬ ‫‪> > > L1 = = L2, L1 is L2‬‬ ‫)‪(True, False‬‬

‫وهنا اختبرنا علقة المساواة و علقة التحقق‪ ،‬وانظر المثال التالي‪:‬‬ ‫?‪# less, equal, greater: a tuple of results‬‬

‫])‪> > > L1 = [1, ('a', 3‬‬ ‫])‪> > > L2 = [1, ('a', 2‬‬ ‫‪> > > L1 < L2, L1 = = L2, L1 > L2‬‬ ‫)‪(False, False, True‬‬

‫وهنا عدة ملحظات في المقارنة بين الكائنات المختلفة في بايثون‪:‬‬ ‫–اﻷعداد تقارن بمقاديرها التقريبية‬ ‫– السلسل النصية تقارن معجميا‪ ،‬أي حرفا بحرف أي" ‪ "abc" < "ac‬لحظ أن ‪ c‬أكبر‬ ‫من ‪ b‬في المعجم‬ ‫– القوائم والمجموعات تقارن كل عنصر مع ما يقابله من اليسار إلى اليمين‬ ‫–القواميس تقارن أيضا باستخدام القائمة المخزنة من المفتاح والقيمة‬

‫تلميحات مهمة‬ ‫في هذا القسم من كل فصل سنأخذ تلميحات وحيل تساعدك على فهم بايثون بشكل أعمق مع‬ ‫حل مشاكل قد تواجهك ول تعرف لها إجابة و أنت مبتدئ في اللغة‪:‬‬

‫‪34‬‬

‫إسناد المراجع المشتركة‬ ‫قد تكلمنا عن هذا النقطة مسبقا‪ ،‬ونعود نكرر شرح هذه النقطة؛ﻷن عدم فهمها يؤدي إلى‬ ‫غموض في فهم ما يجري في المراجع المشتركة ضمن برنامجك‪ ،‬على سبيل المثال سنقوم‬ ‫بإنشاء قائمة ‪ L‬ثم نقوم بإنشاء قائمة ‪ M‬نضمنها القائمة ‪ L‬ثم نقوم بإسناد قيمة جديدة في القائمة‬ ‫‪ ، L‬انظر ماذا يحدث‪:‬‬ ‫‪# embed a reference to L‬‬

‫‪# changes M too‬‬

‫]‪> > > L = [1, 2, 3‬‬ ‫]'‪> > > M = ['X', L, 'Y‬‬ ‫‪>>> M‬‬ ‫]'‪['X', [1, 2, 3], 'Y‬‬ ‫‪> > > L[1] = 0‬‬ ‫‪>>> M‬‬ ‫]'‪['X', [1, 0, 3], 'Y‬‬

‫تلميح‬

‫إن تأثير هذه الجزئية يكون مهما فقط في البرامج الضخمة‪ ،‬وعادة المراجع المشتركة تقوم بما‬ ‫تريده بالضبط‪ ،‬ولكن إذا أردت أن تسند نسخة وليس مرجع فماذا تفعل؟ بكل بساطة أضف‬ ‫نقطتين على الشكل التالي‪:‬‬ ‫‪# embed a copy of L‬‬ ‫‪# only changes L, not M‬‬

‫]‪> > > L = [1, 2, 3‬‬ ‫]'‪> > > M = ['X', L[:], 'Y‬‬ ‫‪> > > L[1] = 0‬‬ ‫‪>>> L‬‬ ‫]‪[1, 0, 3‬‬ ‫‪>>> M‬‬ ‫]'‪['X', [1, 2, 3], 'Y‬‬

‫التكرار على مستوى واحد‬ ‫عندما تكلمنا سابقا عن تكرار السلسلة قلنا أنه عبارة عن إعادة السلسلة عدد من المرات‪،‬هذا‬ ‫اﻷمر صحيح ولكن عندما تكون السلسلة متداخلة تكون النتيجة تختلف عما تريده بالضبط‪ ،‬انظر‬ ‫إلى المثال التالي‪:‬‬

‫‪35‬‬

‫]‪> > > L = [4, 5, 6‬‬ ‫‪>>> X = L * 4‬‬ ‫‪# like [4, 5, 6] + [4, 5, 6] + ...‬‬ ‫‪> > > Y = [L] * 4‬‬ ‫]‪# [L] + [L] + ... = [L, L,...‬‬ ‫‪>>> X‬‬ ‫]‪[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6‬‬ ‫‪>>> Y‬‬ ‫]]‪[[4, 5, 6], [4, 5, 6], [4, 5, 6], [4, 5, 6‬‬

‫لحظ الفرق عندما عندما وضعنا القوسين‪ ،‬وهذا الفرق أيضا يتجلى عندما نقوم بإسناد قيمة‬ ‫جديدة إلى القائمة ‪ L‬انظر المثال التالي‪:‬‬ ‫‪> > > L[1] = 0‬‬ ‫‪# impacts Y but not X‬‬ ‫‪>>> X‬‬ ‫]‪[4, 5, 6, 4, 5, 6, 4, 5, 6, 4, 5, 6‬‬ ‫‪>>> Y‬‬ ‫]]‪[[4, 0, 6], [4, 0, 6], [4, 0, 6], [4, 0, 6‬‬

‫تلميح‬ ‫هذه حالة ثانية من متاهات المراجع المشتركة‪ ،‬ولكي تحل هذه المشكلة فقط طبق التلميح‬ ‫السابق‪،‬وهذا ينطبق أيضا الجمع و التقطيع فكن منتبها‪.‬‬ ‫اﻷنواع الثابتة ل يمكن أن تتغير في مكانها‬ ‫كما مر علينا سابقا أن اﻷنواع الثابتة ل يمكن تغيير مثل السلسل النصية والمجموعات‪ ،‬ولكن إذا‬ ‫أردت أن تغيرها فتضطر إلى إنشاء نسخة جديدة انظر المثال التالي‪:‬‬ ‫)‪T = (1, 2, 3‬‬ ‫‪T[2] = 4‬‬ ‫!‪# error‬‬ ‫)‪T = T[:2] + (4,‬‬ ‫)‪# okay: (1, 2, 4‬‬

‫تلميح‬ ‫ﻹنشاء نسخة جديدة ‪،‬نقوم بإنشاء كائن جديدة ثم نسند إليه الكائن السابق باستخدام ميزة التقطيع‬ ‫ثم نضيف إليه ما نريد إضافته مثل المثال السابق‬

‫‪36‬‬

‫الملخص‬ ‫في هذا الفصل تناولنا العديد من المواضيع التي تتعلق بأنواع الكائنات في بايثون‪،‬بدأنا ببنة‬ ‫البرامج في بايثون ثم اﻷعداد و السلسل النصية ثم القوائم و القواميس والمجموعات ثم أخير‬ ‫الملفات ثم أخذنا أهم الخصائص العامة للكائنات المدمجة في بايثون ثم قمنا باستعراض أهم‬ ‫المشكلة التي تتعلق بالكائنات في بايثون‪.‬‬ ‫اﻷمثلة في هذا الفصل تميزت بأنها خصصت لتبيين اﻷشياء اﻷساسية‪ ،‬في الفصول القادمة‬ ‫ستكون اﻷمثلة أكثر واقعية‪.‬‬

‫‪37‬‬

‫الفصل الثالث‪ :‬التعابير اﻷساسية‬ ‫النقاط المهمة‪:‬‬ ‫السناد‬ ‫‪Print‬‬ ‫جملة الختبار ‪if‬‬ ‫الحلقة التكرارية ‪while‬‬ ‫الحلقة التكرارية ‪for‬‬ ‫تلميحات‬ ‫المخلص‬ ‫اﻵن وبعد أن رأينا اﻷنواع اﻷساسية للكائنات المدمجة في بايثون في الفصل السابق‪ ،‬سنتحرك‬ ‫في هذا الفصل لشرح أنواع التعابير اﻷساسية‪ .‬وبكل بساطة التعابير هي عبارة عن أشياء نكتبها‬ ‫تخبر بايثون ما على البرنامج أن يفعله بالضبط‪.‬‬ ‫ولفهم التعابير في بايثون نسترجع ما قلناه في الفصل الثاني لما تكلمنا عن بنية البرنامج في بايثون‪،‬‬ ‫وقلنا أن هرمية البرنامج تكون كالتالي‪:‬‬ ‫‪ -١‬البرنامج يتكون من وحدات‬ ‫‪ -٢‬و الوحدات تحتوي على عبارات‬ ‫‪ -٣‬و العبارات تنشأ الكائنات و تعالجها‪.‬‬ ‫إذا التعابير هي التي تعالج الكائنات ‪-‬التي مرت علينا في الفصل السابق‪،-‬علوة على ذلك‬ ‫التعابير هي التي تنشأ الكائنات بواسطة إسناد قيم إليها‪ ،‬وكذلك أيضا تنشأ أنواع جديدة من‬ ‫الكائنات مثل الفصول و الدوال والوحدات‪.‬‬ ‫الجدول التالي يلخص تعابير بايثون‪،‬لقد مرت علينا ‪.‬بعضا منها في الفصل الثاني مثل اﻹسناد و‬ ‫الحذف ‪، del‬في هذا الفصل سنأخذ معظم ما ورد في هذا الجدول إل التعابير التي تحتاج‬ ‫إلى متطلبات أكثر و سنأخذها في الفصول التالية‪:‬‬ ‫‪38‬‬

‫التعبير‬

‫الدور‬

‫مثال‬

‫السناد‬

‫المراجع‬

‫‪curly, moe, larry = 'good', 'bad',‬‬ ‫'‪'ugly‬‬

‫مناداة‬

‫الدوال‬

‫‪Print‬‬

‫طباعة الكائنات‬

‫‪print 'The Killer', joke‬‬

‫‪If/elif / else‬‬

‫عمليات الختيار‬

‫‪if "pytho n" in text: print text‬‬

‫‪For/else‬‬

‫التكرار‬

‫‪While/else‬‬

‫‪stdou t.write("spa m, ham,‬‬ ‫)"‪toast \ n‬‬

‫‪for x in mylist: print x‬‬

‫الحلقات العامة‬

‫'‪while 1: print 'hello‬‬

‫‪Pass‬‬

‫المسؤلية‬

‫‪Continue‬‬

‫قفز في الحلقات‬

‫‪Try/except / f i nally‬‬

‫الستثناءات‬

‫)(‪try: action‬‬ ‫'‪except: print 'action error‬‬

‫‪Raise‬‬

‫الستثناء‬

‫‪raise endSearch, location‬‬

‫‪Import, From‬‬

‫الوصول إلى الوحدات‬

‫‪Def, Return‬‬

‫الوسائل‬

‫‪Class‬‬

‫إنشاء الكائنات‬

‫][ = ‪class subclass: staticData‬‬

‫‪Global‬‬

‫اسم الفضاء‬

‫= ‪def function(): global x, y; x‬‬ ‫'‪'new‬‬

‫‪Del‬‬

‫حذف اﻷشياء‬

‫‪del data[k]; del data[i:j]; del‬‬ ‫‪obj.attr‬‬

‫‪Exec‬‬

‫تشغيل نصوص اﻷكواد‬

‫‪Assert‬‬

‫تأكيد التنقيحات‬

‫‪while 1: pass‬‬ ‫‪while 1:‬‬ ‫‪if not line: break‬‬

‫‪import sys; from sys import‬‬ ‫‪stdin‬‬ ‫‪def f(a, b, c=1, *d): retur n‬‬ ‫]‪a+b + c + d [ 0‬‬

‫‪exec "import " + modNa me in‬‬ ‫‪gdict, ldict‬‬ ‫‪assert X > Y‬‬

‫السناد‬ ‫لقد رأينا السناد في التعابير سابقا‪،‬وبكل بساطة نقول أنك ستكتب الهدف الذي تريد أن تسند‬ ‫إليه على ناحية الشمال ‪،‬والمسند إليه على ناحية اليمين بينهما علمة يساوي =‪ ،‬و الهدف من‬ ‫ناحية الشمال يمكن أن يكون اسم أو كائن ‪ ،‬أما المسند إليه يمكن أن يكون أي نوع من الكائنات‬ ‫التي مرت علينا‪.‬‬ ‫في معظم اﻷحيان اﻹسناد عملية بسيطة ‪ ،‬ولكن هناك بعض الخائص يجب أن تضعها في‬ ‫‪39‬‬

‫ذهنك‪:‬‬ ‫السناد ينشئ كائنات مرجعية‬

‫كما رأيت سابقا‪،‬بايثون تخزن المراجع إلى الكائنات في أسماء و بنى معطيات‪ ،‬ودائما تنشئ‬ ‫مراجع إلى الكائنات‪ ،‬بدل من نسخ المراجع‪.‬بسبب ذلك تبدو متغيرات بايثون أقرب ماتكون إلى‬ ‫المؤشرات في لغة السي‪ ،‬أكثر من مخزن معطيات‪.‬‬ ‫اﻷسماء تنشئ عند أول إسناد‬

‫وكما رأينا أيضا أسماء المتغيرات تنشئ في بايثون عند أول عملية إسناد إليها‪ ،‬ولست بحاجة إلى‬ ‫أن تعلن عن اﻷسماء المتغيرات أول ثم تسند إليها القيمة‪،‬وبعض بنى المعطيات وليس كلها‬ ‫تنشء إدخال جديد فيها بواسطة اﻹسناد مثل القواميس (راجع جزئية القواميس في الفصل‬ ‫الثاني)‪.‬‬ ‫يجب أن تسند اﻷسماء قبل استخدامها‬

‫بالمقابل تظهر بايثون خطأ إذا استخدمت السم ولم تسند إليه قيمة بعد وستظهر المزيد من‬ ‫الستثناءات إذا حاولت أن تفعل ذلك‬ ‫السناد الضمني‪ import:‬و ‪ from‬و ‪ del‬و ‪ class‬إلخ‪..‬‬

‫في هذه الجزئية نحن قد تعودنا على أن اﻹسناد يتم بالمعامل = ‪،‬ولكن اﻹسناد يحدث في‬ ‫العديد من سياقات في بايثون‪ ،‬على سبيل المثال لقد رأينا جلب الوحدات و الدوال و كذلك‬ ‫الفصول و معاملت الدوال و تعابير الحلقات التكرارية ‪..‬إلخ وهذه كلها تعتبر إسناد ضمني‪،‬‬ ‫وبما أن اﻹسناد يعمل نفس العمل أينما ظهر‪ ،‬جميع هذه السياقات ببساطة تسند السماء إلى‬ ‫مراجع الكائنات في زمن التنفيذ‪.‬‬ ‫الجدول التالي يبين نكهات التعابير اﻹسنادية في لغة بايثون‪:‬‬ ‫تفسيرها‬

‫العلمية‬ ‫'‪spam = 'Spam‬‬

‫الصيغة اﻷساسية والعتيادية‬

‫'‪spam, ham = 'yum', 'YUM‬‬

‫السناد المجموعي (اختياري)‬ ‫السناد عن طريق القوائم (اختياري)‬

‫]'‪[spam, ham] = ['yum', 'YUM‬‬ ‫'‪spam = ham = 'lunch‬‬

‫تعدد اﻷهداف‬

‫السطر اﻷول يظهر الصيغة مشهور وهي إسناد اسم إلى قيمة أو بنى معطيات ‪ ،‬أما الصيغ الباقية‬ ‫فهي هيئات خاصة وسنأخذها بشئ من التفصيل‪:‬‬ ‫‪40‬‬

‫السناد المجموعي والقوائمي‪:‬‬ ‫السطر الثاني والثالث بينهما علقة‪،‬عندما تستخدم مجموعة أو قائمة في يسار علمة يساوي =تقوم‬ ‫بايثون بعملية مزاوجة من جهة اليمين بحيث تسند كل عنصر من اليسار مع ما يقابله من ناحية‬ ‫اليمين بالترتيب من اليسار إلى اليمين‪ ،‬على سبيل المثال في السطر الثاني العنصر ‪spam‬‬ ‫أسندت إلية القيمة '‪. 'yum‬‬ ‫اﻹسناد متعدد اﻷهداف‬ ‫في السطر اﻷخير كان هناك أكثر من هدف‪،‬قامت بايثون بإسناد مرجع إلى نفس الكائن إلى جميع‬ ‫اﻷهداف من ناحية اليسار‪ ،‬في السطر اﻷخير من الجدول الكائن ‪ spam‬و ‪ ham‬أسندا‬ ‫إليهما نفس القيمة وهي '‪ ،'lunch‬وهذه النتيجة تعادل ولو أننا أسندنا قيمة في كل مرة إلى‬ ‫هدف واحد‪.‬‬ ‫المثال التالي يوضح أكثر عملية اﻹسناد المتعدد‪:‬‬ ‫‪> > > nudge = 1‬‬ ‫‪> > > wink = 2‬‬ ‫‪> > > A, B = nudge, wink‬‬ ‫‪# tuples‬‬ ‫‪> > > A, B‬‬ ‫)‪(1, 2‬‬ ‫]‪> > > [C, D] = [nudge, wink‬‬ ‫‪# lists‬‬ ‫‪> > > C, D‬‬ ‫)‪(1, 2‬‬ ‫‪> > > nudge, wink = wink, nudge‬‬ ‫‪# tuples: swaps values‬‬ ‫‪> > > nudge, wink‬‬ ‫;‪# same as T=nu dge; nudge = wi nk‬‬ ‫‪wink =T‬‬ ‫)‪(2, 1‬‬

‫قواعد تسمية المتغيرات‪:‬‬ ‫اﻵن وبعد أن تكلمنا عن قضية اﻹسناد في بايثون‪ ،‬نريد أن نتوسع في قضية تسمية المتغيرات التي‬ ‫سنسند إليها القيم ونفهم قواعدها‪ .‬في بايثون أسماء المتغيرات تنشأ عندما نسند إليها‬ ‫القيمة‪،‬ولكن هناك قواعد تحكم اختيار السم أيضا‪ ،‬وهي مشابهة لقواعد لغة السي وهي‪:‬‬ ‫–اسم المتغير يجب أن يبدأ بحرف أو شرطة سفلية‬

‫اسم المتغير يجب أن يبدأ بحرف أو شرطة سفلية فقط ويمكن بعد ذلك أن يتبعه أي عدد من‬ ‫‪41‬‬

‫اﻷحرف أو اﻷعداد أو شرطة سفلية ‪،‬على سبيل المثال‪:‬‬ ‫أسماء صحيحة‪spam _spam Spam :‬‬ ‫أسماء غير صحيحة‪1spa m :‬‬ ‫ويجب أن ل يحتوي السماء على هذه اﻷحرف ‪!#@$ :‬‬ ‫–بايثون حساسة لحالة اﻷحرف‬

‫بايثون حساسة لحالة الحروف مثل السي بالضبط فالمتغير ‪ omlx‬يختلف عن المتغير‬ ‫‪ Omlx‬فكن منتبها لهذه النقطة‬ ‫–الكلمات المحجوزة‬

‫هناك كلمات معينة في لغة بايثون محجوزة ول يمكن أن تسمى متغيرك بها‪ ،‬وإذا سميت بها‬ ‫متغيرك تعطيك اللغة تحذيرا ‪،‬وإذا اضطررت إلى أن تسمي بها فغير حالة الحروف فقط أو‬ ‫حرف معين مثل ‪ class‬ل يمكنك التسمية بها ولكن ‪ Class‬أو ‪ klass‬يمكنك‪،‬‬ ‫والكلمات المحجوزة موضحة في الجدول التالي‪:‬‬ ‫‪break‬‬

‫‪assert‬‬

‫‪and‬‬

‫‪except‬‬

‫‪else‬‬

‫‪elif‬‬

‫‪del‬‬

‫‪def‬‬

‫‪global‬‬

‫‪from‬‬

‫‪for‬‬

‫‪finally‬‬

‫‪exec‬‬

‫‪in‬‬

‫‪import‬‬

‫‪if‬‬

‫‪pass‬‬

‫‪or‬‬

‫‪not‬‬

‫‪while‬‬

‫‪try‬‬

‫‪retur n‬‬

‫‪continue‬‬

‫‪lambda‬‬ ‫‪raise‬‬

‫‪class‬‬

‫‪is‬‬ ‫‪print‬‬

‫قبل أن نتحرك عن هذه النقطة‪ ،‬نريد أن ننوه بالفرق بين اﻷسماء و الكائنات في بايثون‪ ،‬كما رأينا‬ ‫سابقا في الفصل الثاني أنواع الكائنات في بايثون ورأينا أن هناك كائنات ثابثة و أخرى غير ثابتة‪.‬‬ ‫أما اﻷسماء من ناحية أخرى فهي فقط مجرد مراجع تؤشر إلى الكائنات ول ترتبط بنوع الكائنات‬ ‫بل تستطيع أن تؤشر إلى أي نوع من الكائنات وبنفس السم فهي غير ثابتة ‪،‬انظر المثال التالي‪:‬‬ ‫‪>>> x = 0‬‬ ‫‪# x boun d to an integer object‬‬ ‫"‪> > > x = "Hello‬‬ ‫‪# now it's a string‬‬ ‫‪> > > x = [1, 2, 3] # and now it's a list‬‬

‫وكما نرى فإن المثال اﻷخير يوضح لنا مميزات اﻷسماء في بايثون بشكل عام‪.‬‬

‫‪42‬‬

‫‪Print‬‬ ‫التعبير ‪ print‬بكل بساطة هو التعبير الذي يطبع الكائنات‪،‬من الناحية التقنية يقوم هذا التعبير‬ ‫بكتابة التمثيل النصي للكائن ويرسله إلى الخرج القياسي للبرنامج‪ .‬والخرج القياسي غالبا ما‬ ‫يكون النافذة التي بدأ تنفيذ برنامج بايثون بها‪ ،‬إل إذا تم إرسال النتائج الخرج إلى ملف‬ ‫باستخدام أوامر الشل‪.‬‬ ‫في الفصل الثاني رأينا دوال الكائن الملف التي تكتب إلى الملف ‪، write‬التعبير ‪print‬‬ ‫مشابهة إليها ولكن بتركيز أكثر‪ :‬التعبير ‪ print‬يقوم بكتابة الكائنات إلى الخرج القياسي‬ ‫‪ ،stdout‬أما الدالة ‪ write‬تقوم بكتابة السلسل النصية إلى الملف‪،‬ومنذ أن توفر الخرج‬ ‫القياسي في بايثون ككائن ‪ stdout‬في وحدة ‪ sys‬يمكنك أن تحاكي التعبير ‪ print‬باستخدام‬ ‫دالة كتابة الملفات ‪( write‬انظر اﻷمثلة التالية) ولكن استخدام ‪ print‬أسهل بكثير‪.‬‬ ‫الجدول التالي يوضح صيغ التعبير ‪:print‬‬ ‫تفسيرها‬

‫العملية‬ ‫‪print spam, ham‬‬

‫طباعة الكائنات إلى ‪ sys.stdou t‬وإضافة‬ ‫بينهما فراغ‬

‫‪print spam, ham,‬‬

‫نفس السابق ولكن بدون إضافة سطر‬ ‫جديد في النهاية‬

‫بشكل افتراضي يقوم التعبير ‪ print‬بإضافة فراغ بين الكائنات التي تفصل بينهما فاصلة مع إضافة‬ ‫علمة نهاية السطر في نهاية السطر من الخرج‪.‬لتجاوز علمة نهاية السطر (وبالتالي يمكنك إضافة‬ ‫نصوص أخرى في نفس السطر لحقا) أنه تعبير ‪ print‬بإضافة فاصلة ‪،‬مثلما يظهر في السطر‬ ‫الثاني من الجدول السابق‬

‫‪43‬‬