أعجوبة

البرمجيات الحُرة والمفتوحة المصدر

أدوات المستخدم

أدوات الموقع


docs:python_basics

جدول المحتويات

بدهيات بايثون

مزايا لغة بايثون

تعتبر بايثون من أسهل وأنظف لغات البرمجة ومع ذلك فهي من أقوى لغات البرمجة في نفس الوقت. تمتاز بايثون بأنها لغة متعددة المبادئ multi paradigm فهي

  • لغة إجرائية Procedural programming
  • تدعم البرمجة الدالية functional programming أو lambda programming
  • موجهة للكائنات OOP

لمحة تاريخية

إن اللغة البرمجية النصية 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 بعدة أضعاف.

وتستخدم غوغل بايثون في عدد كبير من الأمور.

FIXME

الحصول على بايثون للمنصات المختلفة

يمكن الحصول على مفسر بايثون للمنصات المختلفة من خلال 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

الإصدار 2.6.5 الظاهر في الأمثلة السابقة هو مجرد مثال للتوضيح لكنه الإصدار المستخدم في هذه الوثيقة.

مفسر بايثون التفاعلي

تشغيل المفسر

في لينكس يكفي كتابة python في الطرفية terminal (أي سطر الأوامر) لتشغيل مفسر بايثون التفاعلي. ذلك سيؤدي لتشغيل الملف ‪ /usr/bin/python ‬

في ويندوز تجد ملفين لتشغيل بايثون python.exe و pythonw.exe الأول يظهر محاورة سطر أوامر console (وهو ما نريده الآن) والثاني لا يظهر محاورة ويستخدم الثاني كمفسر للبرامج الرسومية التي لا ينبغي أن تظهر الطرفية عند تشغيلها ولتمييزها تعطى تلك البرامج اللاحقة pyw عوضا عن اللاحقة التقليدية. إن كنت تريد أن تعمل بايثون كما في لينكس أي عندما تكتب python في سطر الأوامر (وليس عن طريق النقر على أيقونة الملف python.exe أو القوائم) عليك أن تضيفها إلى مسار التشغيل PATH عن طريق إتباع الخطوات التالية:

  • الضغط بالزر الايمن علي My Computer وإختيار Properties
  • ثم إخيتار Advanced

شاشة إخيتار Advanced

  • ثم إختيار Environment Variables

شاشة إخيتار Environment Variables

  • ثم أسفل بند System variables نقوم بالضغط علي Path ثم الضغط علي Edit ثم إضافه ;C:\Python26 في أخر السطر الذي سوف يظهر ثم OK

شاشة إضافة مسار بايثون

عند تشغيل مفسر بايثون التفاعلي ستحصل على ما يشبه

[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 لم تسبقه علامة المحث »> وذلك للتمييز بين ما تدخله من أوامر والإجابة التي تحصل عليها.

ما تحصل عليه هو التمثيل المرئي repr للناتج الذي تعيده العملية.

"واحد" + "واحد" = أحد عشر !!

جرب الآن

"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 فكان الناتج النهائي صفرا.

في بايثون 3 القسمة الصحيحة أصبحت مزدوجة لتمييزها عن القسمة العادية وهي متوفرة في بايثون 2.6
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.

2 أكبر 12!

جرب الآن

>>> 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 قبل علامة الاقتباس.

ملاحظة: في بايثون 3 تم تغيير اسم string إلى bytes وتغيير unicode إلى string.

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

>>> "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'

يتم التخطي في نصوص بايثون عبر علامة سلاش المعكوسة \ حيث هناك معان خاص لما يأتي بعدها منها

  • n - سطر جديد (محرف رقم 10 في ASCII)
  • r - عودة لبداية السطر (محرف رقم 13)
  • t - علامة الجدولة
  • “ - علامة اقتباس متخطاة
  • ' - علامة اقتباس متخطاة
  • \ - علامة \ متخطاة
>>> '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

النوع bool اختصار ل Boolean أي منطقي يعني إما صواب وإما خطأ. وهو قيمتان:

  • True الصواب وهي تكافئ الواحد
  • False الخطأ وهي تكافئ الصفر

لاحظ أن 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
علامة المساواة المزدوجة هي عملية فحص المساواة وليست عملية إحلال assignment وناتجها منطقي أي إما صواب وإما خطأ. إذا استعملت الإحلال في سياق شرطي ستحصل على خطأ.

لكن عند التحويل إلى bool هناك الكثير من الأشياء تتحول إلى True أو إلى False مثلا أي عدد غير الصفر يعتبر صواب True حتى لو لم يمكن واحد

>>> bool(5)
True

العدم None

وهو كائن يمثل عدم وجود قيمة denoting lack of value

>>> None==False
False
>>> bool(None)==False
True

الكائنات متعددة العناصر

بايثون يدعم عدد كبير من مثل هذه الكائنات فإلى جانب السلاسل النصية لدينا الكائنات التالية:

  • اللوائح lists - مجموعة من العناصر المرتبة (المتسلسلة واحدة بعد الأخرى) نميزها بعلامة القوس المربع [ ].
  • المرتبات tuples - كما سابقتها لكنها ثابتة العدد بل والعناصر. نميزها بالقوس الهلالي ( ).
  • المجموعات - حيث عناصرها فريدة (لا تتكرر) غير مرتبة لكنها مفهرسة
  • القواميس - مجموعة من العناصر تسمى القيم values كل واحد فيها يرتبط بمفتاح key فريد مفهرس يشير إلي. نميزها بالحاصرة { } حيث نضع علامة : بين المفتاح والقيمة. وتسمى القواميس في لغات أخرى المقاطع hash أو المنظومات المرتبطة associative array
العناصر يمكن أن تكون من أي نوع (بما في ذلك الكائنات متعددة العناصر كأن يكون لديك قاموس عناصره لوائح عناصرها مجموعات…) بل ويمكن أن تكون هجينة من أنواع مختلفة.

في المثال التالي سنتعرف على طريقة تعريف مثل هذه الكائنات والوصول لعناصرها

>>> 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 قبل علامة الاقتباس.

في بايثون 3 عبارة print أصبحة دالة أي أنها بحاجة لأقواس حول ما تريد طباعته

طلب مدخلات raw_input

الدالة 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

يقدم مفسر بايثون التفاعلي المحسن ipython العديد من المزايا مثل الإكمال التلقائي بواسطة زر الجدولة TAB. كذلك تدعم تصفح الكود ملونا وتمحيص البرنامج debug وتحليله profile وغيرها من المزايا.

استخدام الوثائق

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

مع تغير الرقم 2.7 إلى رقم إصدار بايثون

محرك البحث في الوثائق المحلية يعمل دون اتصال بالإنترنت
إن لم تجد تلك الملفات موجودة قد تكون الحزمة python-docs غير مثبتة أو مثبتة في مكان مختلف راجع مدير الحزم في نظام التشغيل عندك.

كذلك يوجد نظام مساعدة تفاعلي مبني في بايثون يمكن تشغيله على شكل خادم محلي (لا يحتاج أباتشي أو أي خادم آخر) فقط اكتب pydoc -p ثم اتبعها برقم المنفذ ثم افتح العنوان الذي يعطيك إياه في متصفح الإنترنت

[alsadi@localhost ~]$ pydoc -p 4321
pydoc server ready at http://localhost:4321/

بيئات التطوير

بيئة الكسوف الشمسي Eclipse

هناك إضافة اسمها PyDev لبيئة التطوير Eclipse. قم بتثبيت تلك الحزمة (في فيدورا/أعجوبة اسم الحزمة هو eclipse-pydev).

بعد تثبيت الحزمة (سواء في لينكس أو ويندوز) عليك إخباره عن مسار مفسر لغة بايثون وذلك بالخطوات التالية:

من قائمة Window اختر التفضيلات Preferences ثم بند python interpreter ثم New ثم حدد المسار ليكون ‎/usr/bin/python‎ ثم وافق.

إضافة مفسر لغة بايثون

المسارات الموجودة في أسفل النافذة هي للحزم الإضافية الخاصة بلغة بايثون حيث يقوم بسبرها لعمل إكمال تلقائي حقيقي. الإكمال التلقائي يعمل عبر ضغط CTRL مع مسافة.

من بيئة eclipse

لإنشاء برنامج جديد اذهب إلى قائمة ملف File ثم جديد new ثم Pydev project ثم أضف ملفات الوحدات والحزم بالنقر بالزر الأيمن على مجلد src في القائمة الجانية للمشروع ثم جديد new ثم Pydev module و Pydev Package على الترتيب. لعمل برنامج عادي أضف واحدة pydev module وأعطها اسمها مناسبا واختر قالب main مثلا>

شاشة إنشاء ملف وحدة بايثون

يمكنك التعرف على المفاتيح السريعة من خلال نافذة window ثم تفضيلات preference ثم انظر إلى keys كما في الصورة

نافذة تخصيص المفاتيح

مثلا:

  • لتشغيل البرنامج اضغط F9
  • لتعيين نقطة توقّف لتمحيص البرنامج اضغط CTRL مع F11 ثم اختر add a break point
  • للتشغيل في طور التمحيص debug اضغط F11
  • للسير خطوة F5 أو F6 الأولى تمحص داخل التفرعات step into والثانية تتخطى للخطوة التالية مباشرة
  • للسير حتى أول نقطة توقف اضغط F8

للعودة إلى منظور التطوير والخروج من منظور التمحيص انقر على أيقونة الثعابين pydev تجدها في الطرف البعيد من شريط الأدوات. وللعودة مرة أخرى لمنظور التمحيص انقر على أيقونة التحميص debug وهي على شكل حشرة.

بيئة PyScripter لنظام ويندوز

من أفضل وأخف البيئات المتوفرة وهي مكتوبة على لغة دلفي مما يجعلها حصرية لنظام ويندوز

كتابة برنامج

حفظ الملف وتشغيله

التحكم في انسياب البرنامج

الشرط if

حلقات for التكرارية

حلقات for المضمنة

الكود التالي يولد أول 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']

التكرار بواسطة "طالما" while

الاستثناءات exceptions

a=int('10')
b=int('a')
a=int('10')
try:  b=int('a')
except ValueError: print "error"; exit(1)

الدوال functions

التعريف والاستدعاء

لتعريف دالة اكتب 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 والمتغيرات العامة global variables

في لغات البرمجة هناك ما يعرف بأفق المتغيّرات 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 فإنك تعدل على نفس الكائن

عملية yield والكائنات المولدة generators

الدوال الضمنية lambda

أساسيات مكتبة بايثون القياسية

العمليات على الكائنات متعددة العناصر

الفئات classes

تتبع الأخطاء

فهم error trace

توثيق البرنامج

التعامل مع الملفات

عناصر مكتبة بايثون القياسية المتقدمة

وحدة re الخاصة بالأنماط القياسية

كتابة وحدة module

كتابة حزمة package

وحدات وحزم إضافية

هناك عدد كبير جدا من الحزم التي تقوم بأي شيء تقريبا لذا لا تعد اختراع العجلة.

موقع فهرس الحزم PyPI

يعتبر موقع PyPI أي Python Package Index أول مكان تبحث فيه عن حزم إضافية. يمتاز هذا الموقع بأنه يحتوي على صندوق بحث ويحتوي على معلومات مثل رابط آخر إصدارة أو رابط الوثائق ويبين درجة نضوج الحزمة.

قد يوفر لك هذا الموقع روابط exe أو حزم rpm لكنه في الغالب يوفر كود مصدري في أرشيف zip أو tarball بعد فك ضغطه ادخل المجلد واكتب

python setup.py install
لا ننصحك بتشويش نظام الحزم الخاص بتوزيعة بتثبيت حزم من وراء ظهره عبر setup.py أو غيره من الأدوات.

استخدام مستودعات التوزيعة

من أكثر أساليب التثبيت سهولة هو استخدام مدير الحزم الخاص بتوزيعتك مثلا لتثبيت حزمة 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

مدير حزم بايثون pip و easy_install و wheel

أداة 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) ويمكنك من تحديد شروط معينة مثل رقم الإصدار أو ما شابه

تجنب عمل تشويش بين الحزم التي تأتي من نظام التشغيل والتي تثبتها في النظام من وراء ظهر مدير حزم النظام عبر easy_install أو pip بصلاحيات الجذر.

على الخوادم يمكنك فصل كل تطبيق في مستخدم وتثبيت متطلبات التطبيق في بيته مثلا اكتب الأمر التالي بصلاحيات المستخدم العادي (وليس الجذر) صاحب التطبيق

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

التكامل مع لغة سي عبر Cython

التكامل مع لغة جافا عبر Jython

مفسرات استثنائية غريبة

مفسر بايثون المكتوب على بايثون PyPy

مفسر بايثون المكتوب على جافاسكربت

تشغيل بايثون باستعمال جافاسكربت يعني إمكانية كتابة برامج بايثون وتنفيذها على المتصفح دون وجود خادم. هذا ما يقوم به مشروع skulpt. إذا دخلت موقعهم ستجد صندوق يمكنك كتابة برنامج على بايثون ثم تنفيذه عبر CTRL+ENTER يمكنك زيارة الموقع

عمل حزم rpm و deb

عمل ملفات تنفيذية exe لنظام ويندوز

docs/python_basics.txt · آخر تعديل: 2015/08/14 17:42 بواسطة alsadi

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki