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

أدوات الموقع


docs:python_basics

اختلافات

عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة.

رابط إلى هذه المقارنة

جانبي المراجعة السابقة المراجعة السابقة
docs:python_basics [2015/08/14 13:52]
alsadi حزم تحتاج تصنيف
docs:python_basics [2015/08/14 14:42] (حالي)
alsadi
سطر 1: سطر 1:
 +{{tag>​مقالات برمجة بايثون بدهيات}}
 +====== بدهيات بايثون ======
 +{{:​docs:​python-logo.png |شعار لغة بايثون}}
  
 +  * هذه المقالة لم تكتمل بعد
 +  * سيتم دمج عدة مقالات فيها
 +    * [[http://​cltb.ojuba.org/​ar/​articles/​pygtk.html|الأجزاء العامة من مقالة البرمجة الرسومية القديمة]]
 +    * محاضرات الأستاذ مسلم عادل
 +      * [[http://​lac-irc.co.cc/​session02.log.html]]
 +      * [[http://​www.linuxac.org/​forum/​showthread.php?​37835]]
 +    * [[http://​cltb.ojuba.org/​ar/​python.html|بايثون من كتاب لينكس الشامل]]
 +
 +===== مزايا لغة بايثون =====
 +تعتبر بايثون من أسهل وأنظف لغات البرمجة ومع ذلك فهي من أقوى لغات البرمجة في نفس الوقت.
 +تمتاز بايثون بأنها لغة متعددة المبادئ 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 من الصفحة السابقة (مثلا [[http://​www.python.org/​ftp/​python/​2.6.5/​python-2.6.5.msi|python-2.6.5.msi]] أما التي تنتهي ب amd64.msi فهي لنظام ويندوز ذي 64-بت) يتم تثبيت هذا الملف بالنقر المزدوج عليه.
 +
 +كذلك هناك حل مفيد جدا لمستخدمي ويندوز وهو www.PortablePython.com وهي حزمة تحتوي نسخة منقولة من لغة بايثون تحتوي على الكثير من الإضافات (مثل واجهات SPE IDE و PyScripter وغيرها) بعد تشغيل ملف exe الموجود عليها يمكنك وضع المجلد الناتج منها على ذاكرة فلاش ثم تشغيل بايثون منها دون الحاجة لعمل setup.
 +
 +في ماك يمكنك الحصول على حزمة dmg من نفس الصفحة مثلا [[http://​www.python.org/​ftp/​python/​2.6.5/​python-2.6.5-macosx10.3-2010-03-24.dmg|python-2.6.5-macosx10.3-2010-03-24.dmg]]
 +
 +<​note>​
 +الإصدار ​ 2.6.5 الظاهر في الأمثلة السابقة هو مجرد مثال للتوضيح لكنه الإصدار المستخدم في هذه الوثيقة.
 +</​note>​
 +
 +===== مفسر بايثون التفاعلي =====
 +==== تشغيل المفسر ====
 +في لينكس يكفي كتابة python في الطرفية terminal (أي سطر الأوامر) لتشغيل مفسر بايثون التفاعلي. ذلك سيؤدي لتشغيل الملف ​ ‪ /​usr/​bin/​python ‬ 
 +
 +في ويندوز تجد ملفين لتشغيل بايثون python.exe و pythonw.exe الأول يظهر محاورة سطر أوامر console (وهو ما نريده الآن) والثاني لا يظهر محاورة ويستخدم الثاني كمفسر للبرامج الرسومية التي لا ينبغي أن تظهر الطرفية عند تشغيلها ولتمييزها تعطى تلك البرامج اللاحقة pyw عوضا عن اللاحقة التقليدية. إن كنت تريد أن تعمل بايثون كما في لينكس أي عندما تكتب python في سطر الأوامر (وليس عن طريق النقر على أيقونة الملف python.exe أو القوائم) عليك أن تضيفها إلى مسار التشغيل PATH عن طريق إتباع الخطوات التالية:​
 +  * الضغط بالزر الايمن علي My Computer وإختيار Properties
 +  * ثم إخيتار Advanced
 +{{ pyb-path1.jpg?​300 |شاشة إخيتار Advanced }}
 +
 +  * ثم إختيار Environment Variables
 +{{ pyb-path2.jpg?​300 |شاشة إخيتار Environment Variables}}
 +
 +  * ثم أسفل بند System variables نقوم بالضغط علي Path ثم الضغط علي Edit ثم إضافه ;​C:​\Python26 في أخر السطر الذي سوف يظهر ثم OK
 +{{ pyb-path3.jpg?​300 |شاشة إضافة مسار بايثون }}
 +
 +عند تشغيل مفسر بايثون التفاعلي ستحصل على ما يشبه
 +<​code>​
 +[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.
 +>>> ​
 +</​code>​
 +
 +العلامة ''>>>''​ هي محث إدخال الأوامر.
 +
 +==== استعمال بايثون كآلة حاسبة ====
 +=== جلسة أولى ===
 +في مفسر بايثون التفاعلي اكتب 1+1 حتى تكون الشاشة عندك هكذا
 +<​code>​
 +[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
 +>>> ​
 +</​code>​
 +
 +لاحظ أن الجواب وهو 2 لم تسبقه علامة المحث ''>>>''​ وذلك للتمييز بين ما تدخله من أوامر والإجابة التي تحصل عليها.
 +
 +<note important>​ما تحصل عليه هو التمثيل المرئي **repr** للناتج الذي تعيده العملية.</​note>​
 +
 +=== "​واحد"​ + "​واحد"​ = أحد عشر !! ===
 +جرب الآن
 +<code python>
 +"​1"​+"​1"​
 +</​code>​
 +ستحصل على شاشة تشبه
 +<​code>​
 +[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'​
 +</​code>​
 +والسبب أن "​1"​ عبارة عن سلسلة نصية وليس عدد صحيح. وهذا يدلنا على أن بايثون لغة تحترم أنواع البيانات.
 +
 +=== ثلث الثلاثة صفر!! ===
 +جرب الآن
 +<code python>
 +1/3*3
 +</​code>​
 +
 +ستحصل على شاشة تشبه
 +<​code>​
 +[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
 +</​code>​
 +نعم أنت لم تخطئ. الجواب صفر وليس واحد!! لأننا قمنا بعملية قسمة صحيحة 1 تقسيم 3 الجواب صفر (والباقي 1) ثم ضربنا الناتج الذي هو صفر في 3 فكان الناتج النهائي صفرا.
 +
 +<note tip>في بايثون 3 القسمة الصحيحة أصبحت مزدوجة لتمييزها عن القسمة العادية وهي متوفرة في بايثون 2.6</​note>​
 +
 +<code python>
 +1//3*3
 +</​code>​
 +
 +=== ثلث الثلاثة واحد! ===
 +جرب الآن
 +<code python>
 +1.0/3.0*3.0
 +</​code>​
 +وستحصل على الجواب الذي نتوقع وهو 1.0 هكذا
 +<​code>​
 +>>>​ 1.0/3.0*3.0
 +1.0
 +</​code>​
 +بل وحتى ​
 +<code python>
 +1.0/3*3
 +</​code>​
 +
 +ستعطي نفس الجواب. السبب هو أن نوع العدد 1.0 ليس عددا صحيحا كما في 1 بل هو عدد نسبي float (يجوز أن يحتوي كسور مثل الربع). وناتج قسمة عدد نسبي على عدد صحيح هو عدد نسبي وناتج ضرب عدد نسبي في عدد صحيح هي عدد نسبي لهذا حصلنا على الجواب 1.0.
 +
 +=== 2 أكبر 12! ===
 +جرب الآن
 +<code python>
 +>>>​ 12 > 2
 +True
 +>>>​ "​12"​ > "​2"​
 +False
 +</​code>​
 +الوضع الطبيعي أن تكون 12 أكبر من 2 كما في أول مثال لكن عندما تكون **نصوص** فيتم مقارنتها محرف محرف وهنا نحصل على النتيجة الغربية.
 +
 +
 +=== الأولويات والأقواس ===
 +تأمل الجلسة التالية على مفسر بايثون التفاعلي
 +<​code>​
 +>>>​ 1-1*2
 +-1
 +>>>​ (1-1)*2
 +0
 +>>>​ 1-(1*2)
 +-1
 +</​code>​
 +
 +لاحظ أن أول عملية لم تتم بالترتيب الذي طبعت فيه وإنما تم تنفيذ عملية الضرب قبل الطرح لأن أولويتها أعلى.
 +
 +=== الاتجاه ===
 +تأمل الجلسة التالية على مفسر بايثون التفاعلي
 +
 +<​code>​
 +>>>​ 2**3**2
 +512
 +>>>​ (2**3)**2
 +64
 +>>>​ 2**(3**2)
 +512
 +>>> ​
 +</​code>​
 +بعض العمليات مثل عملية الرفع لقوة (علامتي * متتابعتين) تنفذ من اليمين لليسار.
 +
 +=== المتغيرات ===
 +يمكنك تعريف متغيرات بواسطة عملية الإحلال assignment ورمزها علامة المساواة "​="​
 +
 +<​code>​
 +>>>​ a=1
 +>>>​ b=2
 +>>>​ a+b
 +3
 +</​code>​
 +
 +ويمكنك وضع قيمة في أكثر من متغير
 +<​code>​
 +>>>​ x=y=2
 +>>>​ z=x+y
 +>>>​ z
 +4
 +</​code>​
 +
 +ويمكنك وضع أكثر من قيمة في أكثر من متغير (إن تساوى عدد القيم والمتغيرات)
 +<​code>​
 +>>>​ i,j=3,4
 +>>>​ i+j
 +7
 +</​code>​
 +
 +
 +=== المزيد من الوثائق ===
 +
 +  * http://​docs.python.org/​tutorial/​introduction.html#​using-python-as-a-calculator - الوثيقة التعليمية
 +  * http://​docs.python.org/​library/​stdtypes.html#​numeric-types-int-float-long-complex - العمليات
 +  * http://​docs.python.org/​reference/​expressions.html#​summary - الأولويات
 +
 +==== الأنواع المبنية في بايثون ====
 +=== الأرقام والتعامل معها ===
 +يمكنك تقديم الأعداد الصحيحة بأي أساس شئت مثلا يمكنك كتابتها بالنظام العشري مثل ''​197''​ كذلك يمكنك التعبير عنها بالنظام الثماني بأن تبدأ العدد بصفر (كعلامة مميزة للنظام الثماني) مثلا ''​012''​ تعني 10 أو بالنظام الست-عشري بأن تبدأ بصفر ثم x كعلامة مميزة حيث ''​0x12''​ تعني 18 أو حتى بالنظام الثنائي وعلامته 0b حيث ''​0b101''​ تعني 5
 +
 +تأمل هذه الجلسة
 +<​code>​
 +>>>​ 010 + 1
 +9
 +>>>​ 0x10 + 1
 +17
 +>>>​ 0b101+2
 +7
 +</​code>​
 +
 +كذلك تدعم بايثون أعداد صحيحة عملاقة تسمى long  ونميزها من اللاحقة L تأمل عدد المنازل في هذا المثال:​
 +<​code>​
 +>>>​ 5**100-1
 +7888609052210118054117285652827862296732064351090230047702789306640624L
 +</​code>​
 +
 +كذلك تدعم بايثون أعداد نسبية (فيها كسور) تسمى أعداد الفاصلة العائمة float ونميزها من الفاصلة العشرية مثل واحد 1.0 أو مثل واحد ونصف 1.5 كذلك يمكنك استخدام أسلوب الفاصلة العائمة أو ما يعرف بالأسلوب "​الهندسي"​ عند التعبير عن الرقم هكذا
 +<​code>​
 +>>>​ 0.5e3
 +500.0
 +>>>​ 3.0e8
 +300000000.0
 +>>>​ 1.0e-3
 +0.001
 +>>>​ 1.5e6-(1*10**6)
 +500000.0
 +</​code>​
 +
 +حيث نكتب رقم ثم e أي exponential ثم القوة مثلا ''​3.0e8''​ تعني 3 مضروبة في 10 مرفوعة للقوة 8 يعني 3 أمامها 8 أصفار.
 +
 +كذلك تدعم بايثون الأعداد المركبة (التخيلية) حيث يعبر عن العدد التخيلي فيها بالرمز j هكذا
 +
 +<​code>​
 +>>>​ 5j
 +5j
 +>>>​ 1+5j
 +(1+5j)
 +>>>​ (1+5j)*(1-5j)
 +(26+0j)
 +</​code>​
 +
 +=== النصوص والتعامل معها ===
 +تدعم بايثون نوعين من السلاسل النصية واحدة اسمها string وهي سلسلة من البايتات a sequence of bytes أي أنها مجرد بقعة هلامية blob من البيانات الخام.
 +
 +أما الثانية فهي كائنات يونيكود unicode التي هي سلسلة من المحارف العالمية يونيكود a sequence of unicode characters ونميزها من خلال وجود علامة u قبل علامة الاقتباس.
 +
 +<note tip>​ملاحظة:​ في بايثون 3 تم تغيير اسم string إلى bytes وتغيير unicode إلى string.</​note>​
 +
 +يتم تمثيل النص بواسطة علامة الاقتباس المفردة أو المزدوجة ولا فرق بينهما سوى أن واحدة منهما تساعدك على تخطي حالات الخاصة يجب تخطيها في الأخرى. لاحظ هذا المثال:​
 +
 +<​code>​
 +>>>​ "​I'​m using python"​
 +"​I'​m using python"​
 +>>>​ 'he said: "​Hello"'​
 +'he said: "​Hello"'​
 +</​code>​
 +ففي المثال الأول لزمني وضع علامة الاقتباس المفردة بين I و m فلو استخدمت الاقتباس المفرد في إحاطة السلسلة لانتهت بعد I ولكان ما بعدها خطأ في الصياغة.
 +
 +كذلك الحال في الثانية حيث أريد نص تكون كلمة Hello فيه محاطة بعلامة اقتباس مزدوجة فلو كانت السلسلة النصية كلها محاطة باقتباس مزدوج لانتهى قبل كلمة Hello ولكان ما بعدها خطأ في الصياغة
 +
 +<​code>​
 +>>>​ '​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
 +</​code>​
 +
 +يجدر بنا الإشارة أن بايثون تسمح بمتابعة النص بعلامة اقتباس مختلفة
 +<​code>​
 +>>>​ "​a"'​b'​
 +'​ab'​
 +</​code>​
 +
 +يتم التخطي في نصوص بايثون عبر علامة سلاش المعكوسة \ حيث هناك معان خاص لما يأتي بعدها منها
 +  * n - سطر جديد (محرف رقم 10 في ASCII)
 +  * r - عودة لبداية السطر (محرف رقم 13)
 +  * t - علامة الجدولة
 +  * " - علامة اقتباس متخطاة
 +  * ' - علامة اقتباس متخطاة
 +  * \ - علامة \ متخطاة
 +
 +<​code>​
 +>>>​ '​I\'​m using python'​
 +"​I'​m using python"​
 +</​code>​
 +
 +فإن كنت لا ترغب بتفعيل خاصية تخطي \ بتكرارها كل ما عليك هو وضع r قبل علامة الاقتباس (بعد u في حالة كائنات يونيكود) وهذا مفيد في تمثيل الأنماط القياسية والماسارات على نظام ويندوز.
 +
 +كذلك تأتي بايثون بصيغة مفيدة جدا في تمثيل النصوص الطويلة وهي الاقتباس الثلاثي (المفرد والمزدوج) حيث يمتاز بأنه يمتدل على أكثر من سطر حتى يغلق بتتابع ثلاثة علامات معا.
 +<​code>​
 +>>>​ '''​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."
 +</​code>​
 +
 +=== الكائنات المنطقية bool ===
 +النوع bool اختصار ل Boolean أي منطقي يعني إما صواب وإما خطأ. وهو قيمتان:​
 +  * True الصواب وهي تكافئ الواحد
 +  * False الخطأ وهي تكافئ الصفر
 +
 +لاحظ أن True و False تكتب بأحرف أولى كبيرة.
 +
 +تأمل هذه الأمثلة
 +<​code>​
 +>>>​ 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
 +</​code>​
 +
 +<note warning>​علامة المساواة المزدوجة هي عملية فحص المساواة وليست عملية إحلال assignment ​ وناتجها منطقي أي إما صواب وإما خطأ. إذا استعملت الإحلال في سياق شرطي ستحصل على خطأ.</​note>​
 +
 +لكن عند التحويل إلى bool هناك الكثير من الأشياء تتحول إلى True أو إلى False
 +مثلا أي عدد غير الصفر يعتبر صواب True حتى لو لم يمكن واحد
 +<​code>​
 +>>>​ bool(5)
 +True
 +</​code>​
 +
 +=== العدم None ===
 +وهو كائن يمثل عدم وجود قيمة denoting lack of value
 +
 +<​code>​
 +>>>​ None==False
 +False
 +>>>​ bool(None)==False
 +True
 +</​code>​
 +
 +  * http://​docs.python.org/​library/​constants.html#​None
 +
 +=== الكائنات متعددة العناصر ===
 +بايثون يدعم عدد كبير من مثل هذه الكائنات فإلى جانب السلاسل النصية لدينا الكائنات التالية:​
 +
 +  * اللوائح lists - مجموعة من العناصر المرتبة (المتسلسلة واحدة بعد الأخرى) نميزها بعلامة القوس المربع [ ].
 +  * المرتبات tuples - كما سابقتها لكنها ثابتة العدد بل والعناصر. نميزها بالقوس الهلالي ( ).
 +  * المجموعات - حيث عناصرها فريدة (لا تتكرر) غير مرتبة ​ لكنها **مفهرسة**
 +  * القواميس - مجموعة من العناصر تسمى القيم values كل واحد فيها يرتبط بمفتاح key فريد مفهرس يشير إلي. نميزها بالحاصرة { } حيث نضع علامة : بين المفتاح والقيمة. وتسمى القواميس في لغات أخرى المقاطع hash أو المنظومات المرتبطة associative array
 +
 +<note tip>​العناصر يمكن أن تكون من أي نوع (بما في ذلك الكائنات متعددة العناصر كأن يكون لديك قاموس عناصره لوائح عناصرها مجموعات...) بل ويمكن أن تكون هجينة من أنواع مختلفة.</​note>​
 +
 +في المثال التالي سنتعرف على طريقة تعريف مثل هذه الكائنات والوصول لعناصرها
 +<​code>​
 +>>>​ 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
 +</​code>​
 +
 +لاحظ أن اللائحة التي عرّفناها تتكون من 3 عناصر كل منها من نوع مختلف وهي على الترتيب سلسلة نصية ثم عدد صحيح ثم عدد نسبي.
 +كذلك لاحظ استخدام الحاصرات المربعة [ ] للوصول للعنصر علم ترتيبه حيث نضع أقل من رقمه بواحد يسمى index (وهي الإزاحة عن البداية offset يعني العد يبدأ من صفر للعنصر الأول) أي أن قيمه تكون من صفر وحتى عدد العناصر ناقس واحد فإن تجاوزت العدد تحصل عل IndexError.
 +
 +كما يمكنك تقديم إزاحة سالبة وتعني عد العناصر من آخر اللائحة فيكون -1 هو آخر عنصر
 +<​code>​
 +>>>​ t=('​one',​ 2 , 3.0)
 +>>>​ t[-1]
 +3.0
 +>>>​ t[-2]
 +2
 +>>>​ t[-3]
 +'​one'​
 +</​code>​
 +
 +لاحظ أنني في هذا المثال الأخير استخدمت المرتب tuple وذلك واضح من الأقواس الهلالية عند تعريفه.
 +
 +يفضل أن تنهي تعريف المرتب بفاصلة زائدة حتى نميز حالة المرتيب ذي العنصر الواحد من حالة أقواس إعطاء الأولوية. في المثال التالي t1 ليست مرتب وإنما عدد صحيح أما t2 فهي مرتب من عنصر واحد
 +<​code>​
 +>>>​ t1=(5)
 +>>>​ t1
 +5
 +>>>​ t2=(5,)
 +>>>​ t2
 +(5,)
 +</​code>​
 +
 +==== الطباعة على الشاشة ====
 +يمكنك الطباعة على الشاشة بواسطة print ثم الكائنات التي تريد طباعته يفصل بينها فاصلة ","​. بايثون تضيف علامة سطر جديد بعد كل print ما لم تضيف فاصلة زائدة في آخر الكائنات.
 +
 +<​code>​
 +>>>​ 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
 +</​code>​
 +
 +المثال الأخير لم يطبع ما كنت تتوقعه حيث علامة \ متبوعة بحرف n تعني سطر جديد للحصول على ما تريد يمكنك تكرار علامة \ حتى تتخطاها أو تستعمل r قبل علامة الاقتباس.
 +
 +<note tip>في بايثون 3 عبارة print أصبحة دالة أي أنها بحاجة لأقواس حول ما تريد طباعته</​note>​
 +
 +==== طلب مدخلات raw_input ====
 +
 +الدالة raw_input تعرض محث لاستلام مدخلات ثم تعيد سلسلة نصية
 +
 +<code python>
 +>>>​ n=raw_input("​Enter your name: ")
 +Enter your name: Ahmad
 +>>>​ print "Hello ", n
 +Hello  Ahmad
 +</​code>​
 +
 +إذا كنت تريد قيمة عددية صحيحة يمكنك التحويل عبر int مثلا
 +<code python>
 +>>>​ w=int(raw_input("​Enter width: "))
 +Enter width: 15
 +>>>​ h=int(raw_input("​Enter hieght: "))
 +Enter hieght: 2
 +>>>​ print "​Area=",​ w*h
 +Area= 30
 +</​code>​
 +
 +
 +==== المساعدة الآنية ====
 +يمكنك طلب المساعدة حول أي كائن (بما في ذلك الدوال والوحدات)
 +
 +<code python>
 +help(sum)
 +l=[1,2,3]
 +help(l)
 +</​code>​
 +
 +==== تفعيل الإكمال التلقائي ====
 +كتابة السطرين التاليين في مفسر بايثون التفاعلي يفعّل الإكمال التلقائي عبر زر TAB
 +<code python>
 +import readline, rlcompleter
 +readline.parse_and_bind("​tab:​ complete"​)
 +</​code>​
 +
 +لتفعيل الإكمال التلقائي ذاتيا في المفسر التفاعلي اكتب
 +
 +<code bash>
 +echo '​import readline, rlcompleter;​ readline.parse_and_bind("​tab:​ complete"​)'​ >> ~/​.pythonrc.py
 +echo '​export PYTHONSTARTUP=~/​.pythonrc.py'​ >> ~/.bashrc
 +source ~/.bashrc
 +</​code>​
 +
 +عندها سيُفعّل ذلك في الطرفية الحالية وكل الطرفيات التي تفتح بعد ذلك.
 +
 +عيوب هذه الطريقة أنه عندها لا يمكنك استعمال TAB كجزء من الكود بل يجب استخدام المسافة لعمل الإزاحة البادئة (لكن هذا ليس بشيء حيث ينصح بشكل عام بعدم الخلط بين الاثنتين والاكتفاء بالمسافة لأن مقدار إزاحة TAB غير ثابت في كل المحررات)
 +
 +==== برنامج ipython ====
 +يقدم مفسر بايثون التفاعلي المحسن ipython العديد من المزايا مثل الإكمال التلقائي بواسطة زر الجدولة TAB. كذلك تدعم تصفح الكود ملونا وتمحيص البرنامج debug وتحليله profile وغيرها من المزايا.
 +
 +
 +  * [[http://​ipython.scipy.org/​doc/​manual/​html/​interactive/​tutorial.html|تعليم ipython]]
 +
 +===== استخدام الوثائق =====
 +موقع بايثون غني بالوثائق وهي أيضا موجودة للتصف دون إنترنت من خلال نسخة محلية موجودة على جهازك
 +
 +  * الصفحة الرئيسية
 +    * على النت http://​docs.python.org/​
 +    * دون نت /​usr/​share/​doc/​python-docs-2.7/​html/​index.html
 +  * التعليمية
 +    * على النت http://​docs.python.org/​tutorial/​index.html
 +    * دون نت /​usr/​share/​doc/​python-docs-2.7/​html/​tutorial/​index.html
 +  * قائمة الحزم والوحدات
 +    * على النت http://​docs.python.org/​modindex.html
 +    * دون نت /​usr/​share/​doc/​python-docs-2.7/​html/​py-modindex.html
 +
 +مع تغير الرقم 2.7 إلى رقم إصدار بايثون
 +
 +<note tip>
 +محرك البحث في الوثائق المحلية يعمل دون اتصال بالإنترنت
 +</​note>​
 +
 +<​note>​
 +إن لم تجد تلك الملفات موجودة قد تكون الحزمة python-docs غير مثبتة أو مثبتة في مكان مختلف راجع مدير الحزم في نظام التشغيل عندك.
 +</​note>​
 +
 +كذلك يوجد نظام مساعدة تفاعلي مبني في بايثون يمكن تشغيله على شكل خادم محلي (لا يحتاج أباتشي أو أي خادم آخر) فقط اكتب pydoc -p ثم اتبعها برقم المنفذ ثم افتح العنوان الذي يعطيك إياه في متصفح الإنترنت
 +
 +<code bash>
 +[alsadi@localhost ~]$ pydoc -p 4321
 +pydoc server ready at http://​localhost:​4321/​
 +</​code>​
 +
 +
 +===== بيئات التطوير =====
 +==== بيئة الكسوف الشمسي Eclipse ====
 +هناك إضافة اسمها PyDev لبيئة التطوير Eclipse. قم بتثبيت تلك الحزمة (في فيدورا/​أعجوبة اسم الحزمة هو eclipse-pydev).
 +
 +بعد تثبيت الحزمة (سواء في لينكس أو ويندوز) عليك إخباره عن مسار مفسر لغة بايثون وذلك بالخطوات التالية:​
 +
 +من قائمة Window اختر التفضيلات Preferences ثم بند python interpreter ثم New ثم حدد المسار ليكون ''​‎/​usr/​bin/​python‎''​ ثم وافق.
 +
 +{{ :​docs:​pyb-eclipse1.png?​480 |إضافة مفسر لغة بايثون}}
 +
 +المسارات الموجودة في أسفل النافذة هي للحزم الإضافية الخاصة بلغة بايثون حيث يقوم بسبرها لعمل إكمال تلقائي حقيقي. الإكمال التلقائي يعمل عبر ضغط CTRL مع مسافة.
 +
 +{{ :​docs:​pyb-eclipse2.png?​480 |من بيئة eclipse}}
 +
 +لإنشاء برنامج جديد اذهب إلى قائمة ملف File ثم جديد new ثم Pydev project ثم أضف ملفات الوحدات والحزم بالنقر بالزر الأيمن على مجلد src في القائمة الجانية للمشروع ثم جديد new ثم Pydev module و Pydev Package ​ على الترتيب. لعمل برنامج عادي أضف واحدة pydev module وأعطها اسمها مناسبا واختر قالب main مثلا>​
 +
 +{{ :​docs:​pyb-eclipse3.png?​480 |شاشة إنشاء ملف وحدة بايثون}}
 +
 +يمكنك التعرف على المفاتيح السريعة من خلال نافذة window ثم تفضيلات preference ثم انظر إلى keys كما في الصورة
 +
 +{{ :​docs:​pyb-eclipse4.png?​480 |نافذة تخصيص المفاتيح}}
 +
 +مثلا:
 +  * لتشغيل البرنامج اضغط F9
 +  * لتعيين نقطة توقّف لتمحيص البرنامج اضغط CTRL مع F11 ثم اختر add a break point
 +  * للتشغيل في طور التمحيص debug اضغط F11
 +  * للسير خطوة F5 أو F6 الأولى تمحص داخل التفرعات step into والثانية تتخطى للخطوة التالية مباشرة
 +  * للسير حتى أول نقطة توقف اضغط F8
 +
 +للعودة إلى منظور التطوير والخروج من منظور التمحيص انقر على أيقونة الثعابين pydev تجدها في الطرف البعيد من شريط الأدوات. وللعودة مرة أخرى لمنظور التمحيص انقر على أيقونة التحميص debug وهي على شكل حشرة.
 +
 +==== بيئة PyScripter لنظام ويندوز ====
 +من أفضل وأخف البيئات المتوفرة وهي مكتوبة على لغة دلفي مما يجعلها حصرية لنظام ويندوز
 +
 +  * http://​code.google.com/​p/​pyscripter/​
 +===== كتابة برنامج =====
 +==== حفظ الملف وتشغيله ====
 +==== التحكم في انسياب البرنامج ====
 +=== الشرط if ===
 +=== حلقات for التكرارية ===
 +=== حلقات for المضمنة ===
 +الكود التالي يولد أول 10 مربعات كاملة من 0×0 حتى 9×9
 +<​code>​
 +>>>​ [i*i for i in range(10)]
 +[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
 +</​code>​
 +
 +تأمل الكود التالي
 +<​code>​
 +>>>​ 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'​]
 +</​code>​
 +=== التكرار بواسطة "​طالما"​ while ===
 +=== الاستثناءات exceptions ===
 +<code python>
 +a=int('​10'​)
 +b=int('​a'​)
 +</​code>​
 +
 +<code python>
 +a=int('​10'​)
 +try:  b=int('​a'​)
 +except ValueError: print "​error";​ exit(1)
 +</​code>​
 +
 +==== الدوال functions ====
 +=== التعريف والاستدعاء ===
 +لتعريف دالة اكتب def ثم اسم الدالة ثم بين قوسين المعاملات ثم نقطتان رأسيتان مثلا
 +
 +<code python>
 +def hello(n):
 +  print "​Hello,​ "​+n+"​!!"​
 +</​code>​
 +
 +
 +
 +لاحظ أن المسافة البادئة هي التي تحديد الكود التابع للدالة. لاستدعاء الدالة نكتب اسم الدالة ثم بين قوسين نمرر لها المعاملات.
 +إليك هذه الجلسة
 +<code python>
 +>>>​ def hello(n):
 +...   print "​Hello,​ "​+n+"​!!"​
 +... 
 +>>>​ hello("​ali"​)
 +Hello, ali!!
 +</​code>​
 +
 +=== تمرير المعاملات ===
 +
 +يمكن أن نعطي المعاملات قيمة تلقائية حتى نجعلها اختيارية تأمل هذه الجلسة:​
 +
 +<code python>
 +>>>​ def hello(n="​world"​):​
 +...   print "​Hello,​ "​+n+"​!!"​
 +... 
 +>>>​ hello("​ali"​)
 +Hello, ali!!
 +>>>​ hello()
 +Hello, world!!
 +</​code>​
 +
 +المعاملات التي لا قيمة تلقائية لها يجب أن تسبق التي لها قيمة تلقائية هكذا
 +
 +<code python>
 +def test(a,​b,​c=3,​d=4):​
 +  print a,b,c,d
 +</​code>​
 +
 +في المثال السابق لا تستطيع استدعاء الدالة test بأقل من معاملين فإن مررت لها معاملين سيذهبان لملئ a ثم b على الترتيب والبقية ستأخذ القيمة التلقائية فإن زدت معامل سيذهب الثالث للمعامل c وتأخذ d القيمة التلقائية.
 +
 +يمكنك تمرير معامل في غير مكانه عبر تحديد اسمه
 +
 +<code python>
 +>>>​ 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
 +</​code>​
 +
 +يمكن للدوال أن تأخذ عدد غير محدود من المعاملات عبر وضع * قبل اسم متغير بهذا يحتوي ذلك المتغير كل ما بقي من معاملات على شكل قائمة list
 +
 +<code python>
 +def printargs(*a):​
 +  for i in a: print i
 +</​code>​
 +
 +تأمل هذه الجلسة
 +
 +<code python>
 +>>>​ def test(a,​b,​*c):​
 +...   print a,b,c
 +... 
 +>>>​ test(1,​2,​3,​4,​5,​6,​7)
 +1 2 (3, 4, 5, 6, 7)
 +</​code>​
 +
 +كذلك يمكن الحصول على تلك المعاملات على شكل قاموس مفاتيحه وقيمها هي اسماء المتغيرات وقيمها على الترتيب بوضع نجمتين قبل اسم المتغير القاموس هكذا
 +
 +<code python>
 +def test(**kw):
 +  print kw
 +</​code>​
 +
 +تأمل هذه الجلسة
 +
 +<code python>
 +>>>​ def test(**kw):
 +...   print kw
 +... 
 +>>>​ test(a=123,​b="​xyz"​)
 +{'​a':​ 123, '​b':​ '​xyz'​}
 +</​code>​
 +
 +إليك مثال عام جدا يأخذ خليط من جميع الطرق السابقة
 +<code python>
 +def test(a,​b,​c,​d=4,​e=5,​*args,​ **kw):
 +  print a,​b,​c,​d,​e,​args,​kw
 +</​code>​
 +
 +تأمل هذه الجلسة
 +<code python>
 +>>>​ 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}
 +</​code>​
 +
 +=== الأفق scope والمتغيرات العامة global variables ===
 +في لغات البرمجة هناك ما يعرف بأفق المتغيّرات scope وهو مدى مرئية ذاك المتغيّر في أجزاء البرنامج المختلفة.
 +
 +
 +
 +السلوك التلقائي في بايثون أن المتغيّر الذي تعرفه خارج الدالة في أفق ما يكون منظور للقراءة فقط داخل الدوال الفرعية. لاحظ في هذا المثال أن x المعرفة خارج الدالة printx كانت مرئية داخلها
 +
 +<​code>​
 +>>>​ x=5
 +>>>​ def printx(): print x
 +... 
 +>>>​ printx()
 +5
 +</​code>​
 +
 +
 +أما ما تعطيه قيمة داخل الدالة الفرعية (بالإحلال) فإنه يكون متغيرا محليا لا يعيش خارج ذلك الأفق. ففي هذا المثال الدالة setx دالة تضع القيمة التي نمررها لها في المتغير x وهذا يعني ضمنا أن x متغيّر محلي لا علاقة له مع المتغيرات التي لها نفس الاسم خارج الدالة.
 +
 +<​code>​
 +>>>​ def setx(a=10): x=a
 +... 
 +>>>​ x=5
 +>>>​ setx(15)
 +>>>​ x
 +5
 +</​code>​
 +
 +إن أردت تغيير هذا السلوك التلقائي كل ما عليك هو إعلان أن المقصود هو المتغير العام global variable عبر استخدام global ثم اسم المتغير هكذا قارن المثال السابق مع التالي:​
 +
 +<​code>​
 +>>>​ def setx(a=10): global x; x=a
 +... 
 +>>>​ x=5
 +>>>​ setx(15)
 +>>>​ x
 +15
 +</​code>​
 +
 +=== تعديل المعاملات ===
 +كما لاحظنا سابقا فإن المتغيرات المحلية local variables بما فيها المعاملات لا تتعدى أفقها فإن مررت متغير لدالة ثم غيرته داخل الدالة فإنه لا يتغير خارجها
 +<code python>
 +>>>​ def change_arg(a):​
 +...   ​a=[9,​8,​7]
 +... 
 +>>>​ l=[1,2,3]
 +>>>​ change_arg(l)
 +>>>​ l
 +[1, 2, 3]
 +</​code>​
 +تأمل الفرق بين الجلسة السابقة والتالية
 +<code python>
 +>>>​ def change_arg(a):​
 +...  del a[:]
 +...  a.extend([9,​8,​7])
 +... 
 +>>>​ l=[1,2,3]
 +>>>​ change_arg(l)
 +>>>​ l
 +[9, 8, 7]
 +</​code>​
 +
 +عند تمرير متغير لدالة فإنه يتم عمل متغير محلي يحتوي على مرجع أو إشارة للكائن الأصلي فإن قمت بعملية إحلال عبر = فإنك تجعل المحلي يشير لكائن جديد في حين لو قمت باستدعاء طرق methods تغير من قيمة نفس الكائن مثل del أو a.pop أو a.append أو a.extend فإنك تعدل على نفس الكائن
 +
 +
 +=== عملية yield والكائنات المولدة generators ===
 +
 +=== الدوال الضمنية lambda ===
 +
 +==== أساسيات مكتبة بايثون القياسية ====
 +
 +
 +
 +==== العمليات على الكائنات متعددة العناصر ====
 +==== الفئات classes ====
 +===== تتبع الأخطاء =====
 +فهم error trace
 +
 +===== توثيق البرنامج =====
 +
 +===== التعامل مع الملفات =====
 +===== عناصر مكتبة بايثون القياسية المتقدمة =====
 +==== وحدة re الخاصة بالأنماط القياسية ====
 +===== كتابة وحدة module =====
 +===== كتابة حزمة package =====
 +
 +===== وحدات وحزم إضافية =====
 +
 +<note tip>​هناك عدد كبير جدا من الحزم التي تقوم بأي شيء تقريبا لذا لا تعد اختراع العجلة.</​note>​
 +
 +==== موقع فهرس الحزم PyPI ====
 +
 +يعتبر موقع PyPI أي Python Package Index أول مكان تبحث فيه عن حزم إضافية. يمتاز هذا الموقع بأنه يحتوي على صندوق بحث ويحتوي على معلومات مثل رابط آخر إصدارة أو رابط الوثائق ويبين درجة نضوج الحزمة.
 +
 +قد يوفر لك هذا الموقع روابط exe أو حزم rpm لكنه في الغالب يوفر كود مصدري في أرشيف zip أو tarball بعد فك ضغطه ادخل المجلد واكتب
 +<​code>​
 +python setup.py install
 +</​code>​
 +
 +<note warning>​لا ننصحك بتشويش نظام الحزم الخاص بتوزيعة بتثبيت حزم من وراء ظهره عبر setup.py أو غيره من الأدوات.</​note>​
 +
 +==== استخدام مستودعات التوزيعة ====
 +من أكثر أساليب التثبيت سهولة هو استخدام مدير الحزم الخاص بتوزيعتك مثلا لتثبيت حزمة lxml في فيدورا (وبالتالي أعجوبة) اكتب
 +<code bash>
 +yum install python-lxml
 +</​code>​
 +أو في ديبيان (وبالتالي أوبنتو) اكتب
 +<code bash>
 +apt-get install python-lxml
 +</​code>​
 +
 +من الحزم الشائعة التي أفضل تثبيتها من مدير الحزم هي التالية وذلك أنها ليست حزم بايثونية صرفة بل تحتوي كود بلغة سي وتحتاج تصنيف لذا جلبها من مستودعات توزيعتك يوفر عليك عناء تصنيفها
 +
 +<code bash>
 +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
 +</​code>​
 +
 +==== مدير حزم بايثون 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''​ تأكد من تثبيتهما من مستودعات التوزيعة. ​
 +
 +<code bash>
 +yum install python-setuptools python-pip
 +pip install wheel
 +</​code>​
 +
 +إذا كانت توزيعتك لا تأتي ب ''​pip''​ (اسم احزمة هو ''​python-pip''​) يمكنك تثبيتها من خلال ''​easy_install''​ الموجود في ''​python-setuptools''​ وذلك بكتابة الأمر التالي بصلاحيات الجذر
 +
 +<code bash>
 +easy_install pip
 +pip install wheel
 +</​code>​
 +
 +يمكنك pip من تثبيت الحزم سواء في النظام أو في بيت المستخدم (عبر ''​--user''​) ويمكنك من تحديد شروط معينة مثل رقم الإصدار أو ما شابه
 +
 +<note warning>​تجنب عمل تشويش بين الحزم التي تأتي من نظام التشغيل والتي تثبتها في النظام من وراء ظهر مدير حزم النظام عبر easy_install أو pip بصلاحيات الجذر. </​note>​
 +
 +على الخوادم يمكنك فصل كل تطبيق في مستخدم وتثبيت متطلبات التطبيق في بيته مثلا اكتب الأمر التالي بصلاحيات المستخدم العادي (وليس الجذر) صاحب التطبيق ​
 +
 +<​code>​
 +pip install --help
 +pip install --user django
 +pip install --user -r requirements.txt
 +</​code>​
 +
 +حيث ''​requirements.txt''​ هو ملف نصي يحتوي أسماء الحزم التي تريد تثبيتها
 +
 +<note warning>​التثبيت في النظام أو حتى في بيت المستخدم غير عملي للتطوير. المطور يفترض أن يستعمل مجلدات منفصلة لكل مشروع فيما يسمى البيئة الافتراضية أو "​صندوق الرمل"</​note>​
 + 
 +=== التثبيت في صندوق الرمل! ===
 +
 +لنفرض أنك مطور تعمل على مشروعين الأول يعتمد على الإصدار الأول (دون الثاني) من حزمة ما والثاني على الإصدار الثاني (دون الأول) فإذا ثبت تلك الحزمة فالنظام فأي إصدار ستختار. الحل هو وضع كل مشروع في مجلد يكون فيه اكتفاء ذاتي من المكتبات يسمى البيئة الافتراضية (لا تخف لا يوجد عملية محاكاة فقط يتم تحديد مسارات غير مسارات النظام). حتى تستطيع عمل ذلك أولا ثبت حزمة virtualenv من خلال pip  بصلاحيات الجذر
 +
 +<code bash>
 +pip install virtualenv
 +</​code>​
 +
 +الآن لعمل مجلد بيئة افتراضية خاصة بمشروع جديد كل ما عليك هو كتابة الأمر التالي كمستخدم دون صلاحيات ​
 +
 +<​code>​
 +virtualenv --no-site-packages mypyenv
 +</​code>​
 +
 +الأمر السابق يعمل بيئة نظيفة خالية لا تستفيد من حزم النظام. لكن أنا أفضل أن أستفيد منها (إذا كنت أعرفها وأعرف أنها لا تتضارب مع مشروعي)
 +
 +<​code>​
 +virtualenv --system-site-packages mypyenv
 +</​code>​
 +
 +
 +لتفعيل تلك البيئة الافتراضية اكتب
 +
 +<​code>​
 +cd mypyenv
 +source bin/​activate
 +</​code>​
 +
 +وأثناء تفعيل تلك البيئة استعمل ''​pip install''​ دون صلاحيات لتثبيت أي حزمة تريد وتشغيلها حيث أنها تثبيت داخل البيئة الافتراضية الخاصة بمجلد المشروع
 +
 +ولإلغاء تفعيلها اكتب ​
 +
 +<​code>​
 +deactivate
 +</​code>​
 +
 +=== نقل وإعادة اساتخدام الحزم ===
 +
 +لتوفير عناء تنزيل الحزم من الإنترنت لكل مشروع أو لتجيد إصدارات (لتضمن أنه نفس الإصدار الذي جربته) أو لدعم التثبيت دون إنترنت وغير تلك الأسباب نستخدم ميزة ''​wheel''​ حيث أننا نعمل مجلد نحفظ فيه الحزم. اكتب دون صلاحيات
 +
 +<code bash>
 +mkdir ~/wheel/s
 +pip wheel -w ~/wheels Django
 +pip wheel -w ~/wheels Django==1.7
 +pip wheel -w ~/wheels -r requirements.txt
 +</​code>​
 +
 +بهذا يتم تثبيت أرشيف الحزم في مجلد wheels الذي حددناه بالخيار w. لاحظ أنه يمكننا تثبيت أكثر من إصدار من الأرشيف.
 +
 +لاحقا لتثبيت حزمة دون إنترنت استعمل الخيار no-index مع تمرير مسار مجلد الأرشيفات بعد find-links لكن أولا فعّل البيئة الافتراضية ثم اكتب
 +
 +<code bash>
 +pip install --no-index --find-links=~/​wheels Django
 +pip install --no-index --find-links=~/​wheels -r requirements.txt
 +</​code>​
 +
 +=== ملخص وجلسة كمثال ===
 +اكتب بصلاحيات الجذر
 +
 +<code bash>
 +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
 +</​code>​
 +
 +الآن كمستخدم عادي
 +
 +<code bash>
 +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
 +</​code>​
 +
 +
 +===== التكامل مع لغة سي عبر Cython =====
 +===== التكامل مع لغة جافا عبر Jython =====
 +===== مفسرات استثنائية غريبة =====
 +==== مفسر بايثون المكتوب على بايثون PyPy ====
 +
 +==== مفسر بايثون المكتوب على جافاسكربت ====
 +تشغيل بايثون باستعمال جافاسكربت يعني إمكانية كتابة برامج بايثون وتنفيذها على المتصفح دون وجود خادم. هذا ما يقوم به [[http://​www.skulpt.org/​|مشروع skulpt]]. إذا دخلت موقعهم ستجد صندوق يمكنك كتابة برنامج على بايثون ثم تنفيذه عبر ​
 +CTRL+ENTER
 +يمكنك زيارة الموقع
 +  * http://​www.skulpt.org/​
 +
 +===== عمل حزم rpm و deb =====
 +===== عمل ملفات تنفيذية exe لنظام ويندوز =====
docs/python_basics.txt · آخر تعديل: 2015/08/14 14:42 بواسطة alsadi