تعتبر بايثون من أسهل وأنظف لغات البرمجة ومع ذلك فهي من أقوى لغات البرمجة في نفس الوقت. تمتاز بايثون بأنها لغة متعددة المبادئ multi paradigm فهي
إن اللغة البرمجية النصية scripting language الأفضل في العالم كانت دون منازع هي بيرل Perl وتُعرف من الجَمل (نسبة للصورة على الكتاب) الذي لديه “أكثر من طريقة للقيام بأي شيء” حتى جاءت لغة بايثون Python والتي تعرف بأنها اللغة النصية الأخرى! (أي إلى جانب Perl).
إن الثعبان الأسطوري Python ليس السبب وراء هذا الاسم بل جاء هذا الاسم نسبة لرواية إنجليزية كوميدية ساخرة تعود للسبعينات من القرن الماضي. لغة بايثون تتخطى كل عيوب لغة بيرل Perl التي توصف بأنها لغة قذرة Dirty Language ففي لغة بيرل من السهل كتابة برنامج لكن قد يكون شبه مستحيل قراءته أو تعديله أو إصلاحه. بل إن هناك من عُرف بعمل برامج تحل مشاكل معقدة بسطر واحد بلغة بيرل. أما لغة بايثون فإنها تحمي المبرمج من نفسه، إنها تلزمه بالوضوح. لكن هذا ينفر المبرمجين الجدد منها في البداية. منتقدي اللغة يشبّهون صرامتها في تنسيق الكود بالمسافات البادئة بلغة فورتران سيئة الذكر. لكن هذه النقطة هي من نقاط القوة في بايثون وليست من نقاط الضعف.
جاءت لغة بايثون من مراكز الأبحاث و “مطاحن الأعداد” بسبب كثرة الحزم الإضافية المتخصصة بالحوسبة الفائقة Super computing والحوسبة المتوازية Parallel computing ويظهر هذا واضحاً من خلال النظر في مالكي حقوق النسخ عليها وهم Stichting Mathematisch Centrum ثم Corporation for National Research Initiatives ثم BeOpen.com ثم Python Software Foundation وقد غدت هذه اللغة المفضلة عند علماء الرياضيات والمهندسين والباحثين وقد حلت محل لغة FORTRAN. انظر مقالات Pramode C.E. في Linux Gazette أو في موقعه http://pramode.net
ويُعرف مخترع هذه اللغة Guido van Rossum باختراعه لشيء آخر أقل أهمية مقارنة مع بايثون ألا وهو آلة الزمن!! نعم، إذ يشاع بأنه قد اخترع آلة التحكم في الزمن، ذلك لأنه كان يجيب على الأسئلة التي تطلب المزيد من المزايا في هذه اللغة بقوله “لقد فعلت ذلك بالأمس!” (القليل من روح الدعابة لكسر الجمود)
من أشهر التطبيقات التي كتبت بهذه اللغة هي Anaconda (على اسم ثعبان حقيقي) وهو برنامج التركيب في توزيعة ريدهات وفيدورا وغيرها وبرامج الإعدادات في تلك التوزيعات. كما أن هناك الكثير من المواقع تستخدم بايثون عبر WSGI حيث يمكن أن يعمل بشكل متكامل مع خادم الويب أباتشي بطريقة أسرع من CGI بعدة أضعاف.
وتستخدم غوغل بايثون في عدد كبير من الأمور.
يمكن الحصول على مفسر بايثون للمنصات المختلفة من خلال www.python.org/download لكن يجدر بك ملاحظة أنه في لينكس لا نحتاج إلي تثبيت بايثون فهو يأتي مثبتا مسبقا في أغلب التوزيعات.
مستخدمو ويندوز يمكنهم الحصول على حزمة تثبيت msi من الصفحة السابقة (مثلا python-2.6.5.msi أما التي تنتهي ب amd64.msi فهي لنظام ويندوز ذي 64-بت) يتم تثبيت هذا الملف بالنقر المزدوج عليه.
كذلك هناك حل مفيد جدا لمستخدمي ويندوز وهو www.PortablePython.com وهي حزمة تحتوي نسخة منقولة من لغة بايثون تحتوي على الكثير من الإضافات (مثل واجهات SPE IDE و PyScripter وغيرها) بعد تشغيل ملف exe الموجود عليها يمكنك وضع المجلد الناتج منها على ذاكرة فلاش ثم تشغيل بايثون منها دون الحاجة لعمل setup.
في ماك يمكنك الحصول على حزمة dmg من نفس الصفحة مثلا python-2.6.5-macosx10.3-2010-03-24.dmg
في لينكس يكفي كتابة python في الطرفية terminal (أي سطر الأوامر) لتشغيل مفسر بايثون التفاعلي. ذلك سيؤدي لتشغيل الملف /usr/bin/python
في ويندوز تجد ملفين لتشغيل بايثون python.exe و pythonw.exe الأول يظهر محاورة سطر أوامر console (وهو ما نريده الآن) والثاني لا يظهر محاورة ويستخدم الثاني كمفسر للبرامج الرسومية التي لا ينبغي أن تظهر الطرفية عند تشغيلها ولتمييزها تعطى تلك البرامج اللاحقة pyw عوضا عن اللاحقة التقليدية. إن كنت تريد أن تعمل بايثون كما في لينكس أي عندما تكتب python في سطر الأوامر (وليس عن طريق النقر على أيقونة الملف python.exe أو القوائم) عليك أن تضيفها إلى مسار التشغيل PATH عن طريق إتباع الخطوات التالية:
عند تشغيل مفسر بايثون التفاعلي ستحصل على ما يشبه
[alsadi@pc1 ~]$ python Python 2.6 (r26:66714, Nov 3 2009, 17:33:38) [GCC 4.4.1 20090725 (Red Hat 4.4.1-2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
العلامة »>
هي محث إدخال الأوامر.
في مفسر بايثون التفاعلي اكتب 1+1 حتى تكون الشاشة عندك هكذا
[alsadi@pc1 ~]$ python Python 2.6 (r26:66714, Nov 3 2009, 17:33:38) [GCC 4.4.1 20090725 (Red Hat 4.4.1-2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 1+1 2 >>>
لاحظ أن الجواب وهو 2 لم تسبقه علامة المحث »>
وذلك للتمييز بين ما تدخله من أوامر والإجابة التي تحصل عليها.
جرب الآن
"1"+"1"
ستحصل على شاشة تشبه
[alsadi@pc1 ~]$ python Python 2.6 (r26:66714, Nov 3 2009, 17:33:38) [GCC 4.4.1 20090725 (Red Hat 4.4.1-2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> "1"+"1" '11'
والسبب أن “1” عبارة عن سلسلة نصية وليس عدد صحيح. وهذا يدلنا على أن بايثون لغة تحترم أنواع البيانات.
جرب الآن
1/3*3
ستحصل على شاشة تشبه
[alsadi@pc1 ~]$ python Python 2.6 (r26:66714, Nov 3 2009, 17:33:38) [GCC 4.4.1 20090725 (Red Hat 4.4.1-2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 1/3*3 0
نعم أنت لم تخطئ. الجواب صفر وليس واحد!! لأننا قمنا بعملية قسمة صحيحة 1 تقسيم 3 الجواب صفر (والباقي 1) ثم ضربنا الناتج الذي هو صفر في 3 فكان الناتج النهائي صفرا.
1//3*3
جرب الآن
1.0/3.0*3.0
وستحصل على الجواب الذي نتوقع وهو 1.0 هكذا
>>> 1.0/3.0*3.0 1.0
بل وحتى
1.0/3*3
ستعطي نفس الجواب. السبب هو أن نوع العدد 1.0 ليس عددا صحيحا كما في 1 بل هو عدد نسبي float (يجوز أن يحتوي كسور مثل الربع). وناتج قسمة عدد نسبي على عدد صحيح هو عدد نسبي وناتج ضرب عدد نسبي في عدد صحيح هي عدد نسبي لهذا حصلنا على الجواب 1.0.
جرب الآن
>>> 12 > 2 True >>> "12" > "2" False
الوضع الطبيعي أن تكون 12 أكبر من 2 كما في أول مثال لكن عندما تكون نصوص فيتم مقارنتها محرف محرف وهنا نحصل على النتيجة الغربية.
تأمل الجلسة التالية على مفسر بايثون التفاعلي
>>> 1-1*2 -1 >>> (1-1)*2 0 >>> 1-(1*2) -1
لاحظ أن أول عملية لم تتم بالترتيب الذي طبعت فيه وإنما تم تنفيذ عملية الضرب قبل الطرح لأن أولويتها أعلى.
تأمل الجلسة التالية على مفسر بايثون التفاعلي
>>> 2**3**2 512 >>> (2**3)**2 64 >>> 2**(3**2) 512 >>>
بعض العمليات مثل عملية الرفع لقوة (علامتي * متتابعتين) تنفذ من اليمين لليسار.
يمكنك تعريف متغيرات بواسطة عملية الإحلال assignment ورمزها علامة المساواة “=”
>>> a=1 >>> b=2 >>> a+b 3
ويمكنك وضع قيمة في أكثر من متغير
>>> x=y=2 >>> z=x+y >>> z 4
ويمكنك وضع أكثر من قيمة في أكثر من متغير (إن تساوى عدد القيم والمتغيرات)
>>> i,j=3,4 >>> i+j 7
يمكنك تقديم الأعداد الصحيحة بأي أساس شئت مثلا يمكنك كتابتها بالنظام العشري مثل 197
كذلك يمكنك التعبير عنها بالنظام الثماني بأن تبدأ العدد بصفر (كعلامة مميزة للنظام الثماني) مثلا 012
تعني 10 أو بالنظام الست-عشري بأن تبدأ بصفر ثم x كعلامة مميزة حيث 0x12
تعني 18 أو حتى بالنظام الثنائي وعلامته 0b حيث 0b101
تعني 5
تأمل هذه الجلسة
>>> 010 + 1 9 >>> 0x10 + 1 17 >>> 0b101+2 7
كذلك تدعم بايثون أعداد صحيحة عملاقة تسمى long ونميزها من اللاحقة L تأمل عدد المنازل في هذا المثال:
>>> 5**100-1 7888609052210118054117285652827862296732064351090230047702789306640624L
كذلك تدعم بايثون أعداد نسبية (فيها كسور) تسمى أعداد الفاصلة العائمة float ونميزها من الفاصلة العشرية مثل واحد 1.0 أو مثل واحد ونصف 1.5 كذلك يمكنك استخدام أسلوب الفاصلة العائمة أو ما يعرف بالأسلوب “الهندسي” عند التعبير عن الرقم هكذا
>>> 0.5e3 500.0 >>> 3.0e8 300000000.0 >>> 1.0e-3 0.001 >>> 1.5e6-(1*10**6) 500000.0
حيث نكتب رقم ثم e أي exponential ثم القوة مثلا 3.0e8
تعني 3 مضروبة في 10 مرفوعة للقوة 8 يعني 3 أمامها 8 أصفار.
كذلك تدعم بايثون الأعداد المركبة (التخيلية) حيث يعبر عن العدد التخيلي فيها بالرمز j هكذا
>>> 5j 5j >>> 1+5j (1+5j) >>> (1+5j)*(1-5j) (26+0j)
تدعم بايثون نوعين من السلاسل النصية واحدة اسمها string وهي سلسلة من البايتات a sequence of bytes أي أنها مجرد بقعة هلامية blob من البيانات الخام.
أما الثانية فهي كائنات يونيكود unicode التي هي سلسلة من المحارف العالمية يونيكود a sequence of unicode characters ونميزها من خلال وجود علامة u قبل علامة الاقتباس.
يتم تمثيل النص بواسطة علامة الاقتباس المفردة أو المزدوجة ولا فرق بينهما سوى أن واحدة منهما تساعدك على تخطي حالات الخاصة يجب تخطيها في الأخرى. لاحظ هذا المثال:
>>> "I'm using python" "I'm using python" >>> 'he said: "Hello"' 'he said: "Hello"'
ففي المثال الأول لزمني وضع علامة الاقتباس المفردة بين I و m فلو استخدمت الاقتباس المفرد في إحاطة السلسلة لانتهت بعد I ولكان ما بعدها خطأ في الصياغة.
كذلك الحال في الثانية حيث أريد نص تكون كلمة Hello فيه محاطة بعلامة اقتباس مزدوجة فلو كانت السلسلة النصية كلها محاطة باقتباس مزدوج لانتهى قبل كلمة Hello ولكان ما بعدها خطأ في الصياغة
>>> 'I'm using python' File "<stdin>", line 1 'I'm using python' ^ SyntaxError: invalid syntax >>> "he said: "Hello"" File "<stdin>", line 1 "he said: "Hello"" ^ SyntaxError: invalid syntax
يجدر بنا الإشارة أن بايثون تسمح بمتابعة النص بعلامة اقتباس مختلفة
>>> "a"'b' 'ab'
يتم التخطي في نصوص بايثون عبر علامة سلاش المعكوسة \ حيث هناك معان خاص لما يأتي بعدها منها
>>> 'I\'m using python' "I'm using python"
فإن كنت لا ترغب بتفعيل خاصية تخطي \ بتكرارها كل ما عليك هو وضع r قبل علامة الاقتباس (بعد u في حالة كائنات يونيكود) وهذا مفيد في تمثيل الأنماط القياسية والماسارات على نظام ويندوز.
كذلك تأتي بايثون بصيغة مفيدة جدا في تمثيل النصوص الطويلة وهي الاقتباس الثلاثي (المفرد والمزدوج) حيث يمتاز بأنه يمتدل على أكثر من سطر حتى يغلق بتتابع ثلاثة علامات معا.
>>> '''I'm using python ... it's a good language ... and I like it.''' "I'm using python\nit's a good language\nand I like it."
النوع bool اختصار ل Boolean أي منطقي يعني إما صواب وإما خطأ. وهو قيمتان:
لاحظ أن True و False تكتب بأحرف أولى كبيرة.
تأمل هذه الأمثلة
>>> 7<2 False >>> 7>5 True >>> True or False True >>> True and False False >>> True==False False >>> True!=False True >>> True==1 True >>> False==0 True
لكن عند التحويل إلى bool هناك الكثير من الأشياء تتحول إلى True أو إلى False مثلا أي عدد غير الصفر يعتبر صواب True حتى لو لم يمكن واحد
>>> bool(5) True
وهو كائن يمثل عدم وجود قيمة denoting lack of value
>>> None==False False >>> bool(None)==False True
بايثون يدعم عدد كبير من مثل هذه الكائنات فإلى جانب السلاسل النصية لدينا الكائنات التالية:
في المثال التالي سنتعرف على طريقة تعريف مثل هذه الكائنات والوصول لعناصرها
>>> l=['one', 2 , 3.0] >>> l[0] 'one' >>> l[1] 2 >>> l[2] 3.0 >>> l[3] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range
لاحظ أن اللائحة التي عرّفناها تتكون من 3 عناصر كل منها من نوع مختلف وهي على الترتيب سلسلة نصية ثم عدد صحيح ثم عدد نسبي. كذلك لاحظ استخدام الحاصرات المربعة [ ] للوصول للعنصر علم ترتيبه حيث نضع أقل من رقمه بواحد يسمى index (وهي الإزاحة عن البداية offset يعني العد يبدأ من صفر للعنصر الأول) أي أن قيمه تكون من صفر وحتى عدد العناصر ناقس واحد فإن تجاوزت العدد تحصل عل IndexError.
كما يمكنك تقديم إزاحة سالبة وتعني عد العناصر من آخر اللائحة فيكون -1 هو آخر عنصر
>>> t=('one', 2 , 3.0) >>> t[-1] 3.0 >>> t[-2] 2 >>> t[-3] 'one'
لاحظ أنني في هذا المثال الأخير استخدمت المرتب tuple وذلك واضح من الأقواس الهلالية عند تعريفه.
يفضل أن تنهي تعريف المرتب بفاصلة زائدة حتى نميز حالة المرتيب ذي العنصر الواحد من حالة أقواس إعطاء الأولوية. في المثال التالي t1 ليست مرتب وإنما عدد صحيح أما t2 فهي مرتب من عنصر واحد
>>> t1=(5) >>> t1 5 >>> t2=(5,) >>> t2 (5,)
يمكنك الطباعة على الشاشة بواسطة print ثم الكائنات التي تريد طباعته يفصل بينها فاصلة ”,“. بايثون تضيف علامة سطر جديد بعد كل print ما لم تضيف فاصلة زائدة في آخر الكائنات.
>>> print "Peace!" Peace! >>> print "I can count: one, ", 2, ", three!" I can count: one, 2 , three! >>> print '''I'm using python ... it's a good language ... and I like it.''' I'm using python it's a good language and I like it. >>> print r"C:\new folder" C:\new folder >>> print "C:\new folder" C: ew folder
المثال الأخير لم يطبع ما كنت تتوقعه حيث علامة \ متبوعة بحرف n تعني سطر جديد للحصول على ما تريد يمكنك تكرار علامة \ حتى تتخطاها أو تستعمل r قبل علامة الاقتباس.
الدالة raw_input تعرض محث لاستلام مدخلات ثم تعيد سلسلة نصية
>>> n=raw_input("Enter your name: ") Enter your name: Ahmad >>> print "Hello ", n Hello Ahmad
إذا كنت تريد قيمة عددية صحيحة يمكنك التحويل عبر int مثلا
>>> w=int(raw_input("Enter width: ")) Enter width: 15 >>> h=int(raw_input("Enter hieght: ")) Enter hieght: 2 >>> print "Area=", w*h Area= 30
يمكنك طلب المساعدة حول أي كائن (بما في ذلك الدوال والوحدات)
help(sum) l=[1,2,3] help(l)
كتابة السطرين التاليين في مفسر بايثون التفاعلي يفعّل الإكمال التلقائي عبر زر TAB
import readline, rlcompleter readline.parse_and_bind("tab: complete")
لتفعيل الإكمال التلقائي ذاتيا في المفسر التفاعلي اكتب
echo 'import readline, rlcompleter; readline.parse_and_bind("tab: complete")' >> ~/.pythonrc.py echo 'export PYTHONSTARTUP=~/.pythonrc.py' >> ~/.bashrc source ~/.bashrc
عندها سيُفعّل ذلك في الطرفية الحالية وكل الطرفيات التي تفتح بعد ذلك.
عيوب هذه الطريقة أنه عندها لا يمكنك استعمال TAB كجزء من الكود بل يجب استخدام المسافة لعمل الإزاحة البادئة (لكن هذا ليس بشيء حيث ينصح بشكل عام بعدم الخلط بين الاثنتين والاكتفاء بالمسافة لأن مقدار إزاحة TAB غير ثابت في كل المحررات)
يقدم مفسر بايثون التفاعلي المحسن ipython العديد من المزايا مثل الإكمال التلقائي بواسطة زر الجدولة TAB. كذلك تدعم تصفح الكود ملونا وتمحيص البرنامج debug وتحليله profile وغيرها من المزايا.
موقع بايثون غني بالوثائق وهي أيضا موجودة للتصف دون إنترنت من خلال نسخة محلية موجودة على جهازك
مع تغير الرقم 2.7 إلى رقم إصدار بايثون
كذلك يوجد نظام مساعدة تفاعلي مبني في بايثون يمكن تشغيله على شكل خادم محلي (لا يحتاج أباتشي أو أي خادم آخر) فقط اكتب pydoc -p ثم اتبعها برقم المنفذ ثم افتح العنوان الذي يعطيك إياه في متصفح الإنترنت
[alsadi@localhost ~]$ pydoc -p 4321 pydoc server ready at http://localhost:4321/
هناك إضافة اسمها PyDev لبيئة التطوير Eclipse. قم بتثبيت تلك الحزمة (في فيدورا/أعجوبة اسم الحزمة هو eclipse-pydev).
بعد تثبيت الحزمة (سواء في لينكس أو ويندوز) عليك إخباره عن مسار مفسر لغة بايثون وذلك بالخطوات التالية:
من قائمة Window اختر التفضيلات Preferences ثم بند python interpreter ثم New ثم حدد المسار ليكون /usr/bin/python
ثم وافق.
المسارات الموجودة في أسفل النافذة هي للحزم الإضافية الخاصة بلغة بايثون حيث يقوم بسبرها لعمل إكمال تلقائي حقيقي. الإكمال التلقائي يعمل عبر ضغط CTRL مع مسافة.
لإنشاء برنامج جديد اذهب إلى قائمة ملف File ثم جديد new ثم Pydev project ثم أضف ملفات الوحدات والحزم بالنقر بالزر الأيمن على مجلد src في القائمة الجانية للمشروع ثم جديد new ثم Pydev module و Pydev Package على الترتيب. لعمل برنامج عادي أضف واحدة pydev module وأعطها اسمها مناسبا واختر قالب main مثلا>
يمكنك التعرف على المفاتيح السريعة من خلال نافذة window ثم تفضيلات preference ثم انظر إلى keys كما في الصورة
مثلا:
للعودة إلى منظور التطوير والخروج من منظور التمحيص انقر على أيقونة الثعابين pydev تجدها في الطرف البعيد من شريط الأدوات. وللعودة مرة أخرى لمنظور التمحيص انقر على أيقونة التحميص debug وهي على شكل حشرة.
من أفضل وأخف البيئات المتوفرة وهي مكتوبة على لغة دلفي مما يجعلها حصرية لنظام ويندوز
الكود التالي يولد أول 10 مربعات كاملة من 0×0 حتى 9×9
>>> [i*i for i in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
تأمل الكود التالي
>>> a=['a', 'b', 'c'] >>> x=('x', 'y', 'z') >>> [i+i for i in a] ['aa', 'bb', 'cc'] >>> [j+x[i] for i,j in enumerate(a)] ['ax', 'by', 'cz'] >>> [[i+j for i in a] for j in x] [['ax', 'bx', 'cx'], ['ay', 'by', 'cy'], ['az', 'bz', 'cz']] >>> [i+j for i in a for j in x] ['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
a=int('10') b=int('a')
a=int('10') try: b=int('a') except ValueError: print "error"; exit(1)
لتعريف دالة اكتب def ثم اسم الدالة ثم بين قوسين المعاملات ثم نقطتان رأسيتان مثلا
def hello(n): print "Hello, "+n+"!!"
لاحظ أن المسافة البادئة هي التي تحديد الكود التابع للدالة. لاستدعاء الدالة نكتب اسم الدالة ثم بين قوسين نمرر لها المعاملات. إليك هذه الجلسة
>>> def hello(n): ... print "Hello, "+n+"!!" ... >>> hello("ali") Hello, ali!!
يمكن أن نعطي المعاملات قيمة تلقائية حتى نجعلها اختيارية تأمل هذه الجلسة:
>>> def hello(n="world"): ... print "Hello, "+n+"!!" ... >>> hello("ali") Hello, ali!! >>> hello() Hello, world!!
المعاملات التي لا قيمة تلقائية لها يجب أن تسبق التي لها قيمة تلقائية هكذا
def test(a,b,c=3,d=4): print a,b,c,d
في المثال السابق لا تستطيع استدعاء الدالة test بأقل من معاملين فإن مررت لها معاملين سيذهبان لملئ a ثم b على الترتيب والبقية ستأخذ القيمة التلقائية فإن زدت معامل سيذهب الثالث للمعامل c وتأخذ d القيمة التلقائية.
يمكنك تمرير معامل في غير مكانه عبر تحديد اسمه
>>> def test(a,b,c=3,d=4): ... print a,b,c,d ... >>> test(b=2,a=1,d=4,c=3) 1 2 3 4 >>> test(b=2,a=1,d=4) 1 2 3 4
يمكن للدوال أن تأخذ عدد غير محدود من المعاملات عبر وضع * قبل اسم متغير بهذا يحتوي ذلك المتغير كل ما بقي من معاملات على شكل قائمة list
def printargs(*a): for i in a: print i
تأمل هذه الجلسة
>>> def test(a,b,*c): ... print a,b,c ... >>> test(1,2,3,4,5,6,7) 1 2 (3, 4, 5, 6, 7)
كذلك يمكن الحصول على تلك المعاملات على شكل قاموس مفاتيحه وقيمها هي اسماء المتغيرات وقيمها على الترتيب بوضع نجمتين قبل اسم المتغير القاموس هكذا
def test(**kw): print kw
تأمل هذه الجلسة
>>> def test(**kw): ... print kw ... >>> test(a=123,b="xyz") {'a': 123, 'b': 'xyz'}
إليك مثال عام جدا يأخذ خليط من جميع الطرق السابقة
def test(a,b,c,d=4,e=5,*args, **kw): print a,b,c,d,e,args,kw
تأمل هذه الجلسة
>>> test(1,2,3) 1 2 3 4 5 () {} >>> test(1,2,3,e=-5) 1 2 3 4 -5 () {} >>> test(1,2,3,4,5,6,7,8,9,10) 1 2 3 4 5 (6, 7, 8, 9, 10) {} >>> test(1,2,3,f=7) 1 2 3 4 5 () {'f': 7} >>> test(1,2,3,4,5,6,7,f=7,x=9) 1 2 3 4 5 (6, 7) {'x': 9, 'f': 7}
في لغات البرمجة هناك ما يعرف بأفق المتغيّرات scope وهو مدى مرئية ذاك المتغيّر في أجزاء البرنامج المختلفة.
السلوك التلقائي في بايثون أن المتغيّر الذي تعرفه خارج الدالة في أفق ما يكون منظور للقراءة فقط داخل الدوال الفرعية. لاحظ في هذا المثال أن x المعرفة خارج الدالة printx كانت مرئية داخلها
>>> x=5 >>> def printx(): print x ... >>> printx() 5
أما ما تعطيه قيمة داخل الدالة الفرعية (بالإحلال) فإنه يكون متغيرا محليا لا يعيش خارج ذلك الأفق. ففي هذا المثال الدالة setx دالة تضع القيمة التي نمررها لها في المتغير x وهذا يعني ضمنا أن x متغيّر محلي لا علاقة له مع المتغيرات التي لها نفس الاسم خارج الدالة.
>>> def setx(a=10): x=a ... >>> x=5 >>> setx(15) >>> x 5
إن أردت تغيير هذا السلوك التلقائي كل ما عليك هو إعلان أن المقصود هو المتغير العام global variable عبر استخدام global ثم اسم المتغير هكذا قارن المثال السابق مع التالي:
>>> def setx(a=10): global x; x=a ... >>> x=5 >>> setx(15) >>> x 15
كما لاحظنا سابقا فإن المتغيرات المحلية local variables بما فيها المعاملات لا تتعدى أفقها فإن مررت متغير لدالة ثم غيرته داخل الدالة فإنه لا يتغير خارجها
>>> def change_arg(a): ... a=[9,8,7] ... >>> l=[1,2,3] >>> change_arg(l) >>> l [1, 2, 3]
تأمل الفرق بين الجلسة السابقة والتالية
>>> def change_arg(a): ... del a[:] ... a.extend([9,8,7]) ... >>> l=[1,2,3] >>> change_arg(l) >>> l [9, 8, 7]
عند تمرير متغير لدالة فإنه يتم عمل متغير محلي يحتوي على مرجع أو إشارة للكائن الأصلي فإن قمت بعملية إحلال عبر = فإنك تجعل المحلي يشير لكائن جديد في حين لو قمت باستدعاء طرق methods تغير من قيمة نفس الكائن مثل del أو a.pop أو a.append أو a.extend فإنك تعدل على نفس الكائن
فهم error trace
يعتبر موقع PyPI أي Python Package Index أول مكان تبحث فيه عن حزم إضافية. يمتاز هذا الموقع بأنه يحتوي على صندوق بحث ويحتوي على معلومات مثل رابط آخر إصدارة أو رابط الوثائق ويبين درجة نضوج الحزمة.
قد يوفر لك هذا الموقع روابط exe أو حزم rpm لكنه في الغالب يوفر كود مصدري في أرشيف zip أو tarball بعد فك ضغطه ادخل المجلد واكتب
python setup.py install
من أكثر أساليب التثبيت سهولة هو استخدام مدير الحزم الخاص بتوزيعتك مثلا لتثبيت حزمة lxml في فيدورا (وبالتالي أعجوبة) اكتب
yum install python-lxml
أو في ديبيان (وبالتالي أوبنتو) اكتب
apt-get install python-lxml
من الحزم الشائعة التي أفضل تثبيتها من مدير الحزم هي التالية وذلك أنها ليست حزم بايثونية صرفة بل تحتوي كود بلغة سي وتحتاج تصنيف لذا جلبها من مستودعات توزيعتك يوفر عليك عناء تصنيفها
yum install python-pip python-pillow python-lxml python-psutil python-simplejson python-ldap python-crypto python-pwquality PyYAML MySQL-python python-psycopg2 libxslt-python python-greenlet python-gevent python-gevent-socketio python-gevent-websocket
أداة easy_install
(الموجودة في حزمة python-setuptools
) تسهل جلب وتثبيت حزم بايثون لاحقا تم الاستعاضة عنها بالأداة الأقوى pip
والتي تم https://www.python.org/dev/peps/pep-0427/ من خلال اعتماد wheel
والتي يمكنها جلب الحزم التي تحتاج تصنيف ويمكنها نقل الحزم من جهاز إلى آخر أو من مشروع إلى آخر.
سابقا لم يكن pip
ولا easy_install
جزء من توزيعة بايثون القياسية. مؤخرا حتى إصدارات بايثون لنظام ويندوز أصبحت تأتي مع مدير الحزم pip
. تأكد من تثبيت حزمتي python-pip
و python-setuptools
تأكد من تثبيتهما من مستودعات التوزيعة.
yum install python-setuptools python-pip pip install wheel
إذا كانت توزيعتك لا تأتي ب pip
(اسم احزمة هو python-pip
) يمكنك تثبيتها من خلال easy_install
الموجود في python-setuptools
وذلك بكتابة الأمر التالي بصلاحيات الجذر
easy_install pip
pip install wheel
يمكنك pip من تثبيت الحزم سواء في النظام أو في بيت المستخدم (عبر –user
) ويمكنك من تحديد شروط معينة مثل رقم الإصدار أو ما شابه
على الخوادم يمكنك فصل كل تطبيق في مستخدم وتثبيت متطلبات التطبيق في بيته مثلا اكتب الأمر التالي بصلاحيات المستخدم العادي (وليس الجذر) صاحب التطبيق
pip install --help pip install --user django pip install --user -r requirements.txt
حيث requirements.txt
هو ملف نصي يحتوي أسماء الحزم التي تريد تثبيتها
لنفرض أنك مطور تعمل على مشروعين الأول يعتمد على الإصدار الأول (دون الثاني) من حزمة ما والثاني على الإصدار الثاني (دون الأول) فإذا ثبت تلك الحزمة فالنظام فأي إصدار ستختار. الحل هو وضع كل مشروع في مجلد يكون فيه اكتفاء ذاتي من المكتبات يسمى البيئة الافتراضية (لا تخف لا يوجد عملية محاكاة فقط يتم تحديد مسارات غير مسارات النظام). حتى تستطيع عمل ذلك أولا ثبت حزمة virtualenv من خلال pip بصلاحيات الجذر
pip install virtualenv
الآن لعمل مجلد بيئة افتراضية خاصة بمشروع جديد كل ما عليك هو كتابة الأمر التالي كمستخدم دون صلاحيات
virtualenv --no-site-packages mypyenv
الأمر السابق يعمل بيئة نظيفة خالية لا تستفيد من حزم النظام. لكن أنا أفضل أن أستفيد منها (إذا كنت أعرفها وأعرف أنها لا تتضارب مع مشروعي)
virtualenv --system-site-packages mypyenv
لتفعيل تلك البيئة الافتراضية اكتب
cd mypyenv source bin/activate
وأثناء تفعيل تلك البيئة استعمل pip install
دون صلاحيات لتثبيت أي حزمة تريد وتشغيلها حيث أنها تثبيت داخل البيئة الافتراضية الخاصة بمجلد المشروع
ولإلغاء تفعيلها اكتب
deactivate
لتوفير عناء تنزيل الحزم من الإنترنت لكل مشروع أو لتجيد إصدارات (لتضمن أنه نفس الإصدار الذي جربته) أو لدعم التثبيت دون إنترنت وغير تلك الأسباب نستخدم ميزة wheel
حيث أننا نعمل مجلد نحفظ فيه الحزم. اكتب دون صلاحيات
mkdir ~/wheel/s pip wheel -w ~/wheels Django pip wheel -w ~/wheels Django==1.7 pip wheel -w ~/wheels -r requirements.txt
بهذا يتم تثبيت أرشيف الحزم في مجلد wheels الذي حددناه بالخيار w. لاحظ أنه يمكننا تثبيت أكثر من إصدار من الأرشيف.
لاحقا لتثبيت حزمة دون إنترنت استعمل الخيار no-index مع تمرير مسار مجلد الأرشيفات بعد find-links لكن أولا فعّل البيئة الافتراضية ثم اكتب
pip install --no-index --find-links=~/wheels Django pip install --no-index --find-links=~/wheels -r requirements.txt
اكتب بصلاحيات الجذر
yum install python-pip python-pillow python-lxml python-psutil python-simplejson python-ldap python-crypto python-pwquality PyYAML MySQL-python python-psycopg2 libxslt-python python-greenlet python-gevent python-gevent-socketio python-gevent-websocket pip install wheel virtualenv
الآن كمستخدم عادي
mkdir ~/wheels pip wheel -w ~/wheels Django==1.8 virtualenv --system-site-packages proj1 cd proj1 source ./bin/activate pip install --no-index --find-links=~/wheels Django==1.8 django-admin django-admin startproject myproj cd myproj ./manage.py runserver
تشغيل بايثون باستعمال جافاسكربت يعني إمكانية كتابة برامج بايثون وتنفيذها على المتصفح دون وجود خادم. هذا ما يقوم به مشروع skulpt. إذا دخلت موقعهم ستجد صندوق يمكنك كتابة برنامج على بايثون ثم تنفيذه عبر CTRL+ENTER يمكنك زيارة الموقع