Data Loading...
ﺗﻢ ﺗﺤﻤﻴﻞ اﻟﻤﻠﻒ ﻣﻦ ﻣﻮﻗﻊ اﻟﺒﻮﺻﻠﺔ اﻟﺘﻘﻨﻴﺔ 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