# برمجة بايثون

<< لغات البرمجة الحاسوبية

## مقدمة

لغة بايثون Python لغة برمجة من مستوى عال, مفتوحة المصدر و متعددة الاستعمالات تم تطويرها من قبل جيدو فان روسم Guido Van Rossum في عام 1993, وهو كالتطبيقات والبرامج المفتوحة المصدر, مدعوم بفريق من المطوريين المنتشرين حول العالم. انشئت اللغة كـ Object-Oriented Programming أو برمجة كائنية التوجه. من بين الأسباب الأخرى, نذكر سرعة التطوير (ميزة مهمة للبرامج المؤولة), الكمية الكبيرة من القوالب المرفقة في التوزيعة الأساسية بالإضافة لعدد الواجهات المتاحة مع مكتبات مكتوبة ببرمجة سي, برمجة سي++ أو Fortran. كما يتميز بسهولة ووضوح لغته, عكس لغة Perl. تتميز بالسهولة من حيث الكتابة والقراءة ومن حيث التركيب النحوي لها،وهي لغة ذات قوة هائلة تخولك باحترافها ان تصمم موقعك الخاص أو برنامجك الخاص ويكون مفتوح المصدر هو أفضل مافيها بانها مفتوحة المصدر وتستطيع أن تبرمج بها في كل المنصات المعروفة الآن، فهي تصارع لغة Java العريقة، وتصلح لكل الأغراض تقريبا.
ملاحظات حول الكتاب: هذا الكتاب مفتوح (حر) خاضع لرخصة GNU FDL (أي GNU Free Documentation License) نسخ أو تصوير أو الإقتباس من هذا الكتاب لا يعد مخالفاً للقانون إذا حصلت عليه بأي طريقه (شراء أو هدية أو استعارة أو تنزيل من الشبكة ...) فإنه يحق لك نسخه والتعديل فيه ، ويمكنك تنزيله مجاناً. ولكن إذا استخدمته في عمل منتج مشتق فإنه يصبح خاضعاً لرخصة FDL كما لا يمكنك الإدعاء بأنك من قام بهذا العمل وعليك الإشارة لمؤلفه الأصلي يقدم هذا الكتاب كما هو من دون أي كفالة أو ضمان لمحتوياته لسنا مسؤولين عن أي أثر سلبي (لا بشكل مباشر ولا ضمني) يقع عليك وعلى جهازك أو على قطتك. كتب هذا الكتاب على منصة أرابيان 0.6 باستخدام برنامج OpenOffice.org 2.0 لذا إذا حاولت فتحه على منصة الويندوز فلربما يذهب التنسيق، فحاول أن تعدل عليه في المنصة التي أنشأ فيها لتجنب إعادة الجهد من جديد.

### استعمال

كما تمت الإشارة له في الأعلى, بايثون يستعمل في عدد كبير من المهام. التوزيعة الأساس تتيح, من حين لحين, تطويرا شبكيا, إنشاء واجهة رسومية (مرورا ب tcl/tk), البرمجة cgi, من معالجة XML, إلخ... سهولتها النسبية الواجهية مع مكتبات مكتوبة بلغات أخرى جعلتها أداة اختيار للتطبيقات الحسابات العلمية. كما أنها تستعمل بكثرة كلغة بروتوتيب.
تستخدم أيضا في تطبيقات معالجة اللغات الحية ولها نصيب الاسد في هذا النوع من التطبيقات نظرا لسهولة تعاملها مع هياكل البيانات ومرونتها في اجراء العمليات عليها.

## الوحدة الأولى : أساسيات Python

* الفصل الأول : البداية
* الفصل الثاني: الأنواع والعمليات
* الفصل الثالث: التعابير الأساسية
* الفصل الرابع: الوظائف
* الفصل الخامس: الوحدات
* الفصل السادس: الصفوف
* الفصل السابع:الاستثناءات

## الفصل الأول : البداية

* النقاط المهمة:
** لماذا لغة Python ؟
** كيف تشغل برنامج مكتوب بلغة Python؟
** معرفة بيئات التطوير الخاصة بـPython
في هذا الفصل سنمضي سويا في رحاب لغة بايثون، لنعرف كيف نشأة لغة بايثون؟ ولماذا نتعلم لغة بايثون؟ وما مجالات التي تصلح لها لغة بايثون؟ كل هذه الأسئلة ضرورية لمن يريد أن يبدأ في تعلم أي لغة ! ، فلننتقل سريعا ... لماذا لغة Python ؟
في عام ١٩٩٠م قام Guido van Rossum باختراع لغة بايثون، وقد استقى هذه اللغة من عدة لغات سابقة من أمثال: C و++C وModula-3 وABC وIcon.
وتعتبر بايثون من اللغات النصية التي لا تحتاج إلى بناء لتشغيل البرنامج المكتوب بها، وهي من اللغات السهلة والمنظمة بشكل صارم مما أهلها أن تكون الخيار الأول في صنف اللغات الأكاديمية التي تعتمد في الجامعات، وسنلخص مميزات لغة بايثون في جدول ونبين فائدة كل مميزة .. المميزات الفوائد
* لا تحتاج إلى بناء أو ربط مثل لغة السي
* تسريع دورة التطوير فيها بشكل ملحوظ
* لا تحتوي على أنواع المتغيرات
* البرامج تصبح أسهل وأبسط وأكثر مرونة
* إدارة آلية للذاكرة
* مجمع النفايات يجنبك الجهد في تنقيح الكود
* برمجة غرضية التوجه
* يمنحك التكامل مع ++C وJava وCOM
* إمكانية التضمين والتمدد مع لغة السي
* تحسين الأداء وإمكانية التحاور مع النظام
* البساطة والوضوح في قواعد الكتابة والتصميم
* درجة عالية من المقروئية وإمكانية الصيانة وسهولة التعليم
* محمولية عالية
* تعمل على عدة منصات: الويندوز واللينكس والماكنتوش واليونكس بدون تغيير الكود
* مفتوحة المصدر
* تعطيك الحرية في توزيعها والتعديل فيها وضامن لبقائها
* دعم أنواع البيانات والعمليات عالية المستوى
* تطوير سريع باستخدام أنواع الكائنات المدمجة
* تحميل ألي لوحدات السي
* امتدادات مبسطة وتصغير الملفات التنفيذية
* دعم بروتوكولات الإنترنت القياسية
* تسهيل الوصول إلى البريد الإلكتروني وHTTP ..
* كثرة المكتبات المضمنة ومن أطراف ثالثة
* تسريع وتسهيل تطوير البرامج
و أهم مميزاتها أنها سهلة التعلم ، وهذا ما ستلحظه أثناء تعلمك لها مع قوتها في آن واحد مما جعلها الخيار الأمثل لكثير من الشركات، وسنذكر مجموعة منها: Yahoo Maps* Yahoo Groups* Google* Ultraseek* Jasc Software, Paint Shop Pro* National Weather Service* NASA* Red Hat * SGI, Inc* IBM* Real Networks*

### ما مجالات لغة بايثون ؟

باختصار شديد، بايثون خاضت جميع المجالات التي تتطلب سرعة التطوير والسهولة في المجال الأول، وتأخرت قليلا في المجالات التي تحتاج إلى سرعة التطبيق، فمن المجالات التي تتميز فيها لغة بايثون:
* مجال الأدوات التي تتعامل مع النظام مباشرة
* مجال برمجة الإنترنت
* مجال برمجة واجهات المستخدم الرسومية
* مجال برمجة قواعد البيانات
* مجال البرمجة الموزعة
وغيرها الكثير من المجالات، مما سهَّل لها وجود أدوات كثيرة تسهل عمل المبرمج بشكل ملاحظ، فمن أشهر هذه الأدوات: المجال
الأدوات
* برمجة النظام
Sockets وthreadsو signals وpipes وRPC calls وPOSIX bindings
* واجهات المستخدم الرسومية
Tk وPMW وMFC وX11 وwxPython وKDE وGnome
* واجهات قواعد البيانات
Oracle وsybase وPostGresو mSQL وpersistence وdbm
* أدوات Microsoft Windows
MFC وCOM وActiveX وASP وODBC و.NET
* أدوات الانترنت
Jpython وCGI tools وHTML/XML parsers وemail tools وZope
* الكائنات الموزعة
DCOM وCORBA وILU وFnorb
* أدوات أخرى مشهورة
SWIG وPIL وregular expressions وnumPy وcryptography

## كيف تشغل برنامج مكتوب بلغة بايثون؟

بما أن لغة بايثون نصية ، فإنه يتوجب عليك أن يكون لديك مفسر اللغة فقط لتشغيل البرنامج، وللحصول على المفسر اذهب إلى موقع لغة بايثون ، ونزل المفسر حسب النظام الذي تعمل عليه : http://www.python.org
بطبيعة الحال لكتابة برنامج بايثون ستحتاج إلى محرر نصوص ثم حفظ الملف بلاحقة py. بعد ذلك ادخل على سطر الأوامر واكتب: >> python program.py
بحيث program اسم الملف، وللتعامل مباشرة مع محث لغة بايثون ، اكتب في سطر الأوامر : >> python
و لكتابة أول برنامج لك ، اكتب :
>>> print ' My name is Fahad Al-Saidi'
بعد كتابتك لأول برنامج لك بواسطة بايثون، ستعرف بنفسك مدى سهولة بايثون وقوتها.
بيئات التطوير الخاصة بـPython سترغب مع الوقت في امتلاك بيئة تطوير تسهل عليك أداء الكثير من العمليات الروتنية، وهناك الكثير من بيئات التطوير الخاصة بلغة بايثون ، ما عليك إلا أن تختار حسب رغباتك ، فقط تابع هذين الرابطين : http://wiki.python.org/moin/PythonEditors http://wiki.python.org/moin/IntegratedDevelopmentEnvironments
و لكن يكفيك أن تملك مفسر لغة بايثون مع محرر نصوص عادي لتكمل مشوارك معنا في تعلم لغة بايثون.
* اغلب توزيعات غنوا لينوكس تأتي مدمجة بلغة python خاصة الإصدار الثاني من اللغة كما أن أغلب محررات النصوص تدعم بايثون من حيث تلوين الدوال مثل gedit على واجهة غنوم ,و kwrite على واجهة كيدي كما توجد برامج تحرير بواجهة رسومية وهي برنامج idle وبرنامج eric وفي الويندوز هناك محررات تدعم خاصية التلوين مثل edit plus3 وnotpad++
وللبدء في استخدام برنامج بايثون قم بفتح سطر الاوامر واكتب python وستجد بين يديك مفسر هذه اللغة لكن في هذه اللحظة انت تتعامل الواجهة التفاعلية للبايثون مباشرة إذا اردت حفظ برامجك عليك بفتح idle أو أي محرر ثاني وفيه تكتب السكريبت وبعد ما تنتهي احفظه بلاحقة .py حتى تستطيع استعماله مرة أخرى ويمكنك ان تناديه في برامج أخرى كانه مكتبة داخلية ب import كما بإمكانك كتابة برامج بمحررات النصوص الأخرى المذكورة بالاعلى وستجدها في الغالب على القائمة الرئيسية وداخل قسم تطوير.

## الفصل الثاني: الأنواع والعمليات

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

### بنية برنامج بايثون

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

### لماذا نستخدم الأنواع المدمجة؟

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

### نوع الكائن

مثال عليه :
الأعداد Numbers 3.1415, 1234, 999L, 3+4j سلاسل نصية Strings 'spam', "guido's" قوائم Lists [1, [2, 'three'], 4] قواميس Dictionaries {'food':'spam', 'taste':'yum'} المجموعات Tuples
الملفات Files text = open('eggs', 'r').read

### الأعداد

تدعم لغة بايثون تشكيلة واسعة من أنواع الأعداد : الأعداد الصحيحة وعدد حقيقي يحوي فاصلة، وهذا مألوف لمن تعامل مع لغات سابقة، وأيضا تدعم أنواع مركبة من الأعداد مثل الأعداد المركبة والأعداد ذات دقة الفاصلة العائمة غير محدود وتشكلية واسعة من الأدوات و فيما يلي سنشرح النوعين: أنواع الأعداد القياسية: بايثون تدعم الأنواع القياسية في بقية اللغات وأتت بأنواع جديدة وفي ما يلي جدول يبين تلك الأنواع مع أمثلة لكل نوع: النوع تفسيره 1234, -24, 0 Normal integers (C longs) 999999999999L
1.23, 3.14e-10, 4E210, 4.0e+210
0177, 0x9ff
3+4j, 3.0+4.0j, 3J
الأعداد الصحيحة والاعداد الحقيقية الأعداد الصحيحة هي مجموعة من الأعداد العشرية مثل (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 معامل المنطقي "و" 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 ، لكي نطبق عليه معاملات ، في اللغات الأخرى ستحتاج إلى ذكر نوع الكائن ثم تسميته ثم إسناد قيمة إليه لكي نتعامل معه، ولكن في بايثون فقط سم الكائن ثم أسند إليه قيمه وتتولى الباقي بايثون للتعرف على نوعه ، وهذا بشكل عام في كائنات بايثون يكفي فقط اسناد القيمة إلى الكائن لتعريف بنوعه. لتطبيق ذلك عمليا ،اكتب التالي في سطر الأوامر : % python >>> a = 3 # name created >>> b = 4
وبهذا نكون قد أنشأنا كائنين من فئة الأعداد وأسندنا إليهما قيمتين ، ولعلك لاحظت كيفية إضافة التعليقات في بايثون فكل ما بعد # فهو تعليق ، وللتعليق أهمية كبرى في توضيح الكود وسهولة قراءته وسهولة تطويره من قبل مطورين آخرين. بعد إنشاء الكائنات ستحتاج إلى تطبيق بعض المعاملات ، وكلما كانت المعاملات بين الأقواس كلما كانت الأمور أوضح ، ولكن هذا لا يعني أن المعاملات لا تعمل بدون الأقواس، ولكن انتبه إلى أسبقية المعاملات على حسب ما ذكر سابقا ، وإليك بعض الأمثلة :
>>> b / 2 + a # same as ((4 / 2) + 3) 5 >>> b / (2.0 + a) # same as (4 / (2.0 + 3)) 0.8
فكما هو واضح في المثال الأول أن بايثون تولت ترتيب المعاملات في الأقواس، وبما أن المعامل القسمة أسفل من معامل الجمع فهو مقدم ، ولكن في المثال أضفنا إلى التعبير قوسين فأجبرنا بايثون على تنفيذ المعاملات التي نريد تقديمها أولا ، وفي النهاية يجب مراعاة مثل هذه الأمور عند كتابة برامجك في لغة بايثون. ولعلك تسأل ما فائدة إضافة النقطة العائمة في المثال الثاني ، سأقول لك جرب تنفيذ المثال بدون إضافة النقطة العائمة وستجد أن النتيجة هي 0 ، ماذا حصل؟ لقد تعاملت بايثون على أنه عدد صحيح، ولكن عندما تكتب النقطة العائمة فإنك تخبر بايثون أني أريد النتيجة كما هي بدون تقريب وكذلك إذا أضفت صفرين ستلاحظ النتيجة بنفسك. معاملات على مستوى البت: ستحتاج إلى التعامل على المستوى البت في بعض الأحيان فيجب عليك أن تعرف العد الثنائي أولا وستتضح لك الأمثلة التالية :
>>> x = 1 # 0001 >>> x << 2 # shift left 2 bits: 0100 4 >>> x | 2 # bitwise OR: 0011 3 >>> x & 1 # bitwise AND: 0001 1 إذا لم تفهم ولم تدرس الأعداد الثنائية ، فلا عليك ، استمر ، وستجد أنه هذه الجزئية لا يحتاجها إلا من يطلبها !! الأعداد المركبة : الأعداد المركبة من تخصصات الهندسة والكهرباء ، كشخص لا تخصص عندك في مثل هذه الأمور ،مر على هذه الجزئية مرور الكرام ، لأنك لكي تفهمها ستحتاج إلى أكثر من فصل دراسي ، ونحن نريد أن نوصلك إلى فهم البرمجة باستخدام الباثون في وقت قياسي ، أما إذا كان هذه الأعداد من لب تخصصه فإنك ستجد بايثون توفر لك الكثير ، فانظر إلى هذه الأمثلة:
>>> 1j * 1J (-1+0j) >>> 2 + 1j * 3 (2+3j) >>> (2+1j)*3 (6+3j)
للاستزاده في هذا المجال راجع وثائق بايثون للمزيد من التفصيل. المزيد من الأدوات : توفر لك بايثون عدة أدوات تتعامل مع الرياضيات ، وتقدم وحدة math التي تتعامل مع جميع قوانين الرياضيات ، ولكن يجب عليك أن تستورد هذه الوحدة ، وإليك المثال:
>>> import math >>> math.pi 3.14159265359 >>> >>> abs(-42), 2**4, pow(2, 4) (42, 16, 16)
و سنتكلم عن وحدات بشيء من التفصيل في الفصول القادمة بإذن الله تعالى .
و الجدول التالي يعرض بشكل سريع كيفية إنشاء السلاسل النصية وبعض دوالها : العملية شرحهايسثلريبربؤلا بؤ 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 الحلقة تكرارية العضوية لاحظ أنه لا فرق بين علامة الاقتباس المفردة والمزدوجة ، فكلهن يؤدين العمل نفسه، ولك حرية الاختيار.
العمل على السلاسل النصية كما مر عليك أن إنشاء كائن من السلاسل النصية يكفي له أن تذكر اسمه وتسند له قيمة من نوع السلاسل النصية ، وقد مر عليك ثلاثة أمثلة في الجدول السابق، فدعنا نستكشف الجوانب الأخرى.. العمليات الأساسية لقد مر عليك المعامل الجمع + ومعامل الضرب * وعرفت كيف التعامل معها في كائنات الأعداد ، أما كائنات السلاسل النصية فهي تعامل الجمع كإضافة والضرب كتكرار للنص ، ولكن يشترط في معامل الجمع، أن يكون كلا الطرفين سلاسل نصية. وتزودنا بايثون بدالة تحسب لنا طول السلسلة النصية وهي الدالة len وهي مدمجة مع اللغة لا تحتاج إلى استيراد ، وهذه بعض الأمثلة: % python >>> len('abc') # length: number items 3 >>> 'abc' + 'def' # concatenation: a new string 'abcdef' >>> 'Ni!' * 4 # like "Ni!" + "Ni!" + ... 'Ni!Ni!Ni!Ni!'
سنأتي الآن إلى عمل حلقة تكرارية في السلسلة النصية وذلك باستخدام for واختبار العضوية باستخدام in : >>> myjob = "hacker" >>> for c in myjob: print c, # step though items ... h a c k e r >>> "k" in myjob # 1 means true 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 بأنه سلسلة نصية وأسندنا إليه قيمة معينة ، ثم قمنا بعملية الفهرسة من البداية ومن النهاية ، فـ[0]S تعني أظهر الحرف الذي فهرسته 0 والناتج كان s ، و[2-]S تعني أظهر الحرف الذي فهرسته 2 من الأخير. بعد ذلك قمنتا بعملية التقطيع باستخدام المفهرس فـ[1:3]S تعني اجلب من الحرف الأول فما أعلى ولكن لا تجلب الحرف الثالث وما فوقه ، أما[:1 ]S فتعني اجلب من الحرف الأول فما فوقه إلى النهاية ، أما [1-:]S فتعني اجلب كل السلسلة ماعدا الحرف الأخير تهيئة السلاسل النصية إذا كان عندك سلسلة طويلة وأردت أن تضيف إليها كائنات متغيرة فهناك عدة طرق، ولكن بايثون توفر لك طريقة تستعملها لغة السي بشكل كبير ،ولغة #C حديثا ، انظر المثال التالي:
>>> S = 'spam'  >>> S[0] = "x"   Raises an error!
>>> S = S + 'Spam!' # to change a string, make a new one >>> S 'spamSpam!' >>> S = S[:4] + 'Burger' + S[-1] >>> S 'spamBurger!' >>> 'That is %d %s bird!' % (1, 'dead') # like C sprintf That is 1 dead bird!
لاحظ أن بايثون إعادة تعريف المعامل % ليعمل مع السلاسل النصية ، وعند الأعداد كباقي القسمة، كما قلنا سابقا أن السطر الأخير استخدم هيئة السي في ترتيب النص وخاصة الدالة sprintf وأخذ كل قواعدها، وهي بسيطة تعني ما كل على اليسار يساوي ما على اليمين على الترتيب ، وإليك أمثلة أكثر على هذه التهيئة: >>> exclamation = "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 % الفاصلة العائمة الهيئة 1 Floating-point %e حروف Character %c الفاصلة العائمة الهيئة 2 Floating-point %E عدد عشري Decimal %d الفاصلة العائمة الهيئة 3 Floating-point
عدد صحيح Integer %i الفاصلة العائمة الهيئة 4 Floating-point
Unsigned (int) %u الفاصلة العائمة الهيئة 5 Floating-point
عدد ثماني Octal integer %o
عدد ستعشري Hex integer %x

### الأدوات العامة لسلاسل النصية

كما قلنا سابقا بايثون تزودنا بوحدات خاصة للتعامل مع السلاسل النصية، ولعل أشهر واحدة وأقواها هي string . فهي تزودنا بالعديد من الدوال فمنها القدرة على تحويل الحروف من الكبيرة إلى الصغيرة والعكس ،وكذلك البحث في السلاسل المعرفة ، وكذلك تحويل السلسلة النصية إلى عدد ، وغيرها الكثير ، راجع وثائق بايثون للمعرفة جميع الأدوات، وهذا مثال على قدرة وحدة string:
>>> import string # standard utilities module >>> S = "spammify" >>> string.upper(S) # convert to uppercase 'SPAMMIFY' >>> string.find(S, "mm") # return index of substring 3 >>> string.atoi("42") # convert from/to string 42 >>> string.join(string.split(S, "mm"), "XX") 'spaXXify'
لعل المثال الأخير وهو الأكثر تعقيدا،فهو سهل الفهم فكل ما في القضية أن الدالة split قامت بتجزئة السلسلة إلى قسمين عند الحرف mm ، ثم قامت الدالة join بدمج XX بين القسمين السابقين ، يمكنك تجربة كل دالة واحدة ومعرفة كيفية عملها. لاحظ أن الدالة atoi تقوم بتحويل السلسلة النصية إلى عدد فقط ، ولكن توجد دالة أخرى مدمجة تسمى eval تقوم بتحويل السلسلة النصية إلى أي نوع ولكنها أبطأ بطبيعة الحال من الدالة الأولى. الاختلافات في كتابة السلسلة النصية في نهاية كلمنا عن السلاسل النصية ، سنتكلم عن أحرف الهروب التي بها تستطيع أن تنسق النص بشكل جيد ، مثل حرف بداية السطر وغيرها والجدول التالي يبين لك هذه الأحرف في بايثون: \newline الاستمرار \n سطر جديد \\ إظهار \
Tab عمودية \' إظهار علامة اقتباس واحدة
Tab رأسية \" إظهار علامة اقتباس مزدوجة \r العودة إلى بداية السطر Carriage return \a جرس
صفحة جديدة Formfeed \b مفتاح الحذف الخلفي Backspace
Octal value XX \e زر الهروب Escape
Hex value XX \000 Null عدم إنهاء السلسلة
أي حرف آخر

### القوائم

نكمل مشوارنا في غمار لغة بايثون ونصل إلى كائن يعتبر أكثر الكائنات المدمجة مرونة وترتيب ألا وهو القائمة list ، تمتاز القوائم عن السلاسل النصية أنها تستطيع أن تجمع في ضمنها عدة كائنات وليست النصوص فقط ، فالقائمة يمكن أن تكون من سلسلة نصية وأعداد وكائنات أخرى حتى قوائم أخرى. وتقوم القائمة مقام بنى المعطيات في اللغات الأخرى مثل لغة السي والجافا،وتتميز القوائم في بايثون بعدة مميزات منها: مجموعة مرتبة من كائنات غير متجانسة من الناحية الوظيفية، القائمة مكان للتجميع الكائنات لذا يمكنك أن تنظمهم كمجموعة والقائمة أيضا تقوم بترتيبهم من اليسار إلى اليمين . الوصول باستخدام المفهرس مثل السلاسل النصية تستطيع أن تصل إلى أعضاء القائمة باستخدام المفهرس، وإجراء عملية التقطيع والسلسلة. مرونة عالية تتمتع القوائم بمرونة عالية أكبر من مرونة السلاسل النصية، بحيث يمكن أن تكبر وتصغر حسب متطلبات برنامجك، ويمكنك وضع قوائم في قوائم بحيث تصير متشابكة. مصفوفة من الكائنات المرجعية من الناحية التقنية تعتبر القوائم نوع خاص من المصفوفات في لغة السي،وهي من هذه الناحية عبارة عن كائنات مرجعية، ونقصد هنا بقولنا مرجعية ، أي عندما نتعامل معها ب can't read superblockعد تعريفها فإننا نتعامل مع مؤشر يؤشر إلى الكائن وليس نسخة عنه، وهذا يعطينا سرعة أكبر ويسهل علينا البرمجة. الجدول التالي يوضح أهم عمليات القوائم: العملية الوصف L1 = قائمة فارغة L2 = [0, 1, 2, 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.append(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) إنشاء قوائم أو مجموعات من الأعداد
ستلاحظ أنك قد رأيت معظم العمليات التي ذكرت في الجدول السابق قد مرت عليك في السلاسل النصية ، إلا بعض العمليات التي تدعمها القوائم ولا تدعمها السلاسل النصية مثل إسناد الفهرس وإسناد المقاطع والتوسع والانكماش. العمل على القوائم أفضل طريقة لفهم القوائم هي العمل عليها،ومرة أخرى سنأخذ العمليات التي ذكرت في الجدول السابق ونحاول أن نشرحها بشيء من الأمثلة العملية. العمليات الأساسية القوائم تدعم معظم العمليات التي تدعمها السلاسل النصية وإليك المثال التالي : % python >>> len([1, 2, 3]) # length 3 >>> [1, 2, 3] + [4, 5, 6] # concatenation [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!']

### الإسناد في القوائم

الأشياء التي أتت بها القوائم وتعتبر متميزة عن السلاسل النصية هي المقدرة على إسناد قيم جديدة إلى الفهارس والمقاطع في القوائم وذلك بخلاف السلاسل النصية التي تحتاج لفعل ذلك إلى إنشاء نسخة جديدة من الكائن. عند استخدام القوائم تستطيع تغيير المحتوى باستخدام الفهرس أو المقطع كما يبين ذلك المثال التالي : >>> L = ['spam', 'Spam', 'SPAM!'] >>> L[1] = 'eggs' # index assignment >>> L ['spam', 'eggs', 'SPAM!'] >>> L[0:2] = ['eat', 'more'] # slice assignment: delete+insert >>> L # replaces items 0,1 ['eat', 'more', 'SPAM!'] مع ملاحظة أن بايثون حين تقوم بالإسناد إلى القوائم عن طريق المقاطع ، فإنها أولا تقوم بحذف المقطع المختار ثم تضع القيمة الجديدة مكانه ولو كانت القيمة أكثر من كائن واحد، على سبيل المثال عندنا قائمة L تساوي [1, 2, 3] فعند تطبيق عملية الإسناد باستخدام المقطع التالي L[1:2] = [4, 5] فإن النتيجة ستكون [1, 4, 5, 3]. القوائم تدعم بعض الدوال منها توسيع والترتيب والبحث والعكس وإليك المثال التالي: >>> L.append('please') >>> L ['eat', 'more', 'SPAM!', 'please'] >>> L.sort >>> L ['SPAM!', 'eat', 'more', 'please'] >>> L.reverse >>> L ['please', 'more', 'eat', 'SPAM!'] >>> L.index('eat') 2 وأخيرا بما أن القوائم عبارة عن سلسلة مرنة ، فإنها تدعم الحذف باستخدام الفهرس أو المقطع، وذلك عن طريق الاسناد إلى قائمة فارغة أو الحذف عن طريق الفهرس أو المقطع :
>>> 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']

### القواميس

بالأضافة إلى القوائم تعتبر القواميس من أهم الكائنات المدمجة المرنة في لغة بايثون،وإذا كنا اعتبرنا أن القوائم عبارة عن مجموعة من الكائنات المرتبة ، فإن القواميس بعكس ذلك فهي مجموعة من الكائنات غير المرتبة، ويعتبر الشيء الرئيسي في القوائم الذي يقوم عليه ترتيب وإحضار عناصر القاموس هو المفتاح وليس موقع العنصر. وكما تلاحظ فإن القواميس استطاعت استبدال الكثير من خوارزميات وبنى المعطيات التي ستضطر إلى استخدامها يدويا في بعض اللغات منخفضة المستوى، وأيضا تستخدم القواميس في بعض الأحيان لأداء عمل الجداول في بعض اللغات منخفضة المستوى. وتتميز القواميس بعدة خصائص منها: الوصول باستخدام المفتاح وليس الموقع القواميس في بعض الأحيان يطلق عليها المصفوفات المترابطة،هذا الترابط يضع القيم باستخدام المفاتيح، وباستطاعتك إحضار أي عنصر في القاموس باستخدام المفتاح الذي خزن به، ستستخدم نفس عمليات الفهرس ولكن باستخدام المفتاح وليس باستخدام الموقع. مجموعة غير منظمة من كائنات غير متجانسة بخلاف القوائم، العناصر في القواميس لا تبقى على ترتيب معين،في الحقيقة بايثون تقدم ترتيب عشوائي يضمن تقديم مشاهدة سريعة، المفاتيح تقدم راوبط (غير فيزيائية) إلى أماكن العناصر في القواميس. خصائص مرنة مثل القوائم القواميس تزودك بميزة التوسيع والتقلص بدون إنشاء نسخة جديدة، وكذلك يمكنها تحتوي على عناصر من كل نوع،وكذلك ميزة التداخل بحيث يمكنك أن تنشأ قواميس في قواميس وكذلك يمكنك قوائم في قواميس،وأيضا يمكنك أن تسند قيم جديدة بالاعتماد على المفاتيح جداول من كائنات المرجعية إذا كنا قلنا أن القوائم عبارة عن مصفوفة من الكائنات المرجعية ، فإن القواميس عبارة عن جداول غير منظمة من الكائنات المرجعية. داخليا القواميس تستخدم جداول من بنى المعطيات تدعم ميزة الاسترجاع السريع وهي تبدأ صغيرة وتكبر حسب الطلب، وعلاوة على ذلك بايثون توظف خوارزميات محسنة لإيجاد المفاتيح مما يعطي الاسترجاع سرعة كبيرة. وعند التعمق نجد أن القواميس تخزن مراجع الكائنات وليس نسخ منها مثل القوائم بالضبط. الجدول التالي يوضح أهم العمليات الشائعة على القواميس، لاحظ أنها تشابه القوائم. تكتب القواميس على شكل التالي: key:value العملية الوصف D1 = { } قاموس فارغ d2 = {'spam': 2, 'eggs': 3}
d3 = {'food': قالب:'ham': 1, 'egg': 2
d2['eggs'], d3['food']['ham'] الفهرسة باستخدام المفتاح d2.has_key('eggs'), d2.keys, d2.values الدوال : دالة العضوية قائمة المفاتيح قائمة القيم len(d1) الطول (عدد الإدخالات المخزنة) d2[key] = new, del d2[key] الإضافة والتعديل الحذف

### العمل على القواميس

دعنا نرجع إلى المفسر لنأخذ حريتنا في تطبيق بعض العمليات التي ذكرت في الجدول السابق: العمليات الأساسية: بشكل عام ، يمكنك إنشاء قاموس والوصول إلى عناصره باستخدام المفتاح key ، والدالة len المدمجة تعمل أيضا مع القواميس، وهي ترجع عدد العناصر المخزنة في القاموس أو بمعنى آخر ترجع طول قائمة المفاتيح. وعند حديثنا عن المفاتيح فإن الدالة keys ترجع كل المفاتيح في القاموس مجموعة في قائمة، هذا يعتبر أداة قوية لمعالجة القواميس بشكل متسلسل، ولكن لا تعتمد عليه في ترتيب قائمة المفتايح ،(تذكر أن القواميس عشوائية). % python >>> d2 = {'spam': 2, 'ham': 1, 'eggs': 3} >>> d2['spam'] # fetch value for key 2 >>> len(d2) # number of entries in dictionary 3 >>> d2.has_key('ham') # key membership 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['brunch'] = 'Bacon' # add new entry >>> d2 {'brunch': 'Bacon', 'spam': 2, 'ham': ['grill', 'bake', 'fry']}
لاحظ هنا الطريقة في إنشاء مدخلة جديدة في القاموس المثال الأخير ، فهي تختلف عن طريقة إضافة مدخلة الجديدة في القوائم ، وذلك أن القواميس لا تعتمد على موقع بل على المفتاح فهي عشوائية ولا يهمها المكان، بعكس القواميس فهي تحتاج إلى الدالة append لإضافة مدخلة جديدة في القائمة. مثال واقعي سنأخذ هنا مثال أكثر واقعية وهو إنشاء جدول يحوي أسماء اللغات -ثلاث هنا- في العمود الأول -المفتاح- والعمود الثاني يحوي أسماء مؤلفيها – القيمة-،ركز في هذا المثال وحاول تطبيقه: >>> table = {'Python': 'Guido van Rossum', ... 'Perl': 'Larry Wall', ... 'Tcl': 'John Ousterhout' } ... >>> language = 'Python' >>> creator = table[language] >>> creator 'Guido van Rossum' >>> for lang in table.keys: print lang, '\t', table[lang] ... Tcl John Ousterhout Python Guido van Rossum Perl Larry Wall
لاحظ الأمر الأخير،لأن القواميس ليست متسلسلة فلا يمكن أن تكررها بشكل مباشر باستخدام for مثل السلاسل النصية أو القوائم. ولكن إذا أردت أن تعرض جميع عناصر القاموس، فقم أولا باستخدام الدالة keys لجلب قائمة المفاتيح في القاموس ثم كررها واعرض قيمتها باستخدام for ، إذا لم تكن تعرف for فلا تتضايق فسوف ندرسها بالتفصيل في الدروس القادمة. وهنا بعض الملاحظات يجب أن تتذكرها حول القواميس قبل أن ننتقل إلى الكائنات الأخرى: العمليات التي تعتمد على التسلسل لا تعمل مع القواميس مثلما رأينا في ===المثال الأخير=== عند إسناد قيمة جديدة فإنك تضيف مدخلة جديدة في القاموس ليس شرطا أن يكون المفتاح سلسلة نصية ، بل تعمل كل الكائنات ماعدا القوائم المجموعات آخر نوع في اسكشافنا لبايثون لأنواع المجمعات هي المجموعات،المجموعات تتركب ببساطة من مجموعة من الكائنات،وهي تعمل بالضبط مثل القوائم باستثناء أن القوائم لا يمكن أن تتغير من مكانها فهي ثابتة وتكتب عادة كعناصر متسلسلة محصورة بين قوسين وليس بين قوسين معكوفين مثل القوائم.والمجموعات تستمد معظم خصائصها من القوائم وهي: مجموعة منظمة من الكائنات مثل السلاسل النصية والقوائم المجموعات عبارة عن مجموعة من الكائنات المنظمة في نسق معين ومثل القوائم يمكن أن تحتوي على كل أنواع الكائنات الوصول باستخدام الموقع مثل السلاسل النصية والقوائم يمكنك الوصول إلى أي عنصر في المجموعة باستخدام موقعه وليس مفتاحه، والمجموعات تدعم كل العلميات التي تستخدم الموقع والتي سبق وأن أخذناها مثل الوصول باستخدام الفهرس والتقطيع. سلسلة ثابتة من الكائنات مثل السلاسل النصية المجموعات ثابتة ويعني ذلك أنها لا تدعم أي عملية تغيير في المكان (الاسناد) مثل التي رأيتها في القوائم، وهي أيضا لا تدعم التوسع والتقلص بل يجب لفعل ذلك إنشاء نسخة جديدة من المجموعة المراد تكبيرها أو تصغيرها. مصفوفة من الكائنات المرجعية مثل القوائم بالضبط، المجموعة عبارة عن مصفوفة من الكائنات المرجعية. الجدول التالي يوضح أهم العمليات على المجموعات، مع ملاحظة لكي تنشيء مجموعة فارغة فقط يكفي وضع قوسين فقط.
العملية الوصف مجموعة فارغة t1 = (0,) عنصر واحد في المجموعة t2 = (0, 1, 2, 3)
t2 = 0, 1, 2, 3 أربعة عناصر أيضا 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 التكرار العضوية
أربعة الصفوف الأولى في الجدول تستحق إيضاحا أكثر، بسبب أن الأقواس تستخدم في إغلاق المعاملات ( راجع الأعداد) فإنك تحتاج إلى شيء مميز لإخبار بايثون أن كائنا واحدا بين القوسين هو من فئة المجموعات وليس عبارة عن تعبير بسيط،بكل بساطة ضع فاصلة سفلية قبل إقفال القوسين، وبذلك تخبر بايثون أن ما بين القوسين هو عبارة عن مجموعة. وكحالة خاصة فإن بايثون تتيح لك الحرية في وضع الأقواس أو لا في إنشاء المجموعات كما في الصف الرابع، ولكن يفضل دائما إذا سمحت لك الفرص بأن تستخدم الأقواس لأنها تضمن لك عدم التشويش. في العمليات الأخيرة في الجدول السابق فهي مشابهة تماما لمثيلاتها على السلاسل النصية والقوائم فلذا لا يوجد داعي لشرحها مرة أخرى ، فقط يكفي أن تتطبقها أنت على مفسر بايثون للتأكد من فهمك لها. لماذا نستخدم المجموعات؟ أول سؤال يتبادر للمبتدئ لماذا نستخدم المجموعات إذا كان عندنا القوائم؟ قد يكون هذا تاريخيا ولكن أفضل إجابة أن ثبات المجموعات يوفر العديد من مميزات، مثلا يمكن باستخدام المجموعات التأكد أن الكائنات لا تتغير باستخدام مراجع أخرى في مكان آخر في البرنامج. بعض العمليات المدمجة تحتاج إلى المجموعات وليس القوائم، وبشكل عام استخدم القوائم في المجموعات المنظمة التي يطرأ عليها التغيير أما في بقية الحالات فاستخدم المجموعات.

### الملفات

على أمل أن معظم القراء عندهم خلفية عن فكرة أسماء الملفات التي تخزن المعلومات في الكميبوتر والتي يديرها نظام التشغيل،يكون آخر كائن مدمج في بايثون يزودنا بطريقة الوصول إلى تلك الملفات ضمن برامج بايثون.إن الدالة مدمجة open تنشأ كائن الملف في بايثون وهي تقدم لنا خدمة الربط إلى الملف المستقر على جهازنا،بعد مناداة الدالة open ،يمكننا القراءة والكتابة من الملف المربوط،بمناداة دوال الكائن ملف. عند مقارنة كائن الملفات بالكائنات الأخرى سنجده غريبا قليلا، لأنه ليس عددا وكائنات متسلسلة أو خرائطية، إنما هو استخدام دوال لمعالجة العمليات الشائعة في الملفات، وهذا الكائن ليس موجودا في اللغات الأخرى ، وإنما يدرس في مجال معالجة الخرج والدخل،وهو ليس مستقلا وإنما يستخدم دوال أخرى لمعالجة الملفات. الجدول التالي يوضح ملخص لأهم العلميات على الملفات، لفتح الملف يجب مناداة الدالة open وتزويدها بمعاملين الأول اسم الملف مع مساره ،و الثاني طريقة معاملة الملف للقراء r للكتابة w للكتابة في آخر الملف a ، مع ملاحظة أن كلا المعاملين يجب أن يكونا سلاسل نصية: العملية الوصف output = open('/tmp/spam', 'w')
input = open(''data', 'r'')
S = input.read اسناد خرج الملف بالكامل إلى سلاسل نصية S = input.read(N) قراءة N من البايتات (واحد أو أكثر) S = input.readline قراءة السطر التالي L = input.readlines قراءة خرج الملف ووضعه في قائمة بحيث كل سطر في الملف يساوي عنصر في القائمة output.write(S) كتابة S داخل الملف output output.writelines(L) كتابة جميع أسطر السلاسلة النصية في قائمة L داخل الملف output output.close إغلاق الملف، بعد إغلاق الملف لا يمكن القراءة منه أو الكتابة عليه ويعطي خطأ عند محاولة ذلك
عند إنشائك للملف يمكنك الكتابة والقراءة منه، وفي كل الحالات بايثون تتعامل مع محتويات الملف كسلاسل نصية ولو كانت أعداد، وكذلك عند الكتابة إلى الملفات فهي تعاملها كسلاسل النصية، الجدول السابق يحوي أهم العمليات ويمكنك مراجعة وثائق بايثون للحصول على كل عمليات الملفات. عملية إغلاق الملف close، تعمل على إغلاق الاتصال بين البرنامج والملف الخارجي وهي مهم لتحرير مساحة من الذاكرة، ولكن كما تعلم أن بايثون تملك مجمع نفايات يقوم بغلق الاتصال عندما لا تكون في حاجة إليه تلقائي، وعملية إغلاق الملف لاتضر في البرامج الصغيرة مثل سكربتات، ولكن عند العمل على أنظمة كبيرة يجب ألا تتهاون عن غلق الملفات بنفسك وعدم الاعتماد على مجمع النفايات لتضمن أداء جيدا. العمل على الملفات هنا مثال بسيط يوضح كيفية العمل على الملفات، أول شيء قمنا بفتح ملف في نمط الكتابة،فيقوم المفسر بالبحث عن الاسم المعطى فإن لم يجده يقوم بإنشاء ملف جديد ويعطيه الاسم الذي أعطيناه إياه، ثم قمنا بالكتابة في الملف المنشئ سطر واحد مع ملاحظة إعطاءه علامة سطر جديد، ثم قمنا بإغلاق الملف، ثم قمنا بفتحه في نمط القراءة وقمنا بقراءة السطر الأول منه،ثم حاولنا قراءة السطر الثاني فأعطنا الناتج فراغ لأنه السطر الثاني فارغ: >>> myfile = open('myfile', 'w') # open for output (creates) >>> myfile.write('hello text file\n') # write a line of text >>> myfile.close
>>> myfile = open('myfile', 'r') # open for input >>> myfile.readline # read the line back 'hello text file\012' >>> myfile.readline # empty string: end of file
وهناك بعض الملاحظات حول الملفات: من الإصدار 2.2 لبايثون استبدلت الدالة open بالدالة file فيمكنك استخدام الدالة file مكان الدالة السابقة، وكذلك يمكنك استخدام الدالة السابقة لأنها تعمل كقناع للدالة الجديدة في الإصدارات الجديدة لاحظ أن قراءة الملف تتم مرة واحدة والملف عند عرضه مرة ثانية باستخدام الدالة read لا يتم عرضه ويعطي فراغ، فيجب إعادة قراءة الملف مرة ثانية هذا ما لاحظته على الإصدار 2.3 من بايثون) الخصائص العامة للكائنات الآن وبعد أن أنهينا جميع الكائنات المدمجة في بايثون، دعنا نأخذ جولة سريعة عن الخصائص العامة للكائنات المدمجة في باثيون التي تتشارك فيها. تصنيف الكائنات الجدول التالي يصنف جميع الأنواع التي رأيناها سابقا: نوع الكائن صنفه قابل للتوسع؟ الأعداد Numbers عددي لا السلاسل النصية Strings متسلسل لا القوائم Lists متسلسل نعم القواميس Dictionaries
نعم المجموعات Tuples متسلسل لا الملفات Files امتدادي N/A كما نرى من الجدول فإن السلاسل النصية والقوائم والمجموعات تشترك في أنها متسلسلة،و أن القوائم والقواميس فقط تدعم قابلية التوسع والإنكماش فقط أما غيرها فلا. الملفات تستخدم دوال للتوسع،فهي ليست قابلة للتوسع بالضبط، صحيح تتوسع حين يتم الكتابة، ولكن ليس بالقيود التي تفرضها بايثون على الأنواع. العمومية لقد رأينا العديد من الكائنات المركبة، وبشكل عام نستطيع أن نقول: -القوائم والقواميس والمجموعات يمكنها أن تخزن أي نوع من الكائنات -القوائم والقواميس والمجموعات تدعم التداخل المركب -القوائم والقواميس تستطيع أن تكبر وتصغر دينامكيا بسبب أن هذه الكائنات تدعم التداخل المركب فهي مناسبة جدا للتمثيل المعلومات المركبة في التطبيق،انظر إلى المثال التالي: >>> 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، وبما أن القوائم تقبل إسناد قيم جديدة إليها، فانظر ماذا يحدث عند إسناد قيمة جديدة: >>> X[1] = 'surprise' # changes all three references! >>> L ['a', [1, 'surprise', 3], 'b'] >>> D {'x': [1, 'surprise', 3], 'y': 2} فكنا منتبها لهذه النقطة. المقارنة ،والمساواة والتحقق جميع كائنات في بايثون تستجيب لعمليات المقارنة وعمليات التحقق فيما بينها، وكأنها أعداد وهذا بخلاف كثير من اللغات التي لا تسمح بمثل هذه المقارنات، انظر إلى المثال التالي: >>> L1 = [1, ('a', 3)] # same value, unique objects >>> L2 = [1, ('a', 3)] >>> L1 == L2, L1 is L2 # equivalent?, same object? (True, False) وهنا اختبرنا علاقة المساواة وعلاقة التحقق، وانظر المثال التالي: >>> L1 = [1, ('a', 3)] >>> L2 = [1, ('a', 2)] >>> L1 < L2, L1 == L2, L1 > L2 # less, equal, greater: a tuple of results? (False, False, True) وهنا عدة ملاحظات في المقارنة بين الكائنات المختلفة في بايثون: الأعداد تقارن بمقاديرها التقريبية
القواميس تقارن أيضا باستخدام القائمة المخزنة من المفتاح والقيمة تلميحات مهمة في هذا القسم من كل فصل سنأخذ تلميحات وحيل تساعدك على فهم بايثون بشكل أعمق مع حل مشاكل قد تواجهك ولا تعرف لها إجابة وأنت مبتدئ في اللغة: إسناد المراجع المشتركة قد تكلمنا عن هذا النقطة مسبقا، ونعود نكرر شرح هذه النقطة لأن عدم فهمها يؤدي إلى غموض في فهم ما يجري في المراجع المشتركة ضمن برنامجك، على سبيل المثال سنقوم بإنشاء قائمة L ثم نقوم بإنشاء قائمة M نضمنها القائمة L ثم نقوم بإسناد قيمة جديدة في القائمة L ، انظر ماذا يحدث: >>> L = [1, 2, 3] >>> M = ['X', L, 'Y'] # embed a reference to L >>> M ['X', [1, 2, 3], 'Y']
>>> L[1] = 0 # changes M too >>> M ['X', [1, 0, 3], 'Y'] تلميح إن تأثير هذه الجزئية يكون مهما فقط في البرامج الضخمة، وعادة المراجع المشتركة تقوم بما تريده بالضبط، ولكن إذا أردت أن تسند نسخة وليس مرجع فماذا تفعل؟ بكل بساطة أضف نقطتين على الشكل التالي: >>> L = [1, 2, 3] >>> M = ['X', L[:], 'Y'] # embed a copy of L >>> L[1] = 0 # only changes L, not M >>> L [1, 0, 3] >>> M ['X', [1, 2, 3], 'Y'] التكرار على مستوى واحد عندما تكلمنا سابقا عن تكرار السلسلة قلنا أنه عبارة عن إعادة السلسلة عدد من المرات،هذا الأمر صحيح ولكن عندما تكون السلسلة متداخلة تكون النتيجة تختلف عما تريده بالضبط، انظر إلى المثال التالي:
>>> 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) تلميح لإنشاء نسخة جديدة ،نقوم بإنشاء كائن جديدة ثم نسند إليه الكائن السابق باستخدام ميزة التقطيع ثم نضيف إليه ما نريد إضافته مثل المثال السابق
الملخص في هذا الفصل تناولنا العديد من المواضيع التي تتعلق بأنواع الكائنات في بايثون،بدأنا ببنة البرامج في بايثون ثم الأعداد والسلاسل النصية ثم القوائم والقواميس والمجموعات ثم أخير الملفات ثم أخذنا أهم الخصائص العامة للكائنات المدمجة في بايثون ثم قمنا باستعراض أهم المشكلة التي تتعلق بالكائنات في بايثون. الأمثلة في هذا الفصل تميزت بأنها خصصت لتبيين الأشياء الأساسية، في الفصول القادمة ستكون الأمثلة أكثر واقعية.

## الفصل الثالث: التعابير الأساسية

الاسناد Print جملة الأختبار if الحلقة التكرارية while الحلقة التكرارية for تلميحات المخلص الآن وبعد أن رأينا الأنواع الأساسية للكائنات المدمجة في بايثون في الفصل السابق، سنتحرك في هذا الفصل لشرح أنواع التعابير الأساسية. وبكل بساطة التعابير هي عبارة عن أشياء نكتبها تخبر بايثون ما على البرنامج أن يفعله بالضبط. ولفهم التعابير في بايثون نسترجع ما قلناه في الفصل الثاني لما تكلمنا عن بنية البرنامج في بايثون، وقلنا أن هرمية البرنامج تكون كالتالي:
٢- والوحدات تحتوي على عبارات ٣- والعبارات تنشأ الكائنات وتعالجها. إذا التعابير هي التي تعالج الكائنات -التي مرت علينا في الفصل السابق-،علاوة على ذلك التعابير هي التي تنشأ الكائنات بواسطة إسناد قيم إليها، وكذلك أيضا تنشأ أنواع جديدة من الكائنات مثل الفصول والدوال والوحدات. الجدول التالي يلخص تعابير بايثون،لقد مرت علينا .بعضا منها في الفصل الثاني مثل الإسناد والحذف del ،في هذا الفصل سنأخذ معظم ما ورد في هذا الجدول إلا التعابير التي تحتاج إلى متطلبات أكثر وسنأخذها في الفصول التالية: التعبير الدور مثال الاسناد المراجع curly, moe, larry = 'good', 'bad', 'ugly' مناداة الدوال
Print طباعة الكائنات print 'The Killer', joke If/elif/else عمليات الاختيار if "python" in text: print text For/else التكرار for x in mylist: print x
while 1: print 'hello' Pass
while 1: pass Continue قفز في الحلقات while 1:
Try/except/finally
try: action except: print 'action error' Raise الاستثناء raise endSearch, location Import, From الوصول إلى الوحدات import sys; from sys import stdin Def, Return الوسائل def f(a, b, c=1, *d): return a+b+c+d[0] Class إنشاء الكائنات class subclass: staticData = Global اسم الفضاء def function: global x, y; x = 'new' Del حذف الأشياء del data[k]; del data[i:j]; del obj.attr Exec تشغيل نصوص الأكواد exec "import " + modName in gdict, ldict Assert تأكيد التنقيحات assert X > Y الاسناد لقد رأينا الاسناد في التعابير سابقا،وبكل بساطة نقول أنك ستكتب الهدف الذي تريد أن تسند إليه على ناحية الشمال ،والمسند إليه على ناحية اليمين بينهما علامة يساوي =، والهدف من ناحية الشمال يمكن أن يكون اسم أو كائن ، أما المسند إليه يمكن أن يكون أي نوع من الكائنات التي مرت علينا. في معظم الأحيان الإسناد عملية بسيطة ، ولكن هناك بعض الخائص يجب أن تضعها في ذهنك: الاسناد ينشئ كائنات مرجعية كما رأيت سابقا،بايثون تخزن المراجع إلى الكائنات في أسماء وبنى معطيات، ودائما تنشئ مراجع إلى الكائنات، بدلا من نسخ المراجع.بسبب ذلك تبدو متغيرات بايثون أقرب ماتكون إلى المؤشرات في لغة السي، أكثر من مخزن معطيات. الأسماء تنشئ عند أول إسناد وكما رأينا أيضا أسماء المتغيرات تنشئ في بايثون عند أول عملية إسناد إليها، ولست بحاجة إلى أن تعلن عن الأسماء المتغيرات أولا ثم تسند إليها القيمة،وبعض بنى المعطيات وليس كلها تنشء إدخال جديد فيها بواسطة الإسناد مثل القواميس (راجع جزئية القواميس في الفصل الثاني). يجب أن تسند الأسماء قبل استخدامها بالمقابل تظهر بايثون خطأ إذا استخدمت الاسم ولم تسند إليه قيمة بعد وستظهر المزيد من الاستثناءات إذا حاولت أن تفعل ذلك الاسناد الضمني:import وfrom وdel وclass إلخ.. في هذه الجزئية نحن قد تعودنا على أن الإسناد يتم بالمعامل = ،ولكن الإسناد يحدث في العديد من سياقات في بايثون، على سبيل المثال لقد رأينا جلب الوحدات والدوال وكذلك الفصول ومعاملات الدوال وتعابير الحلقات التكرارية ..إلخ وهذه كلها تعتبر إسناد ضمني، وبما أن الإسناد يعمل نفس العمل أينما ظهر، جميع هذه السياقات ببساطة تسند الأسماء إلى مراجع الكائنات في زمن التنفيذ. الجدول التالي يبين نكهات التعابير الإسنادية في لغة بايثون: العلمية تفسيرها
الاسناد المجموعي (اختياري)
تعدد الأهداف السطر الأول يظهر الصيغة مشهور وهي إسناد اسم إلى قيمة أو بنى معطيات ، أما الصيغ الباقية فهي هيئات خاصة وسنأخذها بشئ من التفصيل: الاسناد المجموعي والقوائمي: السطر الثاني والثالث بينهما علاقة،عندما تستخدم مجموعة أو قائمة في يسار علامة يساوي =تقوم بايثون بعملية مزاوجة من جهة اليمين بحيث تسند كل عنصر من اليسار مع ما يقابله من ناحية اليمين بالترتيب من اليسار إلى اليمين، على سبيل المثال في السطر الثاني العنصر 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=nudge; nudge=wink; wink=T (2, 1)

### قواعد تسمية المتغيرات:

الآن وبعد أن تكلمنا عن قضية الإسناد في بايثون، نريد أن نتوسع في قضية تسمية المتغيرات التي سنسند إليها القيم ونفهم قواعدها. في بايثون أسماء المتغيرات تنشأ عندما نسند إليها القيمة،ولكن هناك قواعد تحكم اختيار الاسم أيضا، وهي مشابهة لقواعد لغة السي وهي: اسم المتغير يجب أن يبدأ بحرف أو شرطة سفلية اسم المتغير يجب أن يبدأ بحرف أو شرطة سفلية فقط ويمكن بعد ذلك أن يتبعه أي عدد من الأحرف أو الأعداد أو شرطة سفلية ،على سبيل المثال: أسماء صحيحة: spam _spam Spam أسماء غير صحيحة: 1spam ويجب أن لا يحتوي الأسماء على هذه الأحرف : $@#! بايثون حساسة لحالة الأحرف بايثون حساسة لحالة الحروف مثل السي بالضبط فالمتغير omlx يختلف عن المتغير Omlx فكن منتبها لهذه النقطة الكلمات المحجوزة هناك كلمات معينة في لغة بايثون محجوزة ولا يمكن أن تسمى متغيرك بها، وإذا سميت بها متغيرك تعطيك اللغة تحذيرا ،وإذا اضطررت إلى أن تسمي بها فغير حالة الحروف فقط أو حرف معين مثلا class لا يمكنك التسمية بها ولكن Class أو klass يمكنك، والكلمات المحجوزة موضحة في الجدول التالي:
and
else
def
for
exec
is in
if raise print
not
return قبل أن نتحرك عن هذه النقطة، نريد أن ننوه بالفرق بين الأسماء والكائنات في بايثون، كما رأينا سابقا في الفصل الثاني أنواع الكائنات في بايثون ورأينا أن هناك كائنات ثابثة وأخرى غير ثابتة. أما الأسماء من ناحية أخرى فهي فقط مجرد مراجع تؤشر إلى الكائنات ولا ترتبط بنوع الكائنات بل تستطيع أن تؤشر إلى أي نوع من الكائنات وبنفس الاسم فهي غير ثابتة ،انظر المثال التالي: >>> x = 0 # x bound to an integer object >>> x = "Hello" # now it's a string >>> x = [1, 2, 3] # and now it's a list وكما نرى فإن المثال الأخير يوضح لنا مميزات الأسماء في بايثون بشكل عام.
Print التعبير print بكل بساطة هو التعبير الذي يطبع الكائنات،من الناحية التقنية يقوم هذا التعبير بكتابة التمثيل النصي للكائن ويرسله إلى الخرج القياسي للبرنامج. والخرج القياسي غالبا ما يكون النافذة التي بدأ تنفيذ برنامج بايثون بها، إلا إذا تم إرسال النتائج الخرج إلى ملف باستخدام أوامر الشل. في الفصل الثاني رأينا دوال الكائن الملف التي تكتب إلى الملفwrite ،التعبير print مشابهة إليها ولكن بتركيز أكثر: التعبير print يقوم بكتابة الكائنات إلى الخرج القياسي stdout، أما الدالة write تقوم بكتابة السلاسل النصية إلى الملف،ومنذ أن توفر الخرج القياسي في بايثون ككائن stdout في وحدة sys يمكنك أن تحاكي التعبير print باستخدام دالة كتابة الملفات write (انظر الأمثلة التالية) ولكن استخدام print أسهل بكثير. الجدول التالي يوضح صيغ التعبير print: العملية تفسيرها print spam, ham طباعة الكائنات إلىsys.stdout وإضافة بينهما فراغ print spam, ham, نفس السابق ولكن بدون إضافة سطر جديد في النهاية بشكل افتراضي يقوم التعبير print بإضافة فراغ بين الكائنات التي تفصل بينهما فاصلة مع إضافة علامة نهاية السطر في نهاية السطر من الخرج.لتجاوز علامة نهاية السطر (وبالتالي يمكنك إضافة نصوص أخرى في نفس السطر لاحقا) أنه تعبير print بإضافة فاصلة ،مثلما يظهر في السطر الثاني من الجدول السابق نص عريض