<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/python/page/9/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</description><language>ar</language><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x643;&#x62A;&#x627;&#x628;&#x629; &#x627;&#x644;&#x62A;&#x639;&#x644;&#x64A;&#x642;&#x627;&#x62A; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D9%84%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r719/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d3d82a81a9e0_.jpg.a4206392173f87e8f5bf5e773c806eb6.jpg" /></p>
<p>
	التعليقات هي عبارات دخيلة على الشيفرات البرمجية وليست جزءًا منها، إذ تتجاهلها المصرّفات (compilers) والمترجمات (interpreters). يُسهِّل تضمين التعليقات في الشيفرات من قراءتها وفهمها ومعرفة وظيفة كل جزء من أجزائها، لأنها توفر معلومات وشروحات حول ما يفعله كل جزء من البرنامج.
</p>

<p>
	بناءً على الغرض من البرنامج، يمكن أن تكون التعليقات بمثابة مُذكَّرات لك، أو يمكنك كتابتها لمساعدة المبرمجين الآخرين على فهم الشيفرة.
</p>

<p>
	يُستحسَن كتابة التعليقات أثناء كتابة البرامج أو تحديثها، لأنّك قد تنسى السياق وتسلسل الأفكار لاحقًا، والتعليقات المكتوبة في وقت لاحق قد تكون أقل فائدة على المدى الطويل.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30843" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d3d82bb4346a_.jpg.a0d9dda01f3c5160910a855e9fa3cc0a.jpg" rel="" data-fileext="jpg"><img alt="كيفية كتابة التعليقات.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30843" data-unique="jkbc9zanr" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d3d82bb5cef4_.thumb.jpg.3b9a37a9af19af5760247cfa0416c165.jpg"></a>
</p>

<h2 id="-">
	صياغة التعليقات
</h2>

<p>
	تبدأ التعليقات السطرية في <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> بالعلامة <code>#</code> ومسافة بيضاء، وتستمر حتى نهاية السطر.
</p>

<p>
	بشكل عام، ستبدو التعليقات على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_7" style=""><span class="com"># هذا تعليق</span></pre>

<p>
	نظرًا لأنَّ التعليقات لا تُنفَّذ، فعند تشغيل البرنامج، لن ترى أي إشارة للتعليقات، فالتعليقات توضع في الشيفرة المصدرية ليقرأها الناس، وليس للتنفيذ.
</p>

<p>
	في برنامج "Hello, World!‎" قد يبدو التعليق كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_9" style=""><span class="com"># في سطر الأوامر “Hello, World!” طبع</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">)</span></pre>

<p>
	في الحلقة <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-for-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r513/" rel=""><code>for</code></a>، قد تبدو التعليقات كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_11" style=""><span class="com"># كمصفوفة من السلاسل النصية sharks تعريف المتغير</span><span class="pln">
sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">'hammerhead'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'great white'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'dogfish'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'frilled'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'bullhead'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'requiem'</span><span class="pun">]</span><span class="pln">

</span><span class="com"># sharks تمر على المصفوفة For حلقة </span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> shark </span><span class="kwd">in</span><span class="pln"> sharks</span><span class="pun">:</span><span class="pln">
   </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">shark</span><span class="pun">)</span></pre>

<p>
	يجب أن تُحاذى التعليقات على نفس المسافة البادئة (indent) للشيفرة التي تعلّق عليها. بمعنى أنّ التعليقات على دالة ليس لها مسافة بادئة ستكون هي أيضًا بدون مسافة بادئة، وسيكون لكل مستوى من المسافات البادئة التالية تعليقات تتوافق مع الشيفرات البرمجية التي تعلِّق عليها.
</p>

<p>
	على سبيل المثال، الشيفرة التالية تعرّف الدالة again()<code>‎</code> التي تسأل المستخدم إن كان يريد استخدام الحاسبة مجدَّدًا، مع بعض التعليقات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_13" style=""><span class="pun">...</span><span class="pln">
</span><span class="com"># لسؤال المستخدم إن كان يريد استخدام الحاسبة مجددا again() تعريف الدالة</span><span class="pln">

</span><span class="kwd">def</span><span class="pln"> again</span><span class="pun">():</span><span class="pln">

    </span><span class="com"># أخذ المدخلات من المستخدم</span><span class="pln">
    calc_again </span><span class="pun">=</span><span class="pln"> input</span><span class="pun">(</span><span class="str">'''
Do you want to calculate again?
Please type Y for YES or N for NO.
'''</span><span class="pun">)</span><span class="pln">

    </span><span class="com"># calculate() فستُنفّذ الدالة Y إن أدخل المستخدم </span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> calc_again </span><span class="pun">==</span><span class="pln"> </span><span class="str">'Y'</span><span class="pun">:</span><span class="pln">
        calculate</span><span class="pun">()</span><span class="pln">

    </span><span class="com"># فقل وداعا للمستخدم وأنه البرنامج N إن كتب المستخدم</span><span class="pln">

    </span><span class="kwd">elif</span><span class="pln"> calc_again </span><span class="pun">==</span><span class="pln"> </span><span class="str">'N'</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'See you later.'</span><span class="pun">)</span><span class="pln">

    </span><span class="com"># إن أدخل المستخدم حرفًا آخر، فأعد تنفيذ الدالة</span><span class="pln">
    </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
        again</span><span class="pun">()</span></pre>

<p>
	الهدف من التعليقات هو مساعدة المبرمج الأصلي، أو أيّ شخص آخر يستخدم مشروعه أو يتعاون معه، على فهمه. وإذا تعذّر صيانة التعليقات وتحديثها تحديثًا صحيحًا، وبالتوازي مع الشيفرة، فإنّ عدم تضمين التعليقات قد يكون أفضل من كتابة تعليق يتناقض مع الشيفرة.
</p>

<p>
	يجب أن تجيب التعليقات عن سؤال "لماذا" بدلًا من "ماذا" أو "كيف". لأنه ما لم تكن الشيفرة صعبة ومعقَّدة، فإن النّظر إلى الشيفرة عمومًا كافٍ لفهم ما الذي تفعله الشيفرة، أو كيف تفعله.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 id="-">
	التعليقات الكتلية
</h2>

<p>
	يمكن استخدام التعليقات الكتلية (Block Comments) لتوضيح الشيفرات البرمجية المعقدة التي لا تتوقع أن يكون القارئ على دراية بها. تنطبق هذه التعليقات الطويلة على جزء من الشيفرة أو جميعها، كما توضع في نفس مستوى المسافة البادئة للشيفرة.
</p>

<p>
	في التعليقات الكتلية، يبدأ كل سطر بالعلامة <code>#</code> معقوبةً بمسافة بيضاء واحدة. إذا كنت بحاجة إلى استخدام أكثر من فقرة واحدة، فيجب فصلها بسطر يحتوي على علامة <code>#</code> واحدة.
</p>

<p>
	فيما يلي مثال على كتلة تعليقات تشرح ما يحدث في الدالة <code>main()‎</code> المعرفة أدناه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_15" style=""><span class="com"># parser الوسائط عبر المتغير main  سوف تحلل الدالة</span><span class="pln">
</span><span class="com"># الوسائط ستُحدَّد بواسطة المستخدم على سطر الأوامر. هذا سيمرر</span><span class="pln">
</span><span class="com"># الذي يريد المستخدم تحليله مع اسم الملف word الوسيط</span><span class="pln">
</span><span class="com"># المراد استخدامه، وكذلك تقديم نص مساعد إذا لم يُدخل المستخدم </span><span class="pln">
</span><span class="com"># الوسيط بشكل صحيح</span><span class="pln">
</span><span class="kwd">def</span><span class="pln"> main</span><span class="pun">():</span><span class="pln">
  parser </span><span class="pun">=</span><span class="pln"> argparse</span><span class="pun">.</span><span class="typ">ArgumentParser</span><span class="pun">()</span><span class="pln">
  parser</span><span class="pun">.</span><span class="pln">add_argument</span><span class="pun">(</span><span class="pln">
      </span><span class="str">"word"</span><span class="pun">,</span><span class="pln">
      help</span><span class="pun">=</span><span class="str">"the word to be searched for in the text file."</span><span class="pln">
  </span><span class="pun">)</span><span class="pln">
  parser</span><span class="pun">.</span><span class="pln">add_argument</span><span class="pun">(</span><span class="pln">
      </span><span class="str">"filename"</span><span class="pun">,</span><span class="pln">
      help</span><span class="pun">=</span><span class="str">"the path to the text file to be searched through"</span><span class="pln">
  </span><span class="pun">)</span><span class="pln">
</span><span class="pun">...</span></pre>

<p>
	تُستخدَم التعليقات الكتلية عادةً عندما تكون الشيفرة غير واضحة، وتتطلب شرحًا شاملاً. يجب أن تتجنب الإفراط في التعليق على الشيفرة، ويجب أن تثق في قدرة المبرمجين الآخرين على فهم الشيفرة، إلا إذا كنت تكتب لجمهور معين.
</p>

<h2 id="-">
	التعليقات السطرية
</h2>

<p>
	توضع التعليقات السطرية (Inline comments) على نفس السطر الذي توجد فيه العبارة البرمجية. ومثل التعليقات الأخرى، فإنها تبدأ بالعلامة <code>#</code> ومسافة بيضاء واحدة.
</p>

<p>
	بشكل عام، تبدو التعليقات السطرية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_17" style=""><span class="pun">[</span><span class="pln">code</span><span class="pun">]</span><span class="pln">  </span><span class="com"># تعليق مضمن حول الشيفرة</span></pre>

<p>
	لا ينبغي الإكثار من استخدام التعليقات السطرية، ولكن عند استخدامها في محلها يمكن أن تكون فعالة لشرح الأجزاء الصعبة من الشيفرة. وقد تكون مفيدة أيضًا إن ظننت أنَّك قد لا تتذكر سطرًا من الشيفرة في المستقبل، أو إذا كنت تتعاون مع شخص قد لا يكون على دراية بجميع جوانب الشيفرة.
</p>

<p>
	على سبيل المثال، إذا لم يكن هناك توضيح مسبق، فقد لا تعلم أنت أو المتعاونون معك أنّ الشيفرة التالية تنشئ <a href="https://wiki.hsoub.com/Python/complex" rel="external">عددًا عقديًا</a>، لذلك قد ترغب في إضافة تعليق مضمّن:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_19" style=""><span class="pln">z </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2.5</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3j</span><span class="pln">  </span><span class="com"># إنشاء عدد عقدي</span></pre>

<p>
	يمكن أيضًا استخدام التعليقات السطرية لشرح السبب وراء فعل شيء ما، أو بعض المعلومات الإضافية، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_21" style=""><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pln">  </span><span class="com"># بقيمة عشوائية x ابتداء</span></pre>

<p>
	يجب استخدام التعليقات السطرية عند الضرورة وحسب، كما ينبغي أن توفر إرشادات مفيدة للشخص الذي يقرأ البرنامج.
</p>

<h2 id="-">
	تعليق جزء من الشيفرة بدواعي الاختبار والتنقيح
</h2>

<p>
	بالإضافة إلى استخدام التعليقات كوسيلة لتوثيق الشيفرة، يمكن أيضًا استخدام العلامة <code>#</code> لتعليق جزء من الشيفرة وتعطيله أثناء اختبار أو تنقيح البرنامج الذي تعمل عليه. أي عندما تواجه أخطاء بعد إضافة أسطر جديدة إلى الشيفرة، فقد ترغب في تعليق بعضها لمعرفة موضع الخلل.
</p>

<p>
	يمكن أن يتيح لك استخدام العلامة <code>#</code> تجربة بدائل أخرى أثناء إعداد الشيفرة. على سبيل المثال، قد تفاضل بين استخدام الحلقة <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-while-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r509/" rel=""><code>while</code></a> أو حلقة <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-for-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r513/" rel=""><code>for</code></a> أثناء برمجة لعبة، ويمكنك تعليق إحداهما بينما تختبر أيّهما أفضل:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2367_23" style=""><span class="kwd">import</span><span class="pln"> random

number </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">.</span><span class="pln">randint</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">)</span><span class="pln">

</span><span class="com"># number_of_guesses = 0</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> i </span><span class="kwd">in</span><span class="pln"> range</span><span class="pun">(</span><span class="lit">5</span><span class="pun">):</span><span class="pln">
</span><span class="com"># while number_of_guesses &lt; 5:</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Guess a number between 1 and 25:'</span><span class="pun">)</span><span class="pln">
    guess </span><span class="pun">=</span><span class="pln"> input</span><span class="pun">()</span><span class="pln">
    guess </span><span class="pun">=</span><span class="pln"> int</span><span class="pun">(</span><span class="pln">guess</span><span class="pun">)</span><span class="pln">

    </span><span class="com"># number_of_guesses = number_of_guesses + 1</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> guess </span><span class="pun">&lt;</span><span class="pln"> number</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Your guess is too low'</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> guess </span><span class="pun">&gt;</span><span class="pln"> number</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Your guess is too high'</span><span class="pun">)</span><span class="pln">

    </span><span class="kwd">if</span><span class="pln"> guess </span><span class="pun">==</span><span class="pln"> number</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">break</span><span class="pln">

</span><span class="kwd">if</span><span class="pln"> guess </span><span class="pun">==</span><span class="pln"> number</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'You guessed the number!'</span><span class="pun">)</span><span class="pln">

</span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'You did not guess the number. The number was '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> str</span><span class="pun">(</span><span class="pln">number</span><span class="pun">))</span></pre>

<p>
	يتيح لك تعليق الشيفرة البرمجية تجربة عدة طرق ومقاربات برمجية، بالإضافة إلى مساعدتك على العثور على مكمن الخطأ من خلال التعليق المنهجي لبعض أجزاء البرنامج.
</p>

<h2 id="-">
	خلاصة
</h2>

<p>
	سيساعدك استخدام التعليقات في برامج <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> على جعل برامجك أكثر مقروئية، سواء لك أو لغيرك. التعليقات المناسبة وذات الصلة والمفيدة ستسهّل تعاون الآخرين معك في مشاريع البرمجة وتجعل شيفرتك أكثر قيمة.
</p>

<p>
	يمكنك تعلم المزيد عن التعليقات من <a href="https://wiki.hsoub.com/Python/Basic_Syntax#.D8.A7.D9.84.D8.AA.D8.B9.D9.84.D9.8A.D9.82.D8.A7.D8.AA_Comments" rel="external">موسوعة حسوب</a>.
</p>

<p>
	هذه المقالة جزء من سلسة مقالات حول <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">تعلم البرمجة في بايثون 3</a>.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-write-comments-in-python-3" rel="external nofollow">How To Write Comments in Python 3</a> لصاحبته Lisa Tagliaferri
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%81%D9%87%D9%85-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r720/" rel="">فهم أنواع البيانات</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D8%B7%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A-r716/" rel="">كيفية استخدام سطر أوامر بايثون التفاعلي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">719</guid><pubDate>Fri, 02 Aug 2019 08:07:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x633;&#x637;&#x631; &#x623;&#x648;&#x627;&#x645;&#x631; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; &#x627;&#x644;&#x62A;&#x641;&#x627;&#x639;&#x644;&#x64A;</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D8%B7%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A-r716/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2f18a98c925_.jpg.9a78bab7beb422fe8ec9352078a0386d.jpg" /></p>

<p>
	يوفر سطر أوامر بايثون التفاعلي (Python interactive console)، ويسمى أيضًا مترجم بايثون (Python interpreter) للمبرمجين طريقة سريعة لتنفيذ الأوامر، وتجربة أو اختبار التعليمات البرمجية دون الحاجة إلى إنشاء وكتابة أي شيفرة برمجية.
</p>

<p>
	يمكن الوصول من خلال سطر الأوامر التفاعلي إلى جميع دوال بايثون المُضمّنة، وجميع الوحدات المثبّتة، وتاريخ الأوامر، والإكمال التلقائي. ويوفر سطر الأوامر التفاعلي الفرصة لاستكشاف وتجربة شيفرات تعليمات بايثون، والقدرة على نسخ الشيفرة البرمجية ولصقها في ملف الشيفرة المصدرية عندما تصبح جاهزة أي بعد تجريبها والتأكد من عملها.
</p>

<p>
	ستتناول هذه المقالة كيفية العمل بسطر الأوامر التفاعلي لبايثون، وكيفية الاستفادة منه أثناء كتابة الشيفرة.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30718" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d2f18ae3c47a_.jpg.e0cd5c702d87216384c26b91ee0d8335.jpg" rel=""><img alt="سطر الأوامر التفاعلي.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30718" data-unique="g16niane6" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2f18ae52096_.thumb.jpg.7bf61c378a3336dc4b291cfbb8fbe560.jpg"></a>
</p>

<h2 id="-">
	فتح سطر الأوامر التفاعلي
</h2>

<p>
	يمكن الوصول إلى سطر الأوامر التفاعلي من أيّ حاسوب محلي أو خادم مثبّت فيه بايثون. التعليمة التي ستستخدمها عمومًا للدخول إلى سطر الأوامر التفاعلي في الإصدار الافتراضي لبايثون هي:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">python</span>
</pre>

<p>
	إذا أعددت البيئة البرمجية وجهزتها وفق إرشادات <a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r714/" rel="">الدرس السابق</a>، فيمكنك إنشاء بيئة واستعمال إصدار بايثون والوحدات المُثبَّتة فيها عن طريق الدخول أولاً إلى تلك البيئة (إن لم تُهيِّئ البية الوهمية بعد، فعد إلى <a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r714/" rel="">الدرس السابق</a> وجهِّز البيئة الوهمية قبل تنفيذ الأوامر التالية):
</p>

<pre class="ipsCode">
cd environments
. my_env/bin/<span class="hljs-built_in">activate</span>
</pre>

<p>
	ثم اكتب الأمر <code>python</code>:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@ubuntu</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>python
</pre>

<p>
	في مثالنا الحالي، الإصدار الافتراضي هو Python 3.5.2، والذي يُعرَض في المخرجات بمجرد إدخال الأمر، إلى جانب إشعار حقوق الملكية، وبعض الأوامر التي يمكنك كتابتها للحصول على معلومات إضافية:
</p>

<pre class="ipsCode">
Python <span class="hljs-number">3.5</span>.<span class="hljs-number">2</span> (<span class="hljs-keyword">default</span>, Nov <span class="hljs-number">17</span> <span class="hljs-number">2016</span>, <span class="hljs-number">17</span>:<span class="hljs-number">05</span>:<span class="hljs-number">23</span>) 
[GCC <span class="hljs-number">5.4</span>.<span class="hljs-number">0</span> <span class="hljs-number">20160609</span>] <span class="hljs-keyword">on</span> linux
<span class="hljs-keyword">Type</span> <span class="hljs-string">"help"</span>, <span class="hljs-string">"copyright"</span>, <span class="hljs-string">"credits"</span> <span class="hljs-keyword">or</span> <span class="hljs-string">"license"</span> <span class="hljs-keyword">for</span> more information.
&gt;&gt;&gt;
</pre>

<p>
	في بداية كل سطر ستجد ثلاث علامات "أكبر من" (<code>&lt;&lt;&lt;</code>):
</p>

<pre class="ipsCode">
<span class="hljs-meta">&gt;&gt;</span>&gt;
</pre>

<p>
	يمكنك استهداف إصدارات محددة من بايثون عن طريق إلحاق رقم الإصدار بالأمر، وبدون مسافات مثل:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">python2</span><span class="hljs-selector-class">.7</span>
</pre>

<pre class="ipsCode">
Python <span class="hljs-number">2.7</span>.<span class="hljs-number">12</span> (<span class="hljs-keyword">default</span>, Nov <span class="hljs-number">19</span> <span class="hljs-number">2016</span>, <span class="hljs-number">06</span>:<span class="hljs-number">48</span>:<span class="hljs-number">10</span>) 
[GCC <span class="hljs-number">5.4</span>.<span class="hljs-number">0</span> <span class="hljs-number">20160609</span>] <span class="hljs-keyword">on</span> linux2
<span class="hljs-keyword">Type</span> <span class="hljs-string">"help"</span>, <span class="hljs-string">"copyright"</span>, <span class="hljs-string">"credits"</span> <span class="hljs-keyword">or</span> <span class="hljs-string">"license"</span> <span class="hljs-keyword">for</span> more information.
&gt;&gt;&gt;
</pre>

<p>
	المخرجات تبيّن لنا أننا نستخدم الإصدار Python 2.7.12. إذا كان هذا هو الإصدار الافتراضي لبايثون 2، فيمكننا أيضًا الدخول إلى سطر الأوامر التفاعلي باستخدام الأمر <code>python2</code>.
</p>

<p>
	بالمقابل، يمكننا استدعاء إصدار بايثون 3 الافتراضي باستخدام الأمر التالي:
</p>

<pre class="ipsCode">
pytho<span class="hljs-symbol">n3</span>
</pre>

<pre class="ipsCode">
Python <span class="hljs-number">3.5</span>.<span class="hljs-number">2</span> (<span class="hljs-keyword">default</span>, Nov <span class="hljs-number">17</span> <span class="hljs-number">2016</span>, <span class="hljs-number">17</span>:<span class="hljs-number">05</span>:<span class="hljs-number">23</span>) 
[GCC <span class="hljs-number">5.4</span>.<span class="hljs-number">0</span> <span class="hljs-number">20160609</span>] <span class="hljs-keyword">on</span> linux
<span class="hljs-keyword">Type</span> <span class="hljs-string">"help"</span>, <span class="hljs-string">"copyright"</span>, <span class="hljs-string">"credits"</span> <span class="hljs-keyword">or</span> <span class="hljs-string">"license"</span> <span class="hljs-keyword">for</span> more information.
&gt;&gt;&gt;
</pre>

<p>
	يمكن أيضًا أن نفتح سطر الأوامر التفاعلي أعلاه باستخدام الأمر <code>python3.5</code>.
</p>

<p>
	بعد تشغيل سطر الأوامر التفاعلي لبايثون، يمكننا المضي قدمًا والبدء في العمل.
</p>

<h2 id="-">
	العمل في سطر أوامر بايثون التفاعلي
</h2>

<p>
	يقبل مترجم بايثون التفاعلي (Python interactive interpreter) قواعد لغة بايثون، والتي تضعها بعد البادئة <code>&lt;&lt;&lt;</code>.
</p>

<p>
	يمكننا، على سبيل المثال، إنشاء متغير وإسناد قيمة له بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_12" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> birth_year </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1868</span></pre>

<p>
	بمجرد تعيين قيمة العدد الصحيح <code>1868</code> إلى المتغير <code>birth_year</code>، سنضغط على زر الإدخال ونحصل على سطر جديد يبدأ بثلاث علامات "أكبر من" (<code>&lt;&lt;&lt;</code>):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_10" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> birth_year </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1868</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span></pre>

<p>
	يمكننا الاستمرار في تعيين المتغيرات، وإجراء الحسابات الرياضياتية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_8" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> birth_year </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1868</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> death_year </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1921</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> age_at_death </span><span class="pun">=</span><span class="pln"> death_year </span><span class="pun">-</span><span class="pln"> birth_year
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">age_at_death</span><span class="pun">)</span><span class="pln">
</span><span class="lit">53</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span></pre>

<p>
	كما نفعل في ملفات البرامج النصية، أنشأنا متغيرات جديدة أخرى وأسندنا قيمةً لها تناسب اسمها، ثم طرحنا قيمة متغيرٍ من آخر، وطلبنا من سطر الأوامر طباعة المتغير الذي يمثل الفرق عبر الدالة <code>print()‎</code>.
</p>

<p>
	يمكنك أيضًا استخدام سطر الأوامر التفاعلي كآلة حاسبة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_14" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="lit">203</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">20</span><span class="pln">
</span><span class="lit">10.15</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span></pre>

<p>
	هنا، قسمنا العدد الصحيح <code>203</code> على <code>20</code>، نحصل على الناتج <code>10.15</code>.
</p>

<h2 id="-">
	تعدد الأسطر
</h2>

<p>
	عندما نكتب شيفرة متعددة الأسطر، سيستخدم المترجم أسطر الاستمرارية، وهي أسطر مسبوقة بثلاث نقاط (<code>...</code>). وللخروج من أسطر الاستمرارية، ستحتاج إلى الضغط على الزر <code>ENTER</code> مرتين.
</p>

<p>
	الشيفرة التالية تعيّن قيمتي متغيّرين، ثم تستخدم عبارة شرطية لتحديد ما يجب طباعته:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_16" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> sammy </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Sammy'</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> shark </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Shark'</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">sammy</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">shark</span><span class="pun">):</span><span class="pln">
</span><span class="pun">...</span><span class="pln">     </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Sammy codes in Java.'</span><span class="pun">)</span><span class="pln">
</span><span class="pun">...</span><span class="pln"> </span><span class="kwd">else</span><span class="pun">:</span><span class="pln">
</span><span class="pun">...</span><span class="pln">     </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Sammy codes in Python.'</span><span class="pun">)</span><span class="pln">
</span><span class="pun">...</span><span class="pln"> 
</span><span class="typ">Sammy</span><span class="pln"> codes </span><span class="kwd">in</span><span class="pln"> </span><span class="typ">Python</span><span class="pun">.</span><span class="pln">
</span><span class="pun">&gt;&gt;&gt;</span></pre>

<p>
	في هذه الحالة، طولا السلسلتين النصيتين متساويان، لذلك يتم تنفيذ العبارة <code>else</code>.
</p>

<p>
	لاحظ أنك ستحتاج إلى الحفاظ على مسافة بادئة بايثون (Python indenting) المؤلفة من أربعة مسافات بيضاء، وإلا سيُطلق خطأٌ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_18" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">sammy</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> len</span><span class="pun">(</span><span class="pln">shark</span><span class="pun">):</span><span class="pln">
</span><span class="pun">...</span><span class="pln"> </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Sammy codes in Java.'</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">File</span><span class="pln"> </span><span class="str">"&lt;stdin&gt;"</span><span class="pun">,</span><span class="pln"> line </span><span class="lit">2</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="str">'Sammy codes in Java.'</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">^</span><span class="pln">
</span><span class="typ">IndentationError</span><span class="pun">:</span><span class="pln"> expected an indented block
</span><span class="pun">&gt;&gt;&gt;</span></pre>

<p>
	إضافة إلى تجربة التعليمات البرمجية متعددة الأسطر في سطر الأوامر، يمكنك أيضًا استيراد الوحدات.
</p>

<h2 id="-">
	استيراد الوحدات
</h2>

<p>
	يوفر لك مترجم بايثون طريقةً سريعةً للتحقق مما إذا كانت وحدات معيّنة متوفرة في بيئة البرمجة الحالية. يمكنك ذلك باستخدام العبارة <code>import</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_20" style="">
<span class="pun">&gt;&gt;&gt;</span><span class="pln"> </span><span class="kwd">import</span><span class="pln"> matplotlib
</span><span class="typ">Traceback</span><span class="pln"> </span><span class="pun">(</span><span class="pln">most recent call last</span><span class="pun">):</span><span class="pln">
  </span><span class="typ">File</span><span class="pln"> </span><span class="str">"&lt;stdin&gt;"</span><span class="pun">,</span><span class="pln"> line </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">in</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">module</span><span class="pun">&gt;</span><span class="pln">
</span><span class="typ">ImportError</span><span class="pun">:</span><span class="pln"> </span><span class="typ">No</span><span class="pln"> module named </span><span class="str">'matplotlib'</span></pre>

<p>
	في الحالة أعلاه، لم تكن الوحدة <code>matplotlib</code> متاحة في بيئة البرمجة الحالية.
</p>

<p>
	لتثبيت تلك الوحدة، ستحتاج إلى ترك المترجم التفاعلي، وتثبيتها باستخدام <a href="https://academy.hsoub.com/questions/5121-%D9%83%D9%8A%D9%81-%D8%A3%D9%82%D9%88%D9%85-%D8%A8%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AD%D8%B2%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-pip%D8%9F/#comment-10868" rel="">أداة إدارة الحزم pip</a> مثل العادة:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@ubuntu</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>pip install matplotlib
</pre>

<pre class="ipsCode">
<span class="hljs-selector-tag">Collecting</span> <span class="hljs-selector-tag">matplotlib</span>
  <span class="hljs-selector-tag">Downloading</span> <span class="hljs-selector-tag">matplotlib-2</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.2-cp35-cp35m-manylinux1_x86_64</span><span class="hljs-selector-class">.whl</span> (14<span class="hljs-selector-class">.6MB</span>)
...
<span class="hljs-selector-tag">Installing</span> <span class="hljs-selector-tag">collected</span> <span class="hljs-selector-tag">packages</span>: <span class="hljs-selector-tag">pyparsing</span>, <span class="hljs-selector-tag">cycler</span>, <span class="hljs-selector-tag">python-dateutil</span>, <span class="hljs-selector-tag">numpy</span>, <span class="hljs-selector-tag">pytz</span>, <span class="hljs-selector-tag">matplotlib</span>
<span class="hljs-selector-tag">Successfully</span> <span class="hljs-selector-tag">installed</span> <span class="hljs-selector-tag">cycler-0</span><span class="hljs-selector-class">.10</span><span class="hljs-selector-class">.0</span> <span class="hljs-selector-tag">matplotlib-2</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.2</span> <span class="hljs-selector-tag">numpy-1</span><span class="hljs-selector-class">.13</span><span class="hljs-selector-class">.0</span> <span class="hljs-selector-tag">pyparsing-2</span><span class="hljs-selector-class">.2</span><span class="hljs-selector-class">.0</span> <span class="hljs-selector-tag">python-dateutil-2</span><span class="hljs-selector-class">.6</span><span class="hljs-selector-class">.0</span> <span class="hljs-selector-tag">pytz-2017</span><span class="hljs-selector-class">.2</span>
</pre>

<p>
	بمجرد تثبيت الوحدة matplotlib هي وجميع تبعياتها بنجاح، يمكنك العودة إلى المترجم التفاعلي:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@ubuntu</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>python
</pre>

<p>
	في هذه المرحلة، لن تتلقى أيّ رسالة خطأ إن استوردت الوحدة، ويمكنك استخدام الوحدة المثبتة إما داخل سطر الأوامر، أو داخل ملف.
</p>

<h2 id="-">
	الخروج من سطر أوامر بايثون التفاعلي
</h2>

<p>
	هناك طريقتان رئيسيتان لترك سطر الأوامر التفاعلي: إما استخدام اختصار لوحة المفاتيح، أو استخدام دالة من دوال بايثون.
</p>

<p>
	اختصار لوحة المفاتيح هو <code>CTRL+D</code> في أنظمة *نيكس، أو <code>CTRL+Z</code> ثم <code>CTRL</code> في أنظمة ويندوز، وبذلك ستخرج من سطر الأوامر، ويعيدك إلى البيئة الطرفية الأصلية:
</p>

<pre class="ipsCode">
...
<span class="hljs-meta">&gt;&gt;</span>&gt; age_at_death = death_year - birth_year
<span class="hljs-meta">&gt;&gt;</span>&gt; print(age_at_death)
<span class="hljs-number">53</span>
<span class="hljs-meta">&gt;&gt;</span>&gt; 
sammy@ubuntu<span class="hljs-symbol">:~/environments</span>$
</pre>

<p>
	بدلًا من ذلك، الدالة <code>quit()‎</code> ستنهي سطر الأوامر التفاعلي، وتعيدك إلى بيئة المحطة الطرفية الأصلية التي كنت فيها سابقًا:
</p>

<pre class="ipsCode">
<span class="hljs-meta">&gt;&gt;</span>&gt; octopus = <span class="hljs-string">'Ollie'</span>
<span class="hljs-meta">&gt;&gt;</span>&gt; quit()
sammy@PythonUbuntu<span class="hljs-symbol">:~/environments</span>$
</pre>

<p>
	في حال استخدام الدالة <code>quit()‎</code>، فستُسجَّل في ملف التأريخ (history file)، بالمقابل لن يُسجّل اختصار لوحة المفاتيح <code>CTRL+D</code> ذلك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5794_24" style="">
<span class="com"># /home/sammy/.python_history الملف </span><span class="pln">
</span><span class="pun">...</span><span class="pln">
age_at_death </span><span class="pun">=</span><span class="pln"> death_year </span><span class="pun">-</span><span class="pln"> birth_year
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">age_at_death</span><span class="pun">)</span><span class="pln">
octopus </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Ollie'</span><span class="pln">
quit</span><span class="pun">()</span></pre>

<p>
	يمكن إنهاء مترجم بايثون بكلا الطريقتين، فاختر ما يناسبك.
</p>

<h2 id="-">
	الاطلاع على التأريخ
</h2>

<p>
	من فوائد سطر الأوامر التفاعلي أنّ جميع أوامرك تؤرَّخ في الملف <code>‎</code>.python_history في أنظمة *ينكس، بحيث يمكنك الاطلاع عليها في أيّ محرر نصي، مثل nano:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">nano</span> ~/.python_history
</pre>

<p>
	بمجرد فتحه باستخدام محرر نصوص، سيبدو ملف تأريخ بايثون الخاص بك على هذا النحو:
</p>

<pre class="ipsCode">
# /<span class="hljs-built_in">home</span>/sammy/.python_history الملف 
<span class="hljs-keyword">import</span> pygame
quit()
<span class="hljs-built_in">if</span> <span class="hljs-number">10</span> &gt; <span class="hljs-number">5</span>:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"hello, world"</span>)
<span class="hljs-built_in">else</span>:
    <span class="hljs-built_in">print</span>(<span class="hljs-string">"nope"</span>)
sammy = <span class="hljs-string">'Sammy'</span>
shark = <span class="hljs-string">'Shark'</span>
...
</pre>

<p>
	بمجرد الانتهاء من ملفك، يمكنك الضغط على <code>CTRL+X</code> للخروج.
</p>

<p>
	من خلال تتبع الأحداث المُؤرَّخة في بايثون، يمكنك الرجوع إلى الأوامر والتجارب السابقة، ونسخ ولصق أو تعديل الشيفرة لاستخدامها في الملفات البرمجية أو في Jupyter Notebook.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	سطر الأوامر التفاعلي هو فضاءٌ لتجربة شيفرة بايثون، إذ يمكنك استخدامه كأداة للاختبار والتجريب وغير ذلك.
</p>

<p>
	لتنقيح (Debug) ملفات البرمجة في بايثون، يمكنك استخدام الوحدة <code>code</code> لفتح مترجم تفاعلي داخل ملف، وسنتحدث عن ذلك بالتفصيل في الدرس التالي: كيفية تنقيح بايثون باستخدام سطر الأوامر التفاعلي.
</p>

<p>
	هذه المقالة جزء من سلسة مقالات حول <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">تعلم البرمجة في بايثون 3</a>.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-work-with-the-python-interactive-console" rel="external nofollow">How To Work with the Python Interactive Console</a> لصاحبته Lisa Tagliaferri
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة اللاحقة: <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">كيفية كتابة التعليقات في بايثون 3</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك في بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">716</guid><pubDate>Tue, 30 Jul 2019 08:02:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x643;&#x62A;&#x628; &#x623;&#x648;&#x644; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C; &#x644;&#x643; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2f0a260a48a_.jpg.b89f6a9d520e544da2edd75552214c9a.jpg" /></p>
<p>
	كتابة برنامج يطبع العبارة "مرحبا بالعالم!‎" وتنفيذه هو أحد التقاليد الأساسية في مجال البرمجة، ويشكل أول برنامج بسيط وكامل للمبتدئين، وكذلك يُعدُّ اختبارًا لأنظمة وبيئات البرمجة، كما يعطي البرنامج فكرة عن الصياغة الأساسية للغات البرمجة.
</p>

<p>
	ستتعلم في هذه المقالة كيفية كتابة برنامج "مرحبا بالعالم!" في بايثون 3.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="30717" data-ss1619255726="1" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d2f0a295e0d1_.jpg.740b4a5d098b16cf03849d58bdc43f3e.jpg" rel=""><img alt="كتابة أول برنامج لك.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30717" data-unique="v1cxa2kl6" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2f0a2973939_.thumb.jpg.496f39e162118d6a678e110d37c3b9b3.jpg"></a>
</p>

<h2 id="-">
	المتطلبات الأساسية
</h2>

<p>
	يجب أن يكون لديك بايثون 3 مثبتًا، بالإضافة إلى إعداد بيئة برمجة محلية على حاسوبك. إن لم تكن قد ثبَّت بايثون وأعددت البيئة البرمجة، فعد إلى <a data-ss1619255726="1" href="https://academy.hsoub.com/programming/python/%d8%aa%d8%ab%d8%a8%d9%8a%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-3-%d9%88%d8%a5%d8%b9%d8%af%d8%a7%d8%af-%d8%a8%d9%8a%d8%a6%d8%aa%d9%87%d8%a7-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d9%8a%d8%a9-r714/" rel="">الدرس السابق</a> واتبع الخطوات اللازمة لإنجاز ذلك قبل إكمال هذا الدرس.
</p>

<h2 id="-">
	مرحلة كتابة البرنامج
</h2>

<p>
	لكتابة البرنامج "مرحبا بالعالم!‎"، سننشئ ملفًا جديدًا باسم <code>hello.py</code>، ثم نفتحه بمحرر نصوص لسطر الأوامر، (مثل nano الموجود على أنظمة لينكس):
</p>

<pre class="ipsCode"><span class="hljs-selector-tag">nano</span> <span class="hljs-selector-tag">hello</span><span class="hljs-selector-class">.py</span>
</pre>

<p>
	إن لم يكن لديك المُحرِّر nano، فأنشئ الملف <code>hello.py</code> وافتحه باستعمال أي محرِّر موجود على نظام التشغيل لديك (مثل المفكرة على أنظمة ويندوز).
</p>

<p>
	بمجرد فتح الملف النصي في نافذة الطرفية (أو محرِّر النصوص)، سنقوم بكتابة برنامجنا فيه وذلك بكتابة التعليمة البرمجية التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1177_8" style=""><span class="kwd">print</span><span class="pun">(</span><span class="str">"مرحبا بالعالم!‎"</span><span class="pun">)</span></pre>

<p>
	دعنا نشرّح هذه التعليمة.
</p>

<p>
	<code>print()‎</code> هي دالة (function) تخبر الحاسوب بتنفيذ إجراء ما. نعرف أنَّها <strong>دالة</strong> لأنها تستخدم الأقواس. تطلب <code>print()‎</code> من بايثون أن يعرض أو يخرج ما نضعه بين القوسين. بشكل افتراضي، ستُعرَض المُخرجات في نافذة الطرفية عند تنفيذ البرنامج.
</p>

<p>
	بعض الدوال، مثل <code>print()‎</code>، هي دوال مُدمجة (built-in) في بايثون بشكل افتراضي. هذه الدوال المدمجة متوفرة لنا دائمًا لاستخدامها في برامجنا. يمكننا أيضًا تعريف دوالنا الخاصة وبناءها من عناصر أخرى.
</p>

<p>
	داخل قوسي الدالة <code>print()‎</code> توجد سلسلة من الأحرف - <code>مرحبا بالعالم!‎</code>‎ - محاطة بعلامتي اقتباس. وهذه الأحرف الموضوعة بين علامات الاقتباس تُسمى <strong>سلاسل نصية</strong> (strings) وهي أحد أنواع البيانات التي سنتعرف عليها لاحقًا.
</p>

<p>
	بعد الانتهاء من كتابة البرنامج، يمكنك الخروج من nano عن طريق الضغط على <code>ctrl+x</code>، وعندما يُطلب منك حفظ الملف، اضغط على <code>y</code>.
</p>

<p>
	بعد الخروج من المُحرِّر nano، ستعود إلى نافذة الطرفية.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 id="-">
	مرحلة تنفيذ البرنامج
</h2>

<p>
	بعد الانتهاء من كتابة برنامج "مرحبا بالعالم!‎"، فنحن جاهزون لتنفيذه. سنستخدم الأمر <code>python3</code> معقوبًا باسم ملف البرنامج:
</p>

<pre class="ipsCode"><span class="hljs-keyword">python3</span> hello.<span class="hljs-keyword">py</span>
</pre>

<p>
	سيعرض برنامج hello.py الذي أنشأته للتو المخرجات التالية على نافدة الطرفية:
</p>

<pre class="ipsCode">مرحبا بالعالم!‎
</pre>

<p>
	دعني أشرح لك ما فعله البرنامج بمزيد من التفصيل.
</p>

<p>
	في الشيفرة البرمجية، مررنا السلسلة النصية <code>مرحبا بالعالم!‎</code>‎ إلى الدالة <code>print()‎</code> التي وظيفتها طباعة ما يُمرَّر إليها على مجرى الخرج (نافذة الطرفية في حالتنا هذه). في هذا المثال، السلسلة النصية <code>مرحبا بالعالم!‎‎</code> تُسمى أيضًا وسيطًا (argument)، نظرًا لأنها قيمة مُمرّرة إلى دالة. علامتا الاقتباس اللتان تحيطان بالسلسلة النصية <code>مرحبا بالعالم!‎‎</code> لن تُطبعا على الشاشة لأنهما تُستخدمان لإعلام بايثون بأنّهما تحتويان على سلسلة نصية. تُحدِّد علامتا الاقتباس مُبتدأ السلسلة النصية ومنتهاها.
</p>

<p>
	بعد تنفيذ البرنامج، يمكنك الآن التأكد من أنّك نجحت في تثبيت بايثون 3، وأنّ البرنامج مكتوب ومُصَاغ صياغةً صحيحة.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تهانينا! لقد أتممت كتابة أول برنامج لك، برنامج "مرحبا بالعالم!‎"، في بايثون 3. من الآن وصاعدًا، يمكنك استخدام الدالة <code>print()‎</code> لعرض أية عبارات نصية أو قيم أخرى، ويمكنك أيضًا إنشاء ملفات برامج جديدة وتنفيذها بالطريقة ذاتها. لتعلم المزيد حول لغة بايثون، ننصحك بمتابعة سلسلة مقالات عن <a data-ss1622629357="1" href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كيفية البرمجة في بايثون 3</a>، والتي تأخذك خطوةً بخطوة لتعلم كيفية تثبيت بايثون وإعداد بيئة البرمجة، إضافةً إلى المفاهيم الأساسيات للغة، وأنواع البيانات والدوال والأصناف والبرمجة الكائنية وغيرها من المفاهيم؛ كما وفرنا دورةً تعليمية شاملةً حول تعلم التطوير واحترافه عن طريق لغة بايثون، وذلك انطلاقًا من الصفر إلى الاحتراف، وهذا في <a href="https://academy.hsoub.com/learn/python-application-development/" rel="">دورة تطوير تطبيقات باستخدام لغة بايثون</a>، التي تمكّنك من تعلّم التطوير بلغة بايثون للتطبيقات ولمواقع الويب بالاعتماد على النظريات السليمة والتطبيق العملي والدعم المباشر.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="480" id="ips_uid_8591_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="600" data-embed-src="https://www.youtube.com/embed/1niwEWY7CN4"></iframe>
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a data-ss1619255726="1" href="https://www.digitalocean.com/community/tutorials/how-to-write-your-first-python-3-program" rel="external nofollow">How To Write Your First Python 3 Program</a> لصاحبته Lisa Tagliaferri
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقالة اللاحقة: <a data-ss1619255726="1" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D8%B7%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A-r716/" rel="">كيفية استخدام سطر أوامر بايثون التفاعلي</a>
	</li>
	<li>
		المقالة السابقة: <a data-ss1619255726="1" href="https://academy.hsoub.com/programming/python/%d8%aa%d8%ab%d8%a8%d9%8a%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-3-%d9%88%d8%a5%d8%b9%d8%af%d8%a7%d8%af-%d8%a8%d9%8a%d8%a6%d8%aa%d9%87%d8%a7-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d9%8a%d8%a9-r714/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئتها البرمجية</a>
	</li>
	<li>
		<span ipsnoautolink="true"><a href="https://academy.hsoub.com/python/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a></span>
	</li>
	<li>
		<span ipsnoautolink="true">تعرف على أبرز <a href="https://academy.hsoub.com/programming/python/%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">مميزات لغة بايثون</a></span>
	</li>
	<li>
		<a data-ss1619255726="1" href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">715</guid><pubDate>Fri, 26 Jul 2019 08:08:00 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x62A;&#x647;&#x627; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/python/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r714/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef52ae4892_.jpg.1610e8ed8f37402953763f39004d9732.jpg" /></p>
<p>
	بعد أن أخذت فكرة عامة عن لغة البرمجة بايثون وتعرف على تاريخها والفرق بين أهم إصدارين لها، الإصدار 2 و الإصدار 3 في <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">الدرس السابق</a>، ستتعلم في هذا الدرس كيفية تثبيت بايثون على نظام تشغيلك وإعداد البيئة البرمجية اللازمة لكتابة البرامج وتنفيذها خلال <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%AA%D8%B9%D9%84%D9%85%20%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">رحلتك التعليمية هذه</a>.
</p>

<p>
	فهرس هذا الدرس -لسهولة الانتقال إلى <a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">نظام التشغيل</a> الذي تريده- هو:
</p>

<ul>
	<li>
		<a href="#-3-16-04-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-a9-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d9-81-d9-8a-d8-aa-d9-88-d8-b2-d9-8a-d8-b9-d8-a9-d8-a3-d9-88-d8-a8-d9-86-d8-aa-d9-88-1604-r401-" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية على <strong>أوبنتو 16.04</strong></a>
	</li>
	<li>
		<a href="#-3-18-04-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-d8-ae-d8-a7-d8-af-d9-85-d8-a3-d9-88-d8-a8-d9-86-d8-aa-d9-88-1804-r709-" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية على <strong>أوبنتو 18.04</strong></a>
	</li>
	<li>
		<a href="#-3-8-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-d8-af-d8-a8-d9-8a-d8-a7-d9-86-8-r712-" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية على <strong>ديبيان 8</strong></a>
	</li>
	<li>
		<a href="#-3-centos-7-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-centos-7-r711-" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على <strong>CentOS 7</strong> </a>
	</li>
	<li>
		<a href="#-3-macos" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على <strong>macOS</strong> </a>
	</li>
	<li>
		<a href="#-3-10-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-d9-88-d9-8a-d9-86-d8-af-d9-88-d8-b2-10-r710-" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على <strong>ويندوز 10</strong> </a>
	</li>
</ul>

<p>
	الأمور التي سنسلط الضوء عليها هي: تثبيت بايثون 3 على نظام تشغيلك ثم إعداد بيئته البرمجية. تتمثل عملية تهيئة البيئة البرمجية بإعداد بيئة وهمية تمكِّنك من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه يملك مجموعة من الاعتماديات (dependencies) والتي لن تؤثِّر على غيرها من المشاريع. يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
</p>

<p>
	بعد تثبيت بايثون وإكمال إعداد البيئة الوهمية، سنعلمك كيفية إنشاء برنامجٍ بسيطٍ يعرض العبارة «Hello World!‎» (أهلًا بالعالم!) الشهيرة، وبهذا سنتحقق من عمل البيئة عملًا صحيحًا، وستصبح آنذاك طريقة إنشاء برامج بايثون وتنفيذها مألوفةً لديك مما يمهد الطريق لكتابة وتنفيذ مشاريع بايثون اللاحقة.
</p>

<p>
	اختر مما يلي الدرس الخاص بنظام تشغيل حاسوبك (حاولنا شمل أشهر أنظمة التشغيل، لينكس وويندوز وماك) وانتقل إليه لاتباع الخطوات اللازمة لتنفيذ ما سبق.
</p>

<h2 id="-3-16-04-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-a9-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d9-81-d9-8a-d8-aa-d9-88-d8-b2-d9-8a-d8-b9-d8-a9-d8-a3-d9-88-d8-a8-d9-86-d8-aa-d9-88-1604-r401-">
	<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r401/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية في أوبنتو 16.04</a>
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r401/" rel=""><img alt="تثبيت بايثون على أوبنتو 1604.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30712" data-unique="5eiypx4wa" style="width: 573px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef461dca3e_1604.thumb.jpg.abefeff714784c54cc2f72874ad43690.jpg"></a>
</p>

<p>
	أوبنتو هي إحدى أشهر توزيعات نظام التشغيل لينكس. تأتي أنظمة لينكس غالبًا محملةً بنسخة بايثون مثبتة وجاهزة للعمل. مع ذلك، لا يكون الإصدار المُثبَّت مطابق للإصدار الذي نريده في بعض الأحيان. سيأخذ هذا الدرس بيدك لتعليمك كيفية تثبيت الإصدار 3 من بايثون على أوبنتو 16.04 مع ضبط بيئته البرمجية. سيشرح لك خطوةً بخطوة عملية تثبيت بايثون 3 على جهازك المحلي وضبط البيئة البرمجية عبر سطر الأوامر. صحيح أن هذه الخطوات مخصصة للإصدار 16.04 من أوبنتو، إلا أنه يمكن الاستفادة منها في التوزيعات الأخرى المعتمدة على ديبيان.
</p>

<h2 id="-3-18-04-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-d8-ae-d8-a7-d8-af-d9-85-d8-a3-d9-88-d8-a8-d9-86-d8-aa-d9-88-1804-r709-">
	<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r709/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية على أوبنتو 18.04</a>
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r709/" rel=""><img alt="تثبيت بايثون على أوبنتو.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30713" data-unique="8y0jwgqlf" style="width: 573px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef46394b4b_.thumb.jpg.b8f30e32076a894439dc6e77487a7fbc.jpg"></a>
</p>

<p>
	أوبنتو هي إحدى أشهر توزيعات نظام التشغيل لينكس والذي يحوي نسخة بايثون مثبَّتةً وجاهزةً للعمل. مع ذلك، لا يكون الإصدار المُثبَّت مطابقًا للإصدار الذي نريده في بعض الأحيان. سيرشدك هذا الدرس لكيفية تثبيت الإصدار 3 من بايثون على أوبنتو 18.04 مع ضبط بيئته البرمجية. سيشرح لك خطوةً بخطوة عملية تثبيت بايثون 3 على جهازك المحلي وضبط البيئة البرمجية عبر سطر الأوامر. صحيح أن هذه الخطوات مخصصة للإصدار 18.04 من أوبنتو، إلا أنه يمكن الاستفادة منها في التوزيعات الأخرى المعتمدة على ديبيان.
</p>

<h2 id="-3-8-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-d8-af-d8-a8-d9-8a-d8-a7-d9-86-8-r712-">
	<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-8-r712/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئة برمجية على ديبيان 8</a>
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-8-r712/" rel=""><img alt="تثبيت بايثون على ديبيان.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30714" data-unique="q7l9if041" style="width: 573px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef465b32a8_.thumb.jpg.09a7a72423bf78b7eabbace4c9e9a0e0.jpg"></a>
</p>

<p>
	ديبيان هي إحدى أشهر توزيعات نظام التشغيل لينكس أيضًا. تكون بايثون مثبتة في معظم أنظمة التشغيل لينكس ولكن لا يكون الإصدار المُثبَّت مطابقًا للإصدار الذي نريده في بعض الأحيان. سيرشدك هذا المقال خطوةً بخطوة لتثبيت بايثون 3 على جهازك المحلي ذي نظام التشغيل ديبيان 8 وضبط البيئة البرمجية عبر سطر الأوامر. صحيح أن هذه الخطوات مخصصة للإصدار 8 من ديبيان، إلا أنه يمكن الاستفادة منها في التوزيعات الأخرى المعتمدة على ديبيان.
</p>

<h2 id="-3-centos-7-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-centos-7-r711-">
	<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-centos-7-r711/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على CentOS 7</a>
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-centos-7-r711/" rel=""><img alt="تثبيت بايثون على cenOS.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30711" data-unique="i8ffg4g5e" style="width: 573px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef45ee891e_cenOS.thumb.jpg.a6725f7f22c93802154b7d90027ef502.jpg"></a>
</p>

<p>
	CentOS هي إحدى توزيعات نظام التشغيل لينكس أيضًا. تأتي أنظمة لينكس غالبًا محملةً بنسخة بايثون مثبتة وجاهزة للعمل. مع ذلك، لا يكون الإصدار المثبت مطابق للإصدار الذي نريده. سيأخذ هذا الدرس بيدك لتعليمك كيفية تثبيت الإصدار 3 من بايثون على CentOS 7 مع ضبط بيئته البرمجية واختبارها عبر سطر الأوامر.
</p>

<h2 id="-3-macos">
	<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-macos-r713/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على macOS</a>
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-macos-r713/" rel=""><img alt="تثبيت بايثون على ماك.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30715" data-unique="l5zwmk7gn" style="width: 573px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef467b90fb_.thumb.jpg.597eec02a0adfa94bc566e8fc910df74.jpg"></a>
</p>

<p>
	إن كان نظام تشغيلك هو macOS، فهذا الدرس هو لك. ستتلعم فيه خطوةً بخطوة كيفية تثبيت بايثون 3 على macOS، وتثبيت بيئتها البرمجية عبر سطر الأوامر، ولا تقلق إن لم يكن لديك أدنى فكرة عن استعمال سطر الأوامر. بدايةً، يشرح المقال كيفية تثبيت Xcode -هي بيئة تطوير متكاملة (IDE)- ثم تثبيت وإعداد Homebrew استعدادًا لتثبيت بايثون 3. ينتقل بعدها إلى إعداد البيئة الوهمية وإنشاء وتنفيذ برنامج بسيط (أشرنا إليه في آنفًا).
</p>

<h2 id="-3-10-https-academy-hsoub-com-programming-python-d9-83-d9-8a-d9-81-d9-8a-d8-a9-d8-aa-d8-ab-d8-a8-d9-8a-d8-aa-d8-a8-d8-a7-d9-8a-d8-ab-d9-88-d9-86-3-d9-88-d8-a5-d8-b9-d8-af-d8-a7-d8-af-d8-a8-d9-8a-d8-a6-d8-aa-d9-87-d8-a7-d9-84-d8-a8-d8-b1-d9-85-d8-ac-d9-8a-d8-a9-d8-b9-d9-84-d9-89-d9-88-d9-8a-d9-86-d8-af-d9-88-d8-b2-10-r710-">
	<a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r710/" rel="">كيفية تثبيت بايثون 3 وإعداد بيئته البرمجية على ويندوز 10</a>
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r710/" rel=""><img alt="تثبيت بايثون على ويندوز.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30716" data-unique="5pye29ns5" style="width: 573px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2ef469bd525_.thumb.jpg.d6d73d4b7aefe3135d25487ba47468ab.jpg"></a>
</p>

<p>
	إن كنت من مستخدمي نظام التشغيل الشهير ويندوز، فقد أتيت إلى الدرس الصحيح. سيُرشِدُك هذا الدرس خطوةً بخطوة إلى تثبيت بايثون 3 في ويندوز 10، وتهيئة بيئته البرمجية عبر سطر الأوامر. الخطوة الأولى لإنجاز ذلك هي فتح وإعداد PowerShell -برنامج من ميكروسوفت يوفر واجهة سطر الأوامر- ثم تثبيت مدير الحزم Chocolatey وذلك من أجل تثبيت بايثون 3. يُعرِّج بعدها على إعداد البيئة الوهمية وإنشاء برنامج بسيط وتنفيذه (أشرنا إليه في آنفًا).
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		 الدرس التالي: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك في بايثون 3</a>
	</li>
	<li>
		الدرس السابق: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		تعرف على أبرز <a href="https://academy.hsoub.com/programming/python/%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">مميزات لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">714</guid><pubDate>Tue, 23 Jul 2019 08:08:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x62A;&#x647; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x639;&#x644;&#x649; macOS</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-macos-r713/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d248ea2854f1_.jpg.84512942b140f1d78f977b4eaf87c4ba.jpg" /></p>

<p>
	بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development).
</p>

<p>
	ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون.
</p>

<p>
	سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 في macOS، وتثبيت بيئة برمجة عبر <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">سطر الأوامر</a>.
</p>

<h2 id="-">
	المتطلبات المسبقة
</h2>

<p>
	لمتابعة هذه المقالة، يجب أن تملك جهازًا عليه نظام macOS متصل بالشبكة مع صلاحيات مدير (administrative access).
</p>

<p>
	إذا لم تكن لك خبرة في التعامل مع بيئة النافذة الطرفية، فيمكنك مطالعة المقالة "<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30666" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d248e9fa0f34_.jpg.23533bd4543bca82299fc22bc946f59b.jpg" rel=""><img alt="تثبيت بايثون على ماك.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30666" data-unique="1vw3cvi79" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d248e9fbeade_.thumb.jpg.b13af9a3024a91320bcc6077ec8bddce.jpg"></a>
</p>

<h2 id="-">
	الخطوة الأولى: فتح نافذة الطرفية
</h2>

<p>
	سنجري معظم أطوار التثبيت والإعدادات عبر سطر الأوامر، والذي هو طريقةٌ غيرُ رسوميةٍ للتعامل مع الحاسوب، فبدلًا من الضغط على الأزرار، ستكتب نصًّا وتعطيه للحاسوب لينفذه، وسيُظهِر لك ناتجًا نصيًا أيضًا. يمكن أن يساعدك سطر الأوامر على تعديل أو أتمتة مختلف المهام التي تنجزها على الحاسوب يوميًا، وهو أداةٌ أساسيةٌ لمطوري البرمجيات.
</p>

<p>
	طرفية ماك (macOS Terminal) هي تطبيق يمكنك استخدامه للدخول إلى واجهة سطر الأوامر. مثل التطبيقات الأخرى، ستجد تطبيق الطرفية بالذهاب إلى Finder، وفتح المجلد Applications، ثم الذهاب إلى المجلد Utilities، ثم النقر المزدوج على Terminal لفتحه. أو يمكنك استخدام Spotlight عبر الضغط على الزرّين <code>command</code> و <code>spacebar</code> للعثور على Terminal بكتابته في المربع الذي سيظهر.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30665" href="https://academy.hsoub.com/uploads/monthly_2019_07/MacOSXSetUp.png.104eb7fcfd5845f5c65a89afc826c46d.png" rel=""><img alt="MacOSXSetUp.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30665" data-unique="s5by5k3nm" src="https://academy.hsoub.com/uploads/monthly_2019_07/MacOSXSetUp.thumb.png.b276243df7e75deb602c2efe0404a1e4.png"></a>
</p>

<p>
	هنالك الكثير من الأوامر التي عليك تعلمها لكي تتمكن من الاستفادة منه. هنالك مقالات في أكاديمية حسوب (كدرس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>) ستعلمك أساسيات سطر الأوامر، وهنالك كتاب «<a href="http://sourceforge.net/projects/omlx/files/open%20books/TLCL/The_Linux_Command_Line-arabic-14.07.pdf/download" rel="external nofollow">سطر أوامر لينكس</a>» الذي يُعتَبر مرجعًا لطريقة التعامل مع سطر الأوامر في لينكس، والذي يشبه نظيره في ماك.
</p>

<h2 id="-xcode">
	الخطوة الثانية: تثبيت Xcode
</h2>

<p>
	Xcode هي بيئة تطوير متكاملة (IDE) تتألف من أدوات تطوير البرامج لنظام التشغيل MacOS. قد يكون Xcode مثبتًا عندك سلفًا. للتحقق من ذلك، اكتب في نافذة الطرفية ما يلي:
</p>

<pre class="ipsCode">
xcode-<span class="hljs-keyword">select</span> -p
</pre>

<p>
	إن حصلت على المخرجات التالية، فهذا يعني أنّ مثبت Xcode:
</p>

<pre class="ipsCode">
<span class="hljs-regexp">/Library/</span>Developer<span class="hljs-regexp">/CommandLineTools</span>
</pre>

<p>
	إن تلقيت خطأ، فتثّبت <a href="https://itunes.apple.com/us/app/xcode/id497799835?mt=12&amp;ign-mpt=uo%3D2" rel="external nofollow">Xcode من المتجر App Store</a> واعتمد الخيارات الافتراضية.
</p>

<p>
	بعد تثبيت Xcode، ارجع إلى النافذة الطرفية. ثم ثبّت التطبيق Command Line Tools عن طريق كتابة:
</p>

<pre class="ipsCode">
xcode-<span class="hljs-keyword">select</span> <span class="hljs-comment">--install</span>
</pre>

<p>
	عند هذه المرحلة، يكون قد تم تثبيت Xcode، والتطبيق Command Line Tools الخاص به، ونحن الآن مستعدون لتثبيت مدير الحزم Homebrew.
</p>

<h2 id="-homebrew">
	الخطوة الثالثة: تثبيت وإعداد Homebrew
</h2>

<p>
	في حين أنّ طرفية OS X تتمتع بالكثير من وظائف طرفية لينكس وأنظمة يونيكس الأخرى، إلا أنها لا تأتي بمدير حزم جيد. <strong>مدير الحزم</strong> (package manager) هو مجموعة من أدوات البرمجيات التي تعمل على أتمتة عمليات التثبيت، بما في ذلك التثبيت الأولي للبرامج، وترقيتها، وإعدادها، وإزالتها عند الحاجة. تحفظ هذه الأدوات التثبيتات في موقع مركزي، ويمكنها صيانة جميع حزم البرامج على النظام وفق تنسيقات (formats) معروفة. توفر <strong>Homebrew</strong> لنظام التشغيل OS X نظام إدارة حزم مجاني ومفتوح المصدر يبسط عملية تثبيت البرنامج.
</p>

<p>
	لتثبيت Homebrew، اكتب في نافذة الطرفية ما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-regexp">/usr/</span>bin<span class="hljs-regexp">/ruby -e "$(curl -fsSL https:/</span><span class="hljs-regexp">/raw.githubusercontent.com/</span>Homebrew<span class="hljs-regexp">/install/m</span>aster<span class="hljs-regexp">/install)"</span>
</pre>

<p>
	تم تطوير Homebrew عبر <a href="https://wiki.hsoub.com/Ruby" rel="external">روبي</a>، لذلك سيعدّل مسار روبي على جهازك. يسحب الأمر <code>curl</code> السكربت من عنوان URL المحدد. سيوضح ذلك السكربت ما سيفعله، ثم يوقف العملية ليطلب منك التأكيد. يوفر لك هذا الكثير من الملاحظات حول ما سيفعله السكربت في نظامك، ويمنحك الفرصة للتحقق من العملية.
</p>

<p>
	لاحظ أنك عند إدخال كلمة المرور فلن تعرض الطرفية المحارف التي تكتبها، ولكنها ستُسجّل، بعد إدخال كلمة المرور اضغط على الزر <code>return</code>. واضغط على الحرف <code>y</code> إن طُلِب منك تأكيد التثبيت.
</p>

<p>
	لنلق نظرة على الرايات (flags) المرتبطة بالأمر <code>curl</code>:
</p>

<ul>
<li>
		تخبر الرايتان <code>‎-f</code> أو <code>‎--fail</code> الطرفية بعدم إعطاء مخرجات على هيئة مستند HTML عند حدوث أخطاء في الخادم.
	</li>
	<li>
		تُصمِت الرايتان <code>‎-s</code> أو <code>‎--silent</code> الأمر <code>curl</code>، بمعنى أنه لن يعرض معلومات التقدم، وعند جمعها مع الرايتين <code>‎-S</code> أو <code>‎--show-error</code>، ستجعل <code>curl</code> تُظهر رسالة خطأ في حال الفشل.
	</li>
	<li>
		تطلب الرايتان <code>‎-L</code> أو <code>‎--location</code> من <code>curl</code> إعادة الطلبية (request) إلى مكان جديد إذا أبلغ الخادم بأنّ الصفحة المطلوبة قد نُقِلت إلى موقع أخر.
	</li>
</ul>
<p>
	بمجرد اكتمال عملية التثبيت، سنضع مجلد Homebrew في أعلى متغير البيئة <code>PATH</code>. سيضمن ذلك أن يتم استدعاء عمليات تثبيت Homebrew عبر الأدوات التي قد يختارها نظام التشغيل Mac OS X تلقائيًا، والتي قد تتعارض مع بيئة التطوير التي تنشئها.
</p>

<p>
	يجب عليك إنشاء أو فتح الملف <code>‎~/.bash_profile</code> باستخدام محرر نصوص سطر الأوامر <strong>nano</strong> باستخدام الأمر <code>nano</code>:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">nano</span> ~/.bash_profile
</pre>

<p>
	بعد فتح الملف في نافذة الطرفية، اكتب ما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">export</span> PATH=/usr/<span class="hljs-built_in">local</span>/bin:<span class="hljs-variable">$PATH</span>
</pre>

<p>
	لحفظ التغييرات، اضغط على المفتاح <code>control</code> والحرف <code>o</code> بالتزامن، وعند مطالبتك بالتأكيد، اضغط على المفتاح <code>return</code>. يمكنك الآن الخروج من nano عن طريق الضغط على المفتاح <code>control</code> والحرف <code>x</code> بالتزامن.
</p>

<p>
	لتفعيل هذه التغييرات، اكتب في نافذة الطرفية:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">source</span> ~/.bash_profile
</pre>

<p>
	ستصير الآن التغييرات التي أجريتها على متغير البيئة <code>PATH</code> فعالة.
</p>

<p>
	يمكننا التحقق من أنّ Homebrew قد ثُبِّت بنجاح عن طريق كتابة:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">brew </span>doctor
</pre>

<p>
	إذا لم تكن هناك حاجة إلى أي تحديثات في هذا الوقت، فستطبع الطرفية ما يلي:
</p>

<pre class="ipsCode">
Your <span class="hljs-built_in">system</span> <span class="hljs-keyword">is</span> ready <span class="hljs-keyword">to</span> brew.
</pre>

<p>
	خلاف ذلك، قد تحصل على تنبيه يدعوك إلى تنفيذ أمر آخر مثل <code>brew update</code> للتأكد من أنّ Homebrew محدّث.
</p>

<p>
	بمجرد أن تصبح Homebrew جاهزة، يمكنك تثبيت بايثون 3.
</p>

<h2 id="-3">
	المرحلة الرابعة: تثبيت بايثون 3
</h2>

<p>
	يمكنك استخدام Homebrew للبحث عن البرامج التي يمكنك تثبيتها عبر الأمر <code>brew search</code>، ويمكنك الحصول على قائمة الحزم والوحدات ذات العلاقة ببايثون فقط عبر كتابة:
</p>

<pre class="ipsCode">
brew <span class="hljs-built_in">search</span> <span class="hljs-keyword">python</span>
</pre>

<p>
	نافذة الطرفية ستخرج قائمة من الحزم والوحدات التي يمكنك تثبيتها على النحو التالي:
</p>

<pre class="ipsCode">
app-engine-<span class="hljs-keyword">python</span>          micropython                <span class="hljs-keyword">python3</span>                 
boost-<span class="hljs-keyword">python</span>               <span class="hljs-keyword">python</span>                     wxpython                 
gst-<span class="hljs-keyword">python</span>                 <span class="hljs-keyword">python</span>-markdown            zpython                  
homebrew/apache/mod_python               homebrew/versions/gst-python010        
homebrew/<span class="hljs-keyword">python</span>/<span class="hljs-keyword">python</span>-dbus              Caskroom/cask/kk7ds-<span class="hljs-keyword">python</span>-<span class="hljs-keyword">runtime</span>     
homebrew/<span class="hljs-keyword">python</span>/vpython                  Caskroom/cask/mysql-connector-<span class="hljs-keyword">python</span>
</pre>

<p>
	سيكون بايثون 3 (python3) من بين العناصر المدرجة في القائمة. لذلك دعنا نثبّتها:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">brew </span><span class="hljs-keyword">install </span>python3
</pre>

<p>
	ستعرض لك نافذة الطرفية ملاحظات بشأن عملية تثبيت بايثون 3، وقد يستغرق الأمر بضع دقائق قبل اكتمال التثبيت.
</p>

<p>
	إلى جانب بايثون 3، ستثبّت Homebrew الأدوات <strong>pip</strong> و <strong>setuptools</strong> و <strong>wheel</strong>.
</p>

<p>
	سنستخدم <a href="https://academy.hsoub.com/questions/5121-%D9%83%D9%8A%D9%81-%D8%A3%D9%82%D9%88%D9%85-%D8%A8%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AD%D8%B2%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-pip%D8%9F/#comment-10868" rel="">pip</a>، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">كيفية استيراد الوحدات في بايثون 3</a> من هذه السلسلة.
</p>

<p>
	يمكن تثبيت حزم بايثون بكتابة ما يلي:
</p>

<pre class="ipsCode">
pip<span class="hljs-number">3</span> install <span class="hljs-keyword">package</span><span class="hljs-number">_n</span>ame
</pre>

<p>
	عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان <code>package_name</code> مثل Django لتطوير الويب، أو NumPy لإجراء الحسابات العلمية. لذا، إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر <code>pip3 install numpy</code>.
</p>

<p>
	تسهّل الأداة <strong>setuptools</strong> تحزيم مشاريع بايثون، أما <strong>wheel</strong> فهي تنسيق حُزم (built-package format) لبايثون يمكنه تسريع إنتاجية البرامج عن طريق تقليل عدد المرات التي تحتاج فيها إلى التصريف.
</p>

<p>
	بعد إكمال العملية، يمكننا التحقق من إصدار بايثون 3 المُثبّت في النظام بكتابة:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">python3</span> --<span class="hljs-keyword">version</span>
</pre>

<p>
	ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. والذي سيكون افتراضيًا أحدث إصدار مستقر ومتاح من بايثون 3.
</p>

<p>
	لتحديث إصدار بايثون 3، يمكنك أولاً تحديث Homebrew، ثم تحديث بايثون:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">brew </span>update
<span class="hljs-keyword">brew </span>upgrade python3
</pre>

<p>
	من الممارسات الجيدة تحديث إصدار بايثون الذي تعمل به من حين لآخر.
</p>

<h2 id="-">
	الخطوة الخامسة: إعداد بيئة افتراضية
</h2>

<p>
	الآن بعد تثبيت Xcode و Homebrew وبايثون، يمكننا المضي قدمًا لإنشاء بيئة البرمجة خاصتنا.
</p>

<p>
	تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع.
</p>

<p>
	يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
</p>

<p>
	يمكنك ضبط أيّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في حاسوبك يحتوي على عدد من السكربتات.
</p>

<p>
	اختر المجلد الذي تريد أن تضع فيه بيئات بايثون، أو يمكنك إنشاء مجلد جديد باستخدام الأمر <code>mkdir</code> كما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">mkdir</span> environments
<span class="hljs-built_in">cd</span> environments
</pre>

<p>
	بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">python3</span><span class="hljs-selector-class">.6</span> <span class="hljs-selector-tag">-m</span> <span class="hljs-selector-tag">venv</span> <span class="hljs-selector-tag">my_env</span>
</pre>

<p>
	سيُنشِئ هذا الأمر مجلدًا جديدًا (في هذه الحالة يُسمى <code>my_env</code>) فيه بعض الملفات:
</p>

<ul>
<li>
		يشير الملف <code>pyvenv.cfg</code> إلى توزيعة بايثون التي استخدمتها لتنفيذ الأمر.
	</li>
	<li>
		يحتوي المجلد الفرعي <code>lib</code> نسخة من إصدار بايثون، ويحتوي على مجلد يسمى <code>site-packages</code>، والذي سيكون فارغًا في البداية، ولكنه سيُستخدم لتخزين وحدات الطرف الثالث التي ستثبّتها.
	</li>
	<li>
		المجلد الفرعي <code>include</code> يُصرِّف (packages) الحزم.
	</li>
	<li>
		يحتوي المجلد الفرعي <code>bin</code> نسخة من رُقامة بايثون (Python binary) جنبًا إلى جنب مع سكربت التفعيل (activate shell script) الذي سيُستخدم
	</li>
</ul>
<p>
	تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها.
</p>

<p>
	عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">source</span> my_env<span class="hljs-regexp">/bin/</span>activate
</pre>

<p>
	يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها <code>my_env</code>، وهذا يعني أننا لن سنستخدم إلا إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك داخل البيئة الافتراضية أن تستخدم الأمر <code>python</code> بدلًا من <code>python3</code> والأمر <code>pip</code> بدلًا من <code>pip3</code> إن شئتَ. أما إذا كنتَ تستخدم بايثون 3 خارج البيئة الافتراضية، فيجب عليك حينها استخدام <code>python3</code> و <code>pip3</code> حصرًا. لأنّ <code>python</code> و<code>pip</code> ستستدعيان إصدارًا قديمًا من بايثون.
</p>

<p>
	يجب أن تكون بيئتك الافتراضية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة.
</p>

<h2 id="-">
	الخطوة الثالثة: إنشاء برنامج بسيط
</h2>

<p>
	بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «مرحبا بالعالم!»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة.
</p>

<p>
	علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر nano الذي يعمل من سطر الأوامر:
</p>

<pre class="ipsCode">
(my_env) sammys-<span class="hljs-symbol">MBP:</span>~ sammy<span class="hljs-variable">$ </span>nano hello.py
</pre>

<p>
	بعد فتح الملف في نافذة الطرفية، سنكتب البرنامج الخاص بنا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8670_7" style="">
<span class="kwd">print</span><span class="pun">(</span><span class="str">"مرحبا بالعالم!"</span><span class="pun">)</span></pre>

<p>
	أغلق محرر nano بالضغط على <code>Ctrl+x</code> ثم اضغط على <code>y</code> عندما يسألك عن حفظ الملف.
</p>

<p>
	بعد أن يُغلَق المحرر nano وتعود إلى سطر الأوامر، حاول تنفيذ البرنامج:
</p>

<pre class="ipsCode">
(my_env) sammys-MBP:~ sammy$  <span class="hljs-keyword">python</span> hello.<span class="hljs-keyword">py</span>
</pre>

<p>
	سيؤدي برنامج <code>hello.py</code> الذي أنشأتَه إلى طباعة الناتج التالي في الطرفية:
</p>

<pre class="ipsCode">
مرحبا بالعالم!
</pre>

<p>
	للخروج من البيئة، اكتب الأمر <code>deactivate</code> وستعود إلى مجلدك الأصلي.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في نظام Mac OS X، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-macos" rel="external nofollow">How To Install Python 3 and Set Up a Local Programming Environment on macOS</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">713</guid><pubDate>Fri, 19 Jul 2019 08:06:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x62A;&#x647; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x639;&#x644;&#x649; &#x62F;&#x628;&#x64A;&#x627;&#x646; 8</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-8-r712/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d248c87dff52_.jpg.8966e4d4e66b700b7eb95d78a5473c8c.jpg" /></p>

<p>
	بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development).
</p>

<p>
	ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون.
</p>

<p>
	سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 على لينيكس، وتثبيت بيئة برمجة عبر <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">سطر الأوامر</a>. صحيحٌ أنَّ هذا الدرس يشرح عملية التثبيت في دبيان 8، إلا أنَّ المفاهيم الأساسية فيه تنطبق على جميع توزيعات دبيان لينيكس (Debian Linux).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30663" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d248c82f10c2_.jpg.6384864c56865279d40a8c6d7291b7b6.jpg" rel=""><img alt="تثبيت بايثون على ديبيان.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30663" data-unique="o8qirqj21" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d248c8312aa2_.thumb.jpg.c26ceb390fbd0b3cfd9c0ea4f28d97d6.jpg"></a>
</p>

<h2 id="-">
	المتطلبات المسبقة
</h2>

<p>
	لمتابعة هذه المقالة، يجب أن تملك صلاحيات مستخدم غير جذري (non-root user ) مع امتيازات <code>sudo</code> على توزيعة دبيان 8، أو توزيعة أخرى من دبيان لينيكس (Debian Linux).
</p>

<p>
	إذا لم تكن لك خبرة في التعامل مع بيئة النافذة الطرفية، فيمكنك مطالعة المقالة "<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>".
</p>

<h2 id="-3">
	الخطوة الأولى: إعداد بايثون 3
</h2>

<p>
	سنُثبِّت ونضبط بايثون عبر سطر الأوامر، والذي هو طريقةٌ غيرُ رسوميةٍ للتعامل مع الحاسوب، فبدلًا من الضغط على الأزرار، ستكتب نصًّا وتعطيه للحاسوب لينفذه، وسيُظهِر لك ناتجًا نصيًا أيضًا. يمكن أن يساعدك سطر الأوامر على تعديل أو أتمتة مختلف المهام التي تنجزها على الحاسوب يوميًا، وهو أداةٌ أساسيةٌ لمطوري البرمجيات، وهنالك الكثير من الأوامر التي عليك تعلمها لكي تتمكن من الاستفادة منه. هنالك مقالات في أكاديمية حسوب (كدرس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>) ستعلمك أساسيات سطر الأوامر، وهنالك كتاب «<a href="http://sourceforge.net/projects/omlx/files/open%20books/TLCL/The_Linux_Command_Line-arabic-14.07.pdf/download" rel="external nofollow">سطر أوامر لينكس</a>» الذي يُعتَبر مرجعًا لطريقة التعامل مع سطر الأوامر.
</p>

<p>
	ستجد تطبيق «Terminal» (البرنامج الذي تستعمله للوصول إلى سطر الأوامر) بفتح القائمة في الزاوية السفلى اليسرى من الشاشة ثم كتابة «terminal» في شريط البحث، ثم الضغط على أيقونة التطبيق التي ستظهر بعدئذٍ. أو يمكنك أن تضغط على <code>Ctrl+Alt+T</code> في لوحة المفاتيح بنفس الوقت لتشغيل تطبيق الطرفية Terminal.
</p>

<p>
	<img alt="DebianSetUp.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30662" data-unique="id7w1wes0" src="https://academy.hsoub.com/uploads/monthly_2019_07/DebianSetUp.png.be2ecacec4407395e537d37cd1207b09.png"></p>

<p>
	في دبيان 8 والإصدارات الأخرى من دبيان لينكس، ستجد كلًا من بايثون 3 وبايثون 2 مثبتين مسبقًا. للتأكد من أنّ إصدارات بايثون حديثة، سنحدّث النظام ونرقّيه باستخدام الأمر <code>apt-get</code>:
</p>

<pre class="ipsCode">
sudo apt-<span class="hljs-built_in">get</span> <span class="hljs-keyword">update</span>
sudo apt-<span class="hljs-built_in">get</span> -y upgrade
</pre>

<p>
	الخيار <code>‎-y</code> يعني أنَّك توافق على تثبيت جميع الحزم القابلة للتحديث، لكن قد تحتاج إلى تأكيد ذلك عند تحديث النظام وذلك اعتمادًا على الحزم التي ستُحدَّث، ونسخة لينكس.
</p>

<p>
	بعد إكمال العملية، يمكننا التحقق من إصدار بايثون 3 المُثبّت في النظام بكتابة:
</p>

<pre class="ipsCode">
pytho<span class="hljs-symbol">n3</span> -V
</pre>

<p>
	ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. قد يختلف الرقم بناءً على النسخة المثبتة في توزيعتك، لكن يجب أن يكون شبيهًا بما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">Python</span> 3<span class="hljs-selector-class">.5</span><span class="hljs-selector-class">.2</span>
</pre>

<p>
	لإدارة الحزم البرمجية الخاصة ببايثون، سنثبّت <a href="https://academy.hsoub.com/questions/5121-%D9%83%D9%8A%D9%81-%D8%A3%D9%82%D9%88%D9%85-%D8%A8%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AD%D8%B2%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-pip%D8%9F/#comment-10868" rel="">pip</a>، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">كيفية استيراد الوحدات في بايثون 3</a> من هذه السلسلة:
</p>

<pre class="ipsCode">
sudo apt-<span class="hljs-built_in">get</span> install -<span class="hljs-keyword">y</span> <span class="hljs-keyword">python3</span>-pip
</pre>

<p>
	يمكن تثبيت حزم بايثون بكتابة ما يلي:
</p>

<pre class="ipsCode">
pip<span class="hljs-number">3</span> install <span class="hljs-keyword">package</span><span class="hljs-number">_n</span>ame
</pre>

<p>
	حيث عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان <code>package_name</code> مثل Django لتطوير الويب، أو NumPy لإجراء الحسابات العلمية. لذا، إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر <code>pip3 install numpy</code>.
</p>

<p>
	هناك عدة حزم وأدوات تطوير أخرى يجب تثبيتها للتأكد من أنّ بيئة البرمجة جاهزة:
</p>

<pre class="ipsCode">
sudo apt-<span class="hljs-built_in">get</span> install build-essential libssl-<span class="hljs-built_in">dev</span> libffi-<span class="hljs-built_in">dev</span> python-<span class="hljs-built_in">dev</span>
</pre>

<p>
	بعد أن انتهينا من ضبط بايثون وتثبيت pip، يمكننا الآن إنشاء «بيئة افتراضية» (virtual environment) لمشاريعنا.
</p>

<h2 id="-">
	الخطوة الثانية: إعداد بيئة افتراضية
</h2>

<p>
	تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع.
</p>

<p>
	يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
</p>

<p>
	يمكنك ضبط أيُّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في حاسوبك يحتوي على عدد من السكربتات.
</p>

<p>
	هناك عدة طرق لإعداد بيئة برمجية في بايثون، لكننا سنستخدم وحدة (module) برمجية باسم <strong>venv</strong>، وهي جزءٌ من مكتبة بايثون 3 القياسية. سنثبّت venv على نظامنا بكتابة:
</p>

<pre class="ipsCode">
sudo apt-<span class="hljs-built_in">get</span> install -<span class="hljs-keyword">y</span> <span class="hljs-keyword">python3</span>-venv
</pre>

<p>
	بعد إتمام التثبيت، فنحن جاهزون لإنشاء البيئات الافتراضية، يمكننا الآن إما اختيار مجلد نضع فيه بيئات بايثون، أو إنشاء مجلد جديد باستخدام الأمر <code>mkdir</code> كما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">mkdir</span> environments
<span class="hljs-built_in">cd</span> environments
</pre>

<p>
	بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">python3</span><span class="hljs-selector-class">.6</span> <span class="hljs-selector-tag">-m</span> <span class="hljs-selector-tag">venv</span> <span class="hljs-selector-tag">my_env</span>
</pre>

<p>
	سيُنشِئ الأمر <code>pyvenv</code> مجلدًا جديدًا فيه بعض الملفات التي يمكن عرضها باستخدام الأمر <code>ls</code>:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">ls</span> my_env
</pre>

<p>
	ستظهر لك مخرجات شبيهة بالمخرجات التالية:
</p>

<pre class="ipsCode">
bin <span class="hljs-keyword">include</span> <span class="hljs-class"><span class="hljs-keyword">lib</span> <span class="hljs-title">lib64</span> <span class="hljs-title">pyvenv</span>.<span class="hljs-title">cfg</span> <span class="hljs-title">share</span></span>
</pre>

<p>
	تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها. تتوافر أيضًا Python Wheels، والتي هي صيغة بناء حزمٍ (built-package format) لبايثون، والتي يمكن أن تُسرِّع من تطوير البرامج بتقليل عدد المرات التي تحتاج فيها إلى تصريف (compile) المشروع، وهي موجودةٌ في كل المجلدات المُسمّاة <code>lib</code>.
</p>

<p>
	عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">source</span> my_env<span class="hljs-regexp">/bin/</span>activate
</pre>

<p>
	يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها <code>my_env</code>، وقد يكون مظهر المِحَث مختلفًا في توزيعة دبيان، وذلك اعتمادًا على الإصدار المستخدم؛ لكن يجب أن تشاهد اسم البيئة بين قوسين في بداية السطر:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@sammy</span><span class="hljs-symbol">:~/environments</span>$
</pre>

<p>
	ستسمح لك السابقة بمعرفة أنَّ البيئة <code>my_env</code> مفعلة حاليًا، وهذا يعني أننا سنستخدم إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك داخل البيئة الافتراضية أن تستخدم الأمر <code>python</code> بدلًا من <code>python3</code> والأمر <code>pip</code> بدلًا من <code>pip3</code> إن شئتَ. أما إذا كنتَ تستخدم بايثون 3 خارج البيئة الافتراضية، فيجب عليك حينها استخدام <code>python3</code> و <code>pip3</code> حصرًا.
</p>

<p>
	يجب أن تكون بيئتك الافتراضية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة.
</p>

<h2 id="-">
	الخطوة الثالثة: إنشاء برنامج بسيط
</h2>

<p>
	بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «مرحبا بالعالم!»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة.
</p>

<p>
	علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر nano الذي يعمل من سطر الأوامر:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@sammy</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>nano hello.py
</pre>

<p>
	بعد فتح الملف في نافذة الطرفية، سنكتب البرنامج الخاص بنا:
</p>

<pre class="ipsCode">
<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(<span class="hljs-string">"مرحبا بالعالم!"</span>)</span></span>
</pre>

<p>
	أغلق محرر nano بالضغط على <code>Ctrl+x</code> ثم اضغط على <code>y</code> عندما يسألك عن حفظ الملف.
</p>

<p>
	بعد أن يُغلَق المحرر nano وتعود إلى سطر الأوامر، حاول تنفيذ البرنامج:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@sammy</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>python hello.py
</pre>

<p>
	سيؤدي برنامج <code>hello.py</code> الذي أنشأتَه إلى طباعة الناتج التالي في الطرفية:
</p>

<pre class="ipsCode">
مرحبا بالعالم!
</pre>

<p>
	للخروج من البيئة، اكتب الأمر <code>deactivate</code> وستعود إلى مجلدك الأصلي.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في نظام لينكس دبيان، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-debian-8" rel="external nofollow">How To Install Python 3 and Set Up a Local Programming Environment on Debian 8</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">712</guid><pubDate>Thu, 18 Jul 2019 18:04:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x62A;&#x647; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x639;&#x644;&#x649; CentOS 7</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-centos-7-r711/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d248a55af279_cenOS.jpg.7260570471de6bde0b174f80521a890d.jpg" /></p>

<p>
	بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development).
</p>

<p>
	ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون.
</p>

<p>
	سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 على CentOS 7، وتثبيت بيئة برمجة عبر <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">سطر الأوامر</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30661" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d248a5142a76_cenOS.jpg.267fb6ccf4cd10ad97134a225c46a340.jpg" rel=""><img alt="تثبيت بايثون على cenOS.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30661" data-unique="wt93hsr5o" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d248a5158f0b_cenOS.thumb.jpg.08de80dcd06ff045419e64c9f9dab36a.jpg"></a>
</p>

<h2 id="-">
	المتطلبات المسبقة
</h2>

<p>
	لمتابعة هذه المقالة، يجب أن تملك صلاحيات مستخدم أساسي غير جذري (non-root superuser) على نظام CentOS 7 متصل بالشبكة.
</p>

<p>
	إذا لم تكن لك خبرة في التعامل مع بيئة النافذة الطرفية، فيمكنك مطالعة المقالة "<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>".
</p>

<h2 id="-">
	الخطوة الأولى: تحضير النظام
</h2>

<p>
	سنُثبِّت ونضبط بايثون عبر سطر الأوامر، إن كان نظام CentOS 7 يبدأ بسطح مكتب ذي واجهة مستخدم رسومية (GUI)، فيمكنك الدخول إلى <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">سطر الأوامر</a> بفتح القائمة، والدخول إلى Applications ثم Utilities ثم النقر على Terminal. هنالك مقالات في أكاديمية حسوب (كدرس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>) ستعلمك أساسيات سطر الأوامر، وهنالك كتاب «<a href="http://sourceforge.net/projects/omlx/files/open%20books/TLCL/The_Linux_Command_Line-arabic-14.07.pdf/download" rel="external nofollow">سطر أوامر لينكس</a>» الذي يُعدُّ مرجعًا لطريقة التعامل مع سطر الأوامر.
</p>

<p>
	سنستخدم أداة إدارة الحزم مفتوحة المصدر <strong>yum</strong> (اختصار للعبارة Yellowdog Updater Modified). هذه أداة شائعة الاستخدام لإدارة الحزم على أنظمة لينكس المستندة إلى Red Hat، مثل CentOS. ستتيح لك هذه الأداة تثبيت الحزم وتحديثها بسهولة، وكذلك إزالة الحزم من الجهاز.
</p>

<p>
	قبل أن نبدأ التثبيت، دعنا نتأكد من أنّ لدينا أحدث إصدار من yum عبر تنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">sudo yum -y update</span>
</pre>

<p>
	الخيار <code>‎-y</code> يعني أنَّك تدرك أنّك تحدث تغييرات، وذلك لمنع الطرفية من طلب تأكيد قبل تنفيذ الأمر.
</p>

<p>
	سنثبّت الآن <strong>yum-utils</strong>، وهي حزمة من الأدوات والإضافات التي توسّع yum وتكمّلها:
</p>

<pre class="ipsCode">
sudo yum -y <span class="hljs-keyword">install</span> yum-utils
</pre>

<p>
	أخيرًا، سنثبّت أدوات التطوير الخاصة بنظام CentOS، والتي تُستخدم لإنشاء وتصريف (compile) البرامج من الشيفرة المصدرية:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">sudo yum -y groupinstall development</span>
</pre>

<p>
	بمجرد تثبيت كل شيء، فنحن جاهزون لتثبيت بايثون 3.
</p>

<h2 id="-3">
	المرحلة الثانية: تثبيت وإعداد بايثون 3
</h2>

<p>
	نظام CentOS مشتق من RHEL (اختصار للجملة Red Hat Enterprise Linux) ، والذي يركز على الثبات والاستقرار. ولهذا السبب، فلن تجد في هذا النظام إلا الإصدارات المستقرة والمُختبرة من التطبيقات والحزم القابلة للتنزيل، لذلك لن تجد على CentOS إلا الإصدار بايثون 2.
</p>

<p>
	نظرًا لأننا نرغب في تثبيت أحدث إصدار مستقر من بايثون 3، فسنحتاج إلى تثبيت <strong>IUS</strong> (اختصار للعبارة Inline with Upstream Stable)، وهو مشروع مفتوح المصدر. يوفر IUS حزم Red Hat Package Manager ‏(RPM) لبعض الإصدارات الحديثة من البرامج المحددة.
</p>

<p>
	سنثبت IUS عبر <code>yum</code>:
</p>

<pre class="ipsCode">
sudo yum -y install <span class="hljs-string">https:</span><span class="hljs-comment">//centos7.iuscommunity.org/ius-release.rpm</span>
</pre>

<p>
	بعد الانتهاء من تثبيت IUS، يمكننا تثبيت أحدث إصدار من بايثون:
</p>

<pre class="ipsCode">
sudo yum -y <span class="hljs-keyword">install</span> python36u
</pre>

<p>
	بعد إكمال العملية، يمكننا التحقق من نجاح عملية التثبيت بطلب إصدار بايثون بكتابة:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">python3</span><span class="hljs-selector-class">.6</span> <span class="hljs-selector-tag">-V</span>
</pre>

<p>
	ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. قد يختلف الرقم بناءً على النسخة المثبتة في توزيعتك، لكن يجب أن يكون شبيهًا بما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">Python</span> 3<span class="hljs-selector-class">.6</span><span class="hljs-selector-class">.1</span>
</pre>

<p>
	لإدارة الحزم البرمجية الخاصة ببايثون، سنثبّت <a href="https://academy.hsoub.com/questions/5121-%D9%83%D9%8A%D9%81-%D8%A3%D9%82%D9%88%D9%85-%D8%A8%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AD%D8%B2%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-pip%D8%9F/#comment-10868" rel="">pip</a>، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">كيفية استيراد الوحدات في بايثون 3</a> من هذه السلسلة:
</p>

<pre class="ipsCode">
sudo yum -y <span class="hljs-keyword">install</span> python36u-pip
</pre>

<p>
	يمكن تثبيت حزم بايثون بكتابة ما يلي:
</p>

<pre class="ipsCode">
sudo pip<span class="hljs-number">3.6</span> install <span class="hljs-keyword">package</span><span class="hljs-number">_n</span>ame
</pre>

<p>
	حيث عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان <code>package_name</code> مثل <a href="https://academy.hsoub.com/tags/django/" rel="">Django</a> لتطوير الويب، أو NumPy لإجراء الحسابات العلمية. لذا، إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر <code>pip3.6 install numpy</code>.
</p>

<p>
	أخيرًا، سنحتاج إلى تثبيت الحزمة <strong>python36u-devel</strong> الخاصة بـ IUS، والتي توفر لنا مكتبات وملفات ترويسية (header files) ضرورية للتطوير على بايثون 3:
</p>

<pre class="ipsCode">
sudo yum -y <span class="hljs-keyword">install</span> python36u-devel
</pre>

<p>
	سنستخدم الوحدة <strong>venv</strong> لإعداد «بيئة افتراضية» (virtual environment) لمشاريعنا.
</p>

<h2 id="-">
	الخطوة الثالثة: إعداد بيئة افتراضية
</h2>

<p>
	الآن بعد أن ثبّتنا بايثون وأعددنا النظام، يمكننا المضي قدمًا لإنشاء بيئة البرمجة التي سنعمل فيها باستخدام venv.
</p>

<p>
	تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع.
</p>

<p>
	يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
</p>

<p>
	يمكنك ضبط أيّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في حاسوبك يحتوي على عدد من السكربتات.
</p>

<p>
	بعد إتمام التثبيت، فنحن جاهزون لإنشاء البيئات الافتراضية، يمكننا الآن إما اختيار مجلد نضع فيه بيئات بايثون، أو إنشاء مجلد جديد باستخدام الأمر <code>mkdir</code> كما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">mkdir</span> environments
<span class="hljs-built_in">cd</span> environments
</pre>

<p>
	بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">python3</span><span class="hljs-selector-class">.6</span> <span class="hljs-selector-tag">-m</span> <span class="hljs-selector-tag">venv</span> <span class="hljs-selector-tag">my_env</span>
</pre>

<p>
	سيُنشِئ الأمر <code>pyvenv</code> مجلدًا جديدًا فيه بعض الملفات التي يمكن عرضها باستخدام الأمر <code>ls</code>:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">ls</span> my_env
</pre>

<p>
	ستظهر لك مخرجات شبيهة بالمخرجات التالية:
</p>

<pre class="ipsCode">
bin <span class="hljs-keyword">include</span> <span class="hljs-class"><span class="hljs-keyword">lib</span> <span class="hljs-title">lib64</span> <span class="hljs-title">pyvenv</span>.<span class="hljs-title">cfg</span></span>
</pre>

<p>
	تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها.
</p>

<p>
	عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">source</span> my_env<span class="hljs-regexp">/bin/</span>activate
</pre>

<p>
	يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها <code>my_env</code>:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@locahost</span><span class="hljs-symbol">:~/environments</span>$
</pre>

<p>
	ستسمح لك السابقة بمعرفة أنَّ البيئة <code>my_env</code> مفعلة حاليًا، وهذا يعني أننا سنستخدم إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك داخل البيئة الافتراضية أن تستخدم الأمر <code>python</code> بدلًا من <code>python3.6</code> والأمر <code>pip</code> بدلًا من <code>pip3.6</code> إن شئتَ. أما إذا كنتَ تستخدم بايثون 3 خارج البيئة الافتراضية، فيجب عليك حينها استخدام <code>python3.6</code> و <code>pip3.6</code> حصرًا.
</p>

<p>
	يجب أن تكون بيئتك الافتراضية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة.
</p>

<h2 id="-">
	الخطوة الرابعة: إنشاء برنامج بسيط
</h2>

<p>
	بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «مرحبا بالعالم!»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة.
</p>

<p>
	علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر vim:
</p>

<pre class="ipsCode" id="ips_uid_6177_10">
(my_env) sammy@localhost:~/environments$ vim hello.py
</pre>

<p>
	بعد فتح الملف في نافذة الطرفية، اكتب الحرف <code>i</code> للدخول إلى وضع الإدراج (insert mode)، بعدها يمكننا كتابة البرنامج:
</p>

<pre class="ipsCode">
<span class="hljs-function"><span class="hljs-title">print</span><span class="hljs-params">(<span class="hljs-string">"مرحبا بالعالم!"</span>)</span></span>
</pre>

<p>
	الآن اضغط على الزر <code>ESC</code> للخروج من وضع الإدراج. بعد ذلك ، اكتب wq: ثم <code>ENTER</code> لحفظ الملف وإغلاقه.
</p>

<p>
	نحن جاهزون الآن لتنفيذ البرنامج:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@localhost</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>python hello.py
</pre>

<p>
	سيؤدي برنامج <code>hello.py</code> الذي أنشأتَه إلى طباعة الناتج التالي في الطرفية:
</p>

<pre class="ipsCode">
مرحبا بالعالم!
</pre>

<p>
	للخروج من البيئة، اكتب الأمر <code>deactivate</code> وستعود إلى مجلدك الأصلي.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في CentOS 7، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-centos-7" rel="external nofollow">How To Install Python 3 and Set Up a Local Programming Environment on CentOS 7‎</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">711</guid><pubDate>Mon, 15 Jul 2019 13:04:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x62A;&#x647; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x639;&#x644;&#x649; &#x648;&#x64A;&#x646;&#x62F;&#x648;&#x632; 10</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-10-r710/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2484cce3bd1_.jpg.d2df2a71548ab0db30f99ed21bcee1ad.jpg" /></p>

<p>
	بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development).
</p>

<p>
	ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون.
</p>

<p>
	سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 في ويندوز 10، وتثبيت بيئة برمجة عبر <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">سطر الأوامر</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30659" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d2484cf2ce23_.jpg.bdcdd85cbd2fb9e42d0aac8cfdc5ca42.jpg" rel=""><img alt="تثبيت بايثون على ويندوز.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30659" data-unique="w7q6wx6ia" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d2484cf433b6_.thumb.jpg.602e72e16e435f3b7b427eeee0f1bd8b.jpg"></a>
</p>

<h2 id="-">
	المتطلبات المسبقة
</h2>

<p>
	لمتابعة هذه المقالة، يجب أن تملك جهازًا عليه نظام ويندوز 10 متصل بالشبكة مع صلاحيات مدير (administrative access).
</p>

<h2 id="-powershell">
	الخطوة الأولى: فتح وإعداد PowerShell
</h2>

<p>
	سنجري معظم أطوار التثبيت والإعدادات عبر سطر الأوامر، والذي هو طريقةٌ غيرُ رسوميةٍ للتعامل مع الحاسوب، فبدلًا من الضغط على الأزرار، ستكتب نصًّا وتعطيه للحاسوب لينفذه، وسيُظهِر لك ناتجًا نصيًا أيضًا. يمكن أن يساعدك سطر الأوامر على تعديل أو أتمتة مختلف المهام التي تنجزها على الحاسوب يوميًا، وهو أداةٌ أساسيةٌ لمطوري البرمجيات.
</p>

<p>
	PowerShell هي برنامج من ميكروسوفت يوفر واجهة سطر الأوامر. يمكن إجراء المهام الإدارية عبر تنفيذ الأصناف <strong>cmdlets</strong>، والتي تُنطَق "command-lets"، وهي أصناف متخصصة من الإطار ‎.NET يمكنها تنفيذ العمليات. جُعِلت PowerShell مفتوحة المصدر منذ أغسطس 2016، وصارت متوفرة الآن عبر ويندوز و أنظمة يونكس (بما في ذلك ماك ولينكس).
</p>

<p>
	ستعثر على PowerShell بالنقر الأيمن على أيقونة Start في الركن الأيسر السفلي من الشاشة. عندما تنبثق القائمة، انقر على "Search"، ثم اكتب "PowerShell" في شريط البحث. عند تقديم خيارات لك، انقر بالزر الأيمن على تطبيق سطح المكتب "Windows PowerShell". اختر "Run as Administrator". عندما يظهر مربع حوار يسألك "Do you want to allow this app to make changes to your PC?"، انقر على "Yes".
</p>

<p>
	بمجرد إتمام ذلك، سترى واجهة نصية تبدو كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30660" href="https://academy.hsoub.com/uploads/monthly_2019_07/Win10SetUp.png.fb4658763cfda89ce3202994a1ab07a7.png" rel=""><img alt="Win10SetUp.png" class="ipsImage ipsImage_thumbnailed" data-fileid="30660" data-unique="nn7pqmuzy" src="https://academy.hsoub.com/uploads/monthly_2019_07/Win10SetUp.thumb.png.5fda593383c7753b94320c92e49c2c0c.png"></a>
</p>

<p>
	يمكننا تبديل مجلد النظام عن طريق كتابة الأمر التالي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">cd</span> ~
</pre>

<p>
	بعد ذلك سننتقل إلى المجلد <code>PS C:\Users\Sammy</code>.
</p>

<p>
	لمتابعة عملية التثبيت، سنعدّ بعض الأذونات من خلال PowerShell. تم إعداد PowerShell لتعمل في الوضع الأكثر أمانًا بشكل افتراضي، هناك عدة مستويات للأذونات، والتي يمكنك إعدادها باعتبارك مديرًا (administrator):
</p>

<ul>
<li>
		<p>
			<strong>Restricted</strong>: تمثل سياسة التنفيذ الافتراضية، وبموجب هذا الوضع، لن تتمكن من تنفيذ السكربتات، وستعمل PowerShell كصدفة تفاعلية (interactive shell) وحسب.
		</p>
	</li>
	<li>
		<p>
			<strong>AllSigned</strong>: ستمكّنك من تنفيذ جميع السكربتات وملفات الإعداد المُوقّعة من قبل جهة موثوقة، مما يعني أنه من المحتمل أن تعرّض جهازك لخطر تنفيذ سكربتات ضارة إن كانت موقعة من قبل جهة موثوقة.
		</p>
	</li>
	<li>
		<strong>RemoteSigned</strong>: ستمكّنك من تنفيذ السكربتات وملفات الإعداد المُنزّلة من الشبكة، والمُوقعة من قبل جهة موثوقة، مما يعني أنه من المحتمل أن تعرّض جهازك لخطر تنفيذ سكربتات ضارة إن كانت تلك السكربتات الموثوقة ضارة.
	</li>
	<li>
		<strong>Unrestricted</strong>: تسمح بتنفيذ جميع السكربتات وملفات الإعداد المُنزّلة من الشبكة بمجرد أن تؤكد أنك تدرك أنّ الملف مُنزّل من الشبكة. في هذه الحالة، التوقيعات الرقمية غير لازمة، مما يعني أنه من المحتمل أن تعرّض جهازك لخطر تنفيذ سكربتات غير موثوقة منزلة من الشبكة قد تكون ضارة.
	</li>
</ul>
<p>
	سنستخدم سياسة التنفيذ RemoteSigned لتعيين الإذن للمستخدم الحالي، وهكذا سنسمح لبرنامج PowerShell بقبول السكربتات المُنزّلة التي نثق بها، ودون خفض كل دفاعاتنا وجعل الأذونات هشة كما هو الحال مع سياسة التنفيذ Unrestricted. سنكتب في PowerShell:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">Set</span>-ExecutionPolicy -<span class="hljs-keyword">Scope</span> CurrentUser
</pre>

<p>
	ستطالبك PowerShell بتحديد سياسة التنفيذ، وبما أننا نريد استخدام RemoteSigned، فسنكتب:
</p>

<pre class="ipsCode">
<span class="hljs-comment">RemoteSigned</span>
</pre>

<p>
	بمجرد الضغط على الزر <code>enter</code>، ستُسأل عما إن كنت نريد تغيير سياسة التنفيذ. اكتب الحرف <code>y</code> لاختيار "نعم"، واعتماد التغييرات. يمكننا التحقق من نجاح العملية عن طريق طلب الأذونات الحالية في الجهاز عبر كتابة:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">Get</span>-ExecutionPolicy -<span class="hljs-keyword">List</span>
</pre>

<p>
	ستحصل على مخرجات مشابهة لما يلي:
</p>

<pre class="ipsCode">
       Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       <span class="hljs-keyword">Undefined</span>
   UserPolicy       <span class="hljs-keyword">Undefined</span>
      Process       <span class="hljs-keyword">Undefined</span>
  CurrentUser    RemoteSigned
 LocalMachine       <span class="hljs-keyword">Undefined</span>
</pre>

<p>
	هذا يؤكد أنّ المستخدم الحالي يمكنه تنفيذ السكربتات الموثوقة التي تم تنزيلها من الشبكة. يمكننا الآن تنزيل الملفات التي سنحتاج إليها لإعداد بيئة برمجة بايثون.
</p>

<h2 id="-chocolatey">
	الخطوة الثانية: تثبيت Chocolatey
</h2>

<p>
	<strong>مدير الحزم</strong> (package manager) هو مجموعة من أدوات البرمجيات التي تعمل على أتمتة عمليات التثبيت، بما في ذلك التثبيت الأولي للبرامج، وترقيتها، وإعدادها، وإزالتها عند الحاجة. تحفظ هذه الأدوات التثبيتات في موقع مركزي، ويمكنها صيانة جميع حزم البرامج على النظام وفق تنسيقات (formats) معروفة.
</p>

<p>
	Chocolatey هي مدير حزم تعمل من سطر الأوامر، تم تصميمها لنظام ويندوز، وتحاكي <code>apt-get</code> الخاصة بلينكس. متوفرة كإصدار مفتوح المصدر، ويمكنها مساعدتك Chocolatey على تثبيت التطبيقات والأدوات بسرعة. سنستخدمها لتنزيل ما نحتاج إليه لبيئتنا التطويرية.
</p>

<p>
	قبل تثبيت السكربت، دعنا نقرأه للتأكد من أنّ التغييرات التي سيجريها على الجهاز مقبولة. سنستخدم إطار العمل ‎.NET لتنزيل وعرض السكربت Chocolatey في نافذة الطرفية. سننشئ كائنًا WebClient يُسمى ‎<code>$script</code>‎‎ (يمكنك تسميته كما تريد طالما ستستخدم المحرف <code>$</code> في البداية)، والذي يشارك إعدادات الاتصال بالشبكة مع المتصفح Internet Explorer:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">$script</span> = <span class="hljs-keyword">New</span>-Object Net.WebClient
</pre>

<p>
	دعنا نلقي نظرة على الخيارات المتاحة لنا من خلال توصيل الكائن إلى الصنف <code>Get-Member</code> لإعادة جميع الأعضاء (الخاصيات والتوابع) الخاصة بكائن WebClient:
</p>

<pre class="ipsCode">
<span class="hljs-meta"><span class="hljs-meta-keyword">$script</span> | Get-Member</span>
</pre>

<p>
	سنحصل على المخرجات التالية:
</p>

<pre class="ipsCode">
. . .
DownloadFileAsync         <span class="hljs-function"><span class="hljs-keyword">Method</span>     <span class="hljs-title">void</span> <span class="hljs-title">DownloadFileAsync</span><span class="hljs-params">(uri address, string fileName)</span>, <span class="hljs-title">void</span> <span class="hljs-title">DownloadFileAsync</span><span class="hljs-params">(ur...
DownloadFileTaskAsync     <span class="hljs-keyword">Method</span>     System.Threading.Tasks.Task DownloadFileTaskAsync(string address, string fileNa...
DownloadString            <span class="hljs-keyword">Method</span>     string DownloadString(string address)</span>, <span class="hljs-title">string</span> <span class="hljs-title">DownloadString</span><span class="hljs-params">(uri address)</span> # التابع الذي سنستخدمه
<span class="hljs-title">DownloadStringAsync</span>       <span class="hljs-title">Method</span>     <span class="hljs-title">void</span> <span class="hljs-title">DownloadStringAsync</span><span class="hljs-params">(uri address)</span>, <span class="hljs-title">void</span> <span class="hljs-title">DownloadStringAsync</span><span class="hljs-params">(uri address, Sy...
DownloadStringTaskAsync   <span class="hljs-keyword">Method</span>     System.Threading.Tasks.Task[string] DownloadStringTaskAsync(string address)</span>, <span class="hljs-title">Sy</span>…
 . . .</span>
</pre>

<p>
	عند النظر إلى المخرجات، يمكننا تحديد التابع <code>DownloadString</code> الذي يمكننا استخدامه لعرض محتوى السكربت والتوقيع في نافذة PowerShell كما يلي:
</p>

<pre class="ipsCode">
$<span class="hljs-keyword">script</span>.DownloadString(<span class="hljs-string">"https://chocolatey.org/install.ps1"</span>)
</pre>

<p>
	بعد مطالعة السكربت، يمكننا تثبيت Chocolatey عن طريق كتابة ما يلي في PowerShell:
</p>

<pre class="ipsCode">
iwr <span class="hljs-string">https:</span><span class="hljs-comment">//chocolatey.org/install.ps1 -UseBasicParsing | iex</span>
</pre>

<p>
	تسمح لنا <code>iwr</code> أو <code>Invoke-WebRequest</code> التي تخص <code>cmdlet</code> باستخراج البيانات من الشبكة. سيؤدي هذا إلى تمرير السكربت إلى <code>iex</code> أو <code>Invoke-Expression</code>، والذي سينفذ محتويات السكربت، وتنفيذ سكربت التثبيت لمدير الحزم Chocolatey.
</p>

<p>
	اسمح لبرنامج PowerShell بتثبيت Chocolatey. بمجرد تثبيته بالكامل، يمكننا البدء في تثبيت أدوات إضافية باستخدام الأمر <code>choco</code>.
</p>

<p>
	إن احتجت إلى ترقية Chocolatey مستقبلًا، يمكنك تنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">choco upgrade chocolatey</span>
</pre>

<p>
	بعد تثبيت مدير الحزم، يمكننا متابعة تثبيت ما نحتاجه لبيئة البرمجة خاصتنا.
</p>

<h2 id="-nano-">
	المرحلة الثالثة: تثبيت محرر النصوص nano (اختياري)
</h2>

<p>
	سنثبّت الآن nano، وهو محرر نصوص يستخدم واجهة سطر الأوامر، والذي يمكننا استخدامه لكتابة البرامج مباشرة داخل PowerShell. هذه ليست خطوة إلزامية، إذ يمكنك بدلاً من ذلك استخدام محرر نصوص بواجهة مستخدم رسومية مثل Notepad، لكن ميزة nano أنه سيُعوِّدك على استخدام PowerShell.
</p>

<p>
	دعنا نستخدم Chocolatey لتثبيت nano:
</p>

<pre class="ipsCode">
choco <span class="hljs-keyword">install</span> -y nano
</pre>

<p>
	الخيار <code>‎-y</code> يعني أنَّك توافق على تنفيذ السكربت تلقائيًا دون الحاجة إلى تأكيد.
</p>

<p>
	بعد تثبيت nano، سنكون قادرين على استخدام الأمر <code>nano</code> لإنشاء ملفات نصية جديدة، وسنستخدمه بعد حين لكتابة أول برامجنا في بايثون.
</p>

<h2 id="-3">
	المرحلة الرابعة: تثبيت بايثون 3
</h2>

<p>
	مثلما فعلنا مع nano أعلاه، سنستخدم Chocolatey لتثبيت بايثون 3:
</p>

<pre class="ipsCode">
choco <span class="hljs-keyword">install</span> -y python3
</pre>

<p>
	ستثبّت PowerShell الآن بايثون 3، مع عرض بعض المخرجات أثناء العملية. بعد اكتمال العملية، سترى المخرجات التالية:
</p>

<pre class="ipsCode">
Environment Vars (like PATH) have changed. Close/reopen your <span class="hljs-keyword">shell</span> <span class="hljs-keyword">to</span>
 See the <span class="hljs-keyword">changes</span> (<span class="hljs-built_in">or</span> in powershell/cmd.<span class="hljs-keyword">exe</span> just <span class="hljs-built_in">type</span> <span class="hljs-string">'refreshenv'</span>).
The install of <span class="hljs-keyword">python3</span> was successful.
 Software installed <span class="hljs-keyword">as</span> <span class="hljs-string">'EXE'</span>, install location <span class="hljs-keyword">is</span> likely default.

Chocolatey installed <span class="hljs-number">1</span>/<span class="hljs-number">1</span> packages. <span class="hljs-number">0</span> packages failed.
 See the <span class="hljs-built_in">log</span> <span class="hljs-keyword">for</span> details (C:\ProgramData\chocolatey\logs\chocolatey.<span class="hljs-built_in">log</span>).
</pre>

<p>
	بعد الانتهاء من التثبيت، ستحتاج إلى التحقق من أنّ بايثون مثبّتة وجاهزة للعمل. لرؤية التغييرات، استخدم الأمر <code>refreshenv</code> أو أغلق PowerShell ثم أعد فتحها بصلاحيات مدير النظام، ثم تحقق من إصدار بايثون على جهازك:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">python -V</span>
</pre>

<p>
	ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت.
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">Python</span> 3<span class="hljs-selector-class">.7</span><span class="hljs-selector-class">.0</span>
</pre>

<p>
	سيتم تثبيت، إلى جانب بايثون، الأداة <a href="https://academy.hsoub.com/questions/5121-%D9%83%D9%8A%D9%81-%D8%A3%D9%82%D9%88%D9%85-%D8%A8%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AD%D8%B2%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-pip%D8%9F/#comment-10868" rel="">pip</a>، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">كيفية استيراد الوحدات في بايثون 3</a> من هذه السلسلة.
</p>

<p>
	سنحدّث pip عبر الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6900_8" style="">
<span class="pln">python </span><span class="pun">-</span><span class="pln">m pip install </span><span class="pun">--</span><span class="pln">upgrade pip</span></pre>

<p>
	يمكننا استدعاء بايثون من Chocolatey عبر الأمر <code>python</code>. سنستخدم الراية <code>‎-m</code> لتنفيذ الوحدة كأنها سكربت، وإنهاء قائمة الخيارات، ومن ثمّ نستخدم <code>pip</code> لتثبيت الإصدار الأحدث.
</p>

<p>
	بعد تثبيت بايثون وتحديث <code>pip</code>، فنحن جاهزون لإعداد بيئة افتراضية لمشاريع التطوير خاصتنا.
</p>

<h2 id="-">
	الخطوة الخامسة: إعداد بيئة افتراضية
</h2>

<p>
	الآن بعد تثبيت Chocolatey و nano وبايثون، يمكننا المضي قدمًا لإنشاء بيئة البرمجة خاصتنا عبر الوحدة <code>venv</code>.
</p>

<p>
	تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع.
</p>

<p>
	يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
</p>

<p>
	يمكنك ضبط أيّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في حاسوبك يحتوي على عدد من السكربتات.
</p>

<p>
	اختر المجلد الذي تريد أن تضع فيه بيئات بايثون، أو يمكنك إنشاء مجلد جديد باستخدام الأمر <code>mkdir</code> كما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">mkdir</span> environments
<span class="hljs-built_in">cd</span> environments
</pre>

<p>
	بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">python</span> -m venv my_env
</pre>

<p>
	باستخدام الأمر <code>python</code>، سننفّذ الوحدة <code>venv</code> لإنشاء البيئة الافتراضية التي أطلقنا عليها في هذه الحالة <code>my_env</code>.
</p>

<p>
	ستنشئ <code>venv</code> مجلدًا جديدًا يحتوي على بعض العناصر التي يمكن عرضها باستخدام الأمر <code>ls</code>:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">ls</span> my_env
</pre>

<p>
	سنحصل على المخرجات التالية:
</p>

<pre class="ipsCode">
<span class="hljs-comment">Mode</span>                <span class="hljs-comment">LastWriteTime</span>         <span class="hljs-comment">Length</span> <span class="hljs-comment">Name</span>
<span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>                <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>         <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span> <span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>
<span class="hljs-comment">d</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>        <span class="hljs-comment">8/22/2016</span>   <span class="hljs-comment">2:20</span> <span class="hljs-comment">PM</span>                <span class="hljs-comment">Include</span>
<span class="hljs-comment">d</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>        <span class="hljs-comment">8/22/2016</span>   <span class="hljs-comment">2:20</span> <span class="hljs-comment">PM</span>                <span class="hljs-comment">Lib</span>
<span class="hljs-comment">d</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>        <span class="hljs-comment">8/22/2016</span>   <span class="hljs-comment">2:20</span> <span class="hljs-comment">PM</span>                <span class="hljs-comment">Scripts</span>
<span class="hljs-literal">-</span><span class="hljs-comment">a</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span><span class="hljs-literal">-</span>        <span class="hljs-comment">8/22/2016</span>   <span class="hljs-comment">2:20</span> <span class="hljs-comment">PM</span>            <span class="hljs-comment">107</span> <span class="hljs-comment">pyvenv</span><span class="hljs-string">.</span><span class="hljs-comment">cfg</span>
</pre>

<p>
	تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها.
</p>

<p>
	عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل في المجلد <code>Scripts</code>:
</p>

<pre class="ipsCode">
my_env<span class="hljs-symbol">\S</span>cripts<span class="hljs-symbol">\a</span>ctivate
</pre>

<p>
	يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها <code>my_env</code>.
</p>

<pre class="ipsCode">
(my_env) PS C:<span class="hljs-symbol">\U</span>sers<span class="hljs-symbol">\S</span>ammy<span class="hljs-symbol">\E</span>nvironments&gt;
</pre>

<p>
	تتيح لنا هذه البادئة معرفة أنّ البيئة <code>my_env</code> مفعّلة حاليًا، وهذا يعني أننا لن سنستخدم إلا إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة.
</p>

<h2 id="-">
	الخطوة الثالثة: إنشاء برنامج بسيط
</h2>

<p>
	بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «مرحبا بالعالم!»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة.
</p>

<p>
	علينا أولًا تشغيل المحرر nano وإنشاء ملف جديد:
</p>

<pre class="ipsCode">
(my_env) PS C:<span class="hljs-symbol">\U</span>sers<span class="hljs-symbol">\S</span>ammy&gt; nano hello.py
</pre>

<p>
	بعد فتح الملف في نافذة الطرفية، سنكتب البرنامج الخاص بنا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_6900_10" style="">
<span class="kwd">print</span><span class="pun">(</span><span class="str">"مرحبا بالعالم!"</span><span class="pun">)</span></pre>

<p>
	أغلق محرر nano بالضغط على <code>Ctrl+x</code> ثم اضغط على <code>y</code> عندما يسألك عن حفظ الملف.
</p>

<p>
	بعد أن يُغلَق المحرر nano وتعود إلى سطر الأوامر، حاول تنفيذ البرنامج:
</p>

<pre class="ipsCode">
(my_env) PS C:<span class="hljs-symbol">\U</span>sers<span class="hljs-symbol">\S</span>ammy&gt; python hello.py
</pre>

<p>
	سيؤدي برنامج <code>hello.py</code> الذي أنشأتَه إلى طباعة الناتج التالي في الطرفية:
</p>

<pre class="ipsCode">
مرحبا بالعالم!
</pre>

<p>
	للخروج من البيئة، اكتب الأمر <code>deactivate</code> وستعود إلى مجلدك الأصلي.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في نظام ويندوز 10، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-windows-10" rel="external nofollow">How To Install Python 3 and Set Up a Local Programming Environment on windows 10</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">710</guid><pubDate>Sun, 14 Jul 2019 18:09:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x62A;&#x647; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%AA%D9%87-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r709/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d247a0a69a55_.jpg.b28bd9ee21112980ca735c9e5c528805.jpg" /></p>

<p>
	بايثون هي لغةٌ سهلة القراءة ومتنوعة ومتعددة الاستخدامات، وغالبًا ما تُستخدم في كتابة السكربتات (scripting) والأتمتة وتحليل البيانات وتعلم الآلة (machine learning) والتطوير الخلفي (back-end development).
</p>

<p>
	ظهرت بايثون سنة 1991، واستوحي اسمها من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وبسيطة الإعداد، وجعل طريقة كتابتها مباشرة، مع توفير تقرير مباشر عند حدوث أخطاء. وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعدُّ مستقبل بايثون.
</p>

<p>
	سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 على خادم أوبنتو 18.04، البرمجة على الخوادم لها العديد من الميزات، كما تدعم المشاريع التعاونية.
</p>

<p>
	صحيحٌ أنَّ هذا الدرس يشرح عملية التثبيت على خادم أوبنتو 18.04، إلا أنَّ المفاهيم الأساسية فيه تنطبق على جميع توزيعات دبيان لينيكس (Debian Linux).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30658" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d247a0d315c3_.jpg.afaca32aee72f4ae980c3e29c23f9f4c.jpg" rel=""><img alt="تثبيت بايثون على أوبنتو.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30658" data-unique="jllpzeron" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d247a0d4935f_.thumb.jpg.c893651f66d082f958bdd0fe22019ed1.jpg"></a>
</p>

<h2 id="-">
	المتطلبات المسبقة
</h2>

<p>
	لمتابعة هذه المقالة، يجب أن تملك صلاحيات مستخدم غير جذري (non-root user ) مع امتيازات <code>sudo</code> على خادم أوبنتو 18.04. إذا لم تكن لك خبرة في التعامل مع بيئة النافذة الطرفية، فيمكنك مطالعة المقالة "<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>".
</p>

<h2 id="-3">
	الخطوة الأولى: إعداد بايثون 3
</h2>

<p>
	في أوبنتو 18.04 والإصدارات الأخرى من دبيان لينكس، ستجد كلًا من بايثون 3 وبايثون 2 مثبتين مسبقًا. للتأكد من أنّ إصدارات بايثون حديثة، سنحدّث النظام ونرقّيه باستخدام الأمر <code>apt</code> للعمل مع أداة التحزيم المتقدمة من أوبنتو (Ubuntu’s Advanced Packaging Tool):
</p>

<pre class="ipsCode">
sudo apt <span class="hljs-keyword">update</span>
sudo apt -y <span class="hljs-keyword">upgrade</span>
</pre>

<p>
	الخيار <code>‎-y</code> يعني أنَّك توافق على تثبيت جميع الحزم القابلة للتحديث، لكن قد تحتاج إلى تأكيد ذلك عند تحديث النظام وذلك اعتمادًا على الحزم التي ستُحدَّث، ونسخة نظامك.
</p>

<p>
	بعد إكمال العملية، يمكننا التحقق من إصدار بايثون 3 المُثبّت في النظام بكتابة:
</p>

<pre class="ipsCode">
pytho<span class="hljs-symbol">n3</span> -V
</pre>

<p>
	ستحصل على مخرجات في نافذة الطرفية والتي ستريك إصدار بايثون المثبّت. قد يختلف الرقم بناءً على النسخة المثبتة في توزيعتك، لكن يجب أن يكون شبيهًا بما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">Python</span> 3<span class="hljs-selector-class">.5</span><span class="hljs-selector-class">.2</span>
</pre>

<p>
	لإدارة الحزم البرمجية الخاصة ببايثون، سنثبّت <a href="https://academy.hsoub.com/questions/5121-%D9%83%D9%8A%D9%81-%D8%A3%D9%82%D9%88%D9%85-%D8%A8%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AD%D8%B2%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-pip%D8%9F/#comment-10868" rel="">pip</a>، وهي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تعلم المزيد عن الوحدات والحزم التي يمكنك تثبيتها بالأداة pip بقراءة المقالة <a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">كيفية استيراد الوحدات في بايثون 3</a> من هذه السلسلة:
</p>

<pre class="ipsCode">
sudo apt <span class="hljs-keyword">install</span> -y python3-pip
</pre>

<p>
	يمكن تثبيت حزم بايثون بكتابة ما يلي:
</p>

<pre class="ipsCode">
pip<span class="hljs-number">3</span> install <span class="hljs-keyword">package</span><span class="hljs-number">_n</span>ame
</pre>

<p>
	حيث عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان <code>package_name</code> مثل Django لتطوير الويب، أو NumPy لإجراء الحسابات العلمية. لذا، إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر <code>pip3 install numpy</code>.
</p>

<p>
	هناك عدة حزم وأدوات تطوير أخرى يجب تثبيتها للتأكد من أنّ بيئة البرمجة جاهزة:
</p>

<pre class="ipsCode">
sudo apt install build-essential libssl-<span class="hljs-built_in">dev</span> libffi-<span class="hljs-built_in">dev</span> python3-<span class="hljs-built_in">dev</span>
</pre>

<p>
	بعد أن انتهينا من ضبط بايثون وتثبيت pip، يمكننا الآن إنشاء «بيئة افتراضية» (virtual environment) لمشاريعنا.
</p>

<h2 id="-">
	الخطوة الثانية: إعداد بيئة افتراضية
</h2>

<p>
	تُمكِّنك البيئات الافتراضية من إنشاء مساحة معزولة في خادمك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه ستكون له اعتماديّاته (dependencies) الخاصة به، والتي لن تؤثِّر على غيره من المشاريع.
</p>

<p>
	يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون، وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.
</p>

<p>
	يمكنك ضبط أيُّ عددٍ تشاء من البيئات الافتراضية، وكل بيئة ستكون ممثلة بمجلد في خادمك يحتوي على عدد من السكربتات.
</p>

<p>
	هناك عدة طرق لإعداد بيئة برمجية في بايثون، لكننا سنستخدم وحدة (module) برمجية باسم <strong>venv</strong>، وهي جزءٌ من مكتبة بايثون 3 القياسية. سنثبّت venv على نظامنا بكتابة:
</p>

<pre class="ipsCode">
sudo apt-<span class="hljs-built_in">get</span> install -<span class="hljs-keyword">y</span> <span class="hljs-keyword">python3</span>-venv
</pre>

<p>
	بعد إتمام التثبيت، فنحن جاهزون لإنشاء البيئات الافتراضية، يمكننا الآن إما اختيار مجلد نضع فيه بيئات بايثون، أو إنشاء مجلد جديد باستخدام الأمر <code>mkdir</code> كما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-built_in">mkdir</span> environments
<span class="hljs-built_in">cd</span> environments
</pre>

<p>
	بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، تستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode">
<span class="hljs-selector-tag">python3</span><span class="hljs-selector-class">.6</span> <span class="hljs-selector-tag">-m</span> <span class="hljs-selector-tag">venv</span> <span class="hljs-selector-tag">my_env</span>
</pre>

<p>
	سيُنشِئ الأمر <code>pyvenv</code> مجلدًا جديدًا فيه بعض الملفات التي يمكن عرضها باستخدام الأمر <code>ls</code>:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">ls</span> my_env
</pre>

<p>
	ستظهر لك مخرجات شبيهة بالمخرجات التالية:
</p>

<pre class="ipsCode">
bin <span class="hljs-keyword">include</span> <span class="hljs-class"><span class="hljs-keyword">lib</span> <span class="hljs-title">lib64</span> <span class="hljs-title">pyvenv</span>.<span class="hljs-title">cfg</span> <span class="hljs-title">share</span></span>
</pre>

<p>
	تعمل هذه الملفات مع بعضها لضمان أنَ تكون مشاريعك معزولةٌ عن سياق الآلة المحلية، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى الحزمٍ التي يحتاجها. تتوافر أيضًا Python Wheels، والتي هي صيغة حزمٍ مبنية (built-package format) لبايثون، والتي يمكن أن تُسرِّع من تطوير البرامج بتقليل عدد المرات التي تحتاج فيها إلى تصريف (compile) المشروع، وهي موجودةٌ في المجلد <code>share</code> في توزيعة أوبنتو 18.04.
</p>

<p>
	عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر التالي الذي سيُنفِّذ سكربت التفعيل:
</p>

<pre class="ipsCode">
<span class="hljs-keyword">source</span> my_env<span class="hljs-regexp">/bin/</span>activate
</pre>

<p>
	يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها <code>my_env</code>، وقد يكون مظهر المِحَث مختلفًا في توزيعة دبيان، وذلك اعتمادًا على الإصدار المستخدم؛ لكن يجب أن تشاهد اسم البيئة بين قوسين في بداية السطر:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@ubuntu</span><span class="hljs-symbol">:~/environments</span>$
</pre>

<p>
	ستسمح لك السابقة بمعرفة أنَّ البيئة <code>my_env</code> مفعلة حاليًا، وهذا يعني أننا سنستخدم إعدادات وحزم هذه البيئة عند إنشاء مشاريع جديدة.
</p>

<p>
	<strong>ملاحظة</strong>: يمكنك داخل البيئة الافتراضية أن تستخدم الأمر <code>python</code> بدلًا من <code>python3</code> والأمر <code>pip</code> بدلًا من <code>pip3</code> إن شئتَ. أما إذا كنتَ تستخدم بايثون 3 خارج البيئة الافتراضية، فيجب عليك حينها استخدام <code>python3</code> و <code>pip3</code> حصرًا.
</p>

<p>
	يجب أن تكون بيئتك الافتراضية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة.
</p>

<h2 id="-">
	الخطوة الثالثة: إنشاء برنامج بسيط
</h2>

<p>
	بعد أن أكملنا ضبط بيئتنا الافتراضية، لننشِئ برنامجًا بسيطًا يعرض العبارة «Hello World!‎»، وبهذا سنتحقق من أنَّ البيئة تعمل بالشكل الصحيح، ولكي تتعوّد على إنشاء برامج بايثون إن كنتَ وافدًا جديدًا على اللغة.
</p>

<p>
	علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر nano الذي يعمل من سطر الأوامر:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@ubuntu</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>nano hello.py
</pre>

<p>
	بعد فتح الملف في نافذة الطرفية، سنكتب البرنامج الخاص بنا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1586_8" style="">
<span class="kwd">print</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">)</span></pre>

<p>
	أغلق محرر nano بالضغط على <code>Ctrl+x</code> ثم اضغط على <code>y</code> عندما يسألك عن حفظ الملف.
</p>

<p>
	بعد أن يُغلَق المحرر nano وتعود إلى سطر الأوامر، حاول تنفيذ البرنامج:
</p>

<pre class="ipsCode">
(my_env) sammy<span class="hljs-variable">@ubuntu</span><span class="hljs-symbol">:~/environments</span><span class="hljs-variable">$ </span>python hello.py
</pre>

<p>
	سيؤدي برنامج <code>hello.py</code> الذي أنشأتَه إلى طباعة الناتج الآتي في الطرفية:
</p>

<pre class="ipsCode">
Hello, World!
</pre>

<p>
	للخروج من البيئة، اكتب الأمر <code>deactivate</code> وستعود إلى مجلدك الأصلي.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تهانينا! لقد ضبطتَ الآن بيئة تطويرٍ للغة بايثون 3 في خادم لينيكس ديبيان، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-programming-environment-on-an-ubuntu-18-04-server" rel="external nofollow">How To Install Python 3 and Set Up a Programming Environment on an Ubuntu 18.04 Server</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">709</guid><pubDate>Fri, 12 Jul 2019 08:05:00 +0000</pubDate></item><item><title>&#x627;&#x639;&#x62A;&#x628;&#x627;&#x631;&#x627;&#x62A; &#x639;&#x645;&#x644;&#x64A;&#x629; &#x644;&#x644;&#x627;&#x62E;&#x62A;&#x64A;&#x627;&#x631; &#x645;&#x627; &#x628;&#x64A;&#x646; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 2 &#x648; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d234dc3d17b6_.jpg.e2c8c3571f3ccaf3e5b04c5b49af0a44.jpg" /></p>
<p>
	<a href="https://wiki.hsoub.com/Python" rel="external">Python </a>هي لغةٌ سهلة القراءة للغاية ومتنوعة ومتعددة الاستخدامات، واسمها مستوحى من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وإعدادها بسيطٌ، وطريقة كتابتها مباشرة وتعطيك تقريرًا مباشرًا عند حدوث أخطاء، وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة.<br>
	لغة بايثون هي لغة متعددة الاستعمالات، وتدعم مختلف أنماط البرمجة مثل كتابة السكربتات والبرمجة كائنية التوجه (object-oriented)، وهي مناسبةٌ للأغراض العامة، واستعمالها يتزايد في سوق العمل إذ تعتمدها منظماتٌ مثل «United Space Alliance» (شركة في مجال إرسال مركبات فضائية وتتعاقد معها ناسا) و «Industrial Light &amp; Magic» (أستوديو للتأثيرات السينمائية وللرسوم المتحركة)، وتوفِّر بايثون قدراتٍ كثيرةٍ لمن يريد تعلم لغة برمجة جديدة.<br>
	طوِّرَت اللغة في نهاية الثمانينات من القرن الماضي، ونُشِرَت أوّل مرة في عام 1991، طُوِّرَت بايثون من قِبل Guido van Rossum، وهو عضوٌ نشطٌ للغاية في المجتمع. وتعتبر بايثون على أنَّها بديلٌ عن لغة ABC، وأوّل إصدار منها كان يتضمن التعامل مع الاستثناءات (exception handling) والدوال والأصناف (classes) مع إمكانية الوراثة فيها. وعدما أُنشِئ منتدى محادثة في Usenet باسم comp.lang.python في 1994، فبدأت قاعدة مستخدمي بايثون بالنمو، مما مهّد الطريق لها لتصبح واحدة من أكثر لغات البرمجة شيوعًا وخصوصًا <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA/" rel="">لتطوير البرمجيات</a> مفتوحة المصدر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="30645" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d234dcd05ebe_.jpg.1536434002e2afaae44ff7849f7150f4.jpg" rel=""><img alt="اعتبارات عملية.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30645" data-unique="pkzblzg0a" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d234dcd1c15d_.thumb.jpg.5377197375aca67dac435795d5051978.jpg"></a>
</p>

<h2 id="لمحة-عامة">
	لمحة عامة
</h2>

<p>
	قبل أن ننظر إلى إمكانيات إصدارَي بايثون 2 وبايثون 3 (مع الاختلافات البرمجية الرئيسية بينهما)، فلننظر إلى لمحة تاريخية عن الإصدارات الرئيسية الحديثة من بايثون.
</p>

<h3 id="بايثون-2">
	بايثون 2
</h3>

<p>
	نُشِرَ هذا الإصدار في أواخر عام 2000، وأصبحت بايثون 2 لغة برمجة شاملة مقارنةً بالإصدارات التي تسبقها وذلك بعد تطبيق اقتراح PEP ‏(Python Enhancement Proposal)، وهو مواصفةٌ (specification) تقنيةٌ التي توفِّر معلومات إلى أعضاء مجتمع بايثون أو تصف ميزاتٍ جديدة في اللغة.<br>
	بالإضافة إلى ذلك، تضمنت بايثون 2 ميزاتٍ برمجية جديدة مثل «cycle-detecting garbage collector» لأتمتة عملية إدارة الذاكرة، وزيادة دعم يونيكود لتدعم اللغة جميع المحارف المعيارية …إلخ. وأثناء عملية تطوير بايثون 2 أضيفت ميزات جديدة بما في ذلك توحيد الأنواع والأصناف في بايثون في بنية هيكلية وحيدة (وذلك في إصدار 2.2 من بايثون).
</p>

<h3 id="بايثون-3">
	بايثون 3
</h3>

<p>
	تُعتَبر بايثون 3 هي مستقبل لغة بايثون وهي النسخة قيد التطوير من اللغة، وهذا إصدارٌ رئيسيٌ نُشِر في أواخر عام 2008 لإصلاح بعض المشاكل الجوهرية في تصميم الإصدارات السابقة من اللغة، وكان التركيز أثناء تطوير بايثون 3 هو تحسين الشيفرات التي تبنى عليها اللغة وحذف التكرارات، مما يعني أنَّ هنالك طريقة وحيدة فقط لإنجاز مهمّة معيّنة.<br>
	التعديلات الأساسية التي حدثت في بايثون 3.0 تتضمن تغير العبارة <code>print</code> إلى دالة مُضمَّنة باللغة، وتحسين قسمة الأعداد الصحيحة، وتوفير دعم إضافي ليونيكود.<br>
	في البداية، انتشرت بايثون 3 ببطء نتيجةً لعدم توافقيتها مع بايثون 2، مما يعني أنَّ على المستخدمين اختيار ما هو الإصدار الذي عليهم استخدامه. بالإضافة إلى ذلك، كانت الكثير من المكتبات البرمجية متاحةً فقط لبايثون 2، لكن بعد تقرير فريق تطوير بايثون 3 أنَّه يجب أن التخلي عن دعم بايثون 2، فبدأت عملية تحويل المكتبات إلى بايثون 3. يمكننا معرفة زيادة الاعتماد على بايثون 3 من خلال عدد الحزم البرمجية التي تدعم بايثون 3، والتي هي (في وقت كتابة هذا المقال) 339 من أصل 360 من أشهر الحزم.
</p>

<h3 id="بايثون-27">
	بايثون 2.7
</h3>

<p>
	بعد إصدار بايثون 3.0 في 2008، أُصدِرَت نسخة بايثون 2.7 في تموز 2010 وهي آخر إصدار من سلسلة ‎2.x، الغرض من إصدار بايثون 2.7 هو جعل الطريق ممهدًا أمام مستخدمي بايثون ‎2.x لتحويل برامجهم إلى بايثون 3 بتوفير بعض التوافقية بينهما. وهذه التوافقية تضمنت دعم بعض الوحدات المُحسّنة في 2.7 مثل <code>unittest</code> لأتمتة الاختبارات، و <code>argparse</code> لتفسير خيارات سطر الأوامر، وبعض الفئات في <code>collections</code>.<br>
	ولخصوصية بايثون 2.7 ولكونها جسرًا واصلًا بين الإصدارات القديمة من بايثون 2 وبين بايثون 3.0، فأصبحت خيارًا شائعًا بين المبرمجين بسبب توافقيتها مع الكثير من المكتبات.<br>
	عندما نتحدث اليوم عن بايثون 2، فنحن نشير عادةً إلى إصدار بايثون 2.7 لأنَّه أكثر إصدار مستخدم؛ لكنه يُعتَبَر أنَّه إصدارٌ قديم، وسيتوقف تطويره (التطوير الحالي هو إصلاح العلل فقط) تمامًا في 2020.
</p>

<h2 id="الاختلافات-الأساسية">
	الاختلافات الأساسية
</h2>

<p>
	بغض النظر أنَّ بايثون 2.7 وبايثون 3 تتشاركان في الكثير من الأشياء، لكن لا يجدر بك أن تظن أنَّهما متماثلتان ويمكن تبديل الشيفرات بينهما. وعلى الرغم من أنَّك تستطيع كتابة شيفرات جيدة وبرامج مفيدة في أيّ إصدار منهما، لكن من المهم أن تفهم أنَّ هنالك بعض الاختلافات في بنية الشيفرات وفي طريقة تفسيرها.<br>
	سأعرض هنا بعض الأمثلة، لكن عليك أن تعلم أنَّك ستواجه المزيد من الاختلافات أثناء مسيرة تعلمك لبايثون.
</p>

<h3 id="print">
	print
</h3>

<p>
	في بايثون 2، تُعامَل <code>print</code> كتعبيرٍ برمجيٍ بدلًا من كونها دالة، وهذا كان يثير ارتباكًا لأنَّ الكثير من الأمور داخل بايثون تتطلب تمرير وسائط (arguments) بين قوسين، إذا فتحتَ مُفسِّر بايثون 2 لطباعة «Sammy the Shark is my favorite sea creature»، فستكتب تعبير <code>print</code> الآتي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4028_7" style=""><span class="kwd">print</span><span class="pln"> </span><span class="str">"Sammy the Shark is my favorite sea creature"</span></pre>

<p>
	أما في بايثون 3، فستُعامَل <code>print()‎</code> كدالة، لذا لطباعة السلسلة النصية السابقة، فيمكننا استخدام شكل استدعاء الدوال التقليدي كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4028_7" style=""><code class="hljs erlang"><span class="hljs-function"><span class="hljs-title"><span class="kwd">print</span></span><span class="hljs-params"><span class="pun">(</span><span class="hljs-string"><span class="str">"Sammy the Shark is my favorite sea creature"</span></span><span class="pun">)</span></span></span></code></pre>

<p>
	هذا التعديل جعل من البنية اللغوية في بايثون موحدةً وسهَّلَ من التبديل بين مختلف دوال الطباعة فيها. يجدر بالذكر أنَّ الدالة <code>print()‎</code> متوافقة مع بايثون 2.7، لذا ستعمل شيفرات بايثون التي تستعمل <code>print()‎</code> بشكلٍ صحيحٍ في أيّ الإصدارَين.
</p>

<h3 id="قسمة-الأعداد-الصحيحة">
	قسمة الأعداد الصحيحة
</h3>

<p>
	في بايثون 2، أيُّ عددٍ تكتبه دون فواصل عشرية سيُعامَل على أنَّه من النوع integer، تأتي الإشكالية عندما تحاول قسمة الأعداد الصحيحة على بعضها، فتتوقع في بعض الأحيان حصولك على عددٍ عشري (تسمى أيضًا بالأعداد ذات الفاصلة العائمة <code>float</code>) كما في التعبير الرياضي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4028_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="lit">5</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="lit">2.5</span></span></code></pre>

<p>
	لكن الأعداد الصحيحة في بايثون 2 لن تتحول إلى أعداد عشرية عندما تتطلب العملية التي تُجرى عليها ذلك.<br>
	عندما يكون العددان الموجودان على جانبَي معامل القسمة <code>/</code> عددين صحيحين، فإن بايثون 2 ستجري عملية القسم وستُنتِج عددًا عشريًا إلا أنها ستُعيد العدد الصحيح الأصغر أو المساوي للناتج، وهذا يعني أنَّه لو كتبتَ <code>‎5 / 2</code> فستُعيد بايثون 2.7 العدد الصحيح الأصغر أو المساوي للعدد 2.5، وهو في هذه الحالة <code>2</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4028_7" style=""><code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">

</span><span class="hljs-number"><span class="lit">2</span></span></code></pre>

<p>
	لإعادة عدد عشري، فيجب إضافة فواصل عشرية إلى الأرقام التي ستُجري عليها عملية القسمة كما في <code>‎5.0 / 2.0</code> لكي تحصل على النتيجة المنطقية <code>2.5</code>.<br>
	أما في بايثون 3، فقسمة الأعداد الصحيحة أصبحت كما نتوقع:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4028_7" style=""><code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">

</span><span class="hljs-number"><span class="lit">2.5</span></span></code></pre>

<p>
	يمكنك استخدام <code>‎5.0 / 2.0</code> لإعادة <code>2.5</code>، لكن إن أردتَ تقريب ناتج القسمة فاستخدم المعامل <code>//</code> الموجود في بايثون 3، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4028_7" style=""><code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 2</span></span><span class="pln">
</span><span class="kwd">print</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">

</span><span class="hljs-number"><span class="lit">2</span></span></code></pre>

<p>
	هذا التعديل في بايثون 3 جعل من قسمة الأعداد الصحيحة أمرًا سهلًا، لكن هذه الميزة غير متوافقة مع بايثون 2.7.
</p>

<h3 id="دعم-محارف-يونيكود">
	دعم محارف يونيكود
</h3>

<p>
	عندما تتعامل لغات البرمجة مع السلاسل النصية (strings، والتي هي سلسلةٌ من المحارف)، فهي تفعل ذلك بطرائق مختلفة لكي تتمكن الحواسيب من تحويل الأعداد إلى أحرف ورموز.<br>
	تستعمل بايثون 2 محارف ASCII افتراضيًا، لذا عندما تكتب <code>"Hello, Sammy!‎"</code> فستتعامل بايثون 2 مع السلسلة النصية كمجموعة من محارف ASCII، والتي هي محدودةٌ لحوالي مئتَي محرف، أي أنَّ محارف ASCII هي طريقة غير عملية لترميز المحارف خصوصًا المحارف غير اللاتينية (كالعربية مثلًا).<br>
	لاستخدام ترميز محارف يونيكود (Unicode) الذي يدعم أكثر من 128000 محرف تابع للكثير من اللغات والرموز، فعليك أن تكتب <code>u"Hello, Sammy!‎"‎</code> حيث تُشير السابقة <code>u</code> إلى Unicode.<br>
	تستعمل بايثون 3 محارف يونيكود (Unicode) افتراضيًا، مما يوفِّر عليك بعض الوقت أثناء التطوير، ويمكنك كتابة وعرض عدد أكبر بكثير من المحارف في برنامجك بسهولة. يدعم يونيكود الكثير من المحارف بما في ذلك الوجوه التعبيرية (emojis)، واستعمالها كترميز محارف افتراضي يعني أنَّ الأجهزة المحمولة ستكون مدعومةً في مشاريعك تلقائيًا.<br>
	إذا كنت تحب أنَّ تكون شيفرات بايثون 3 التي تكتبها متوافقةً مع بايثون 2، فأبقِ على حرف <code>u</code> قبل السلاسل النصية.
</p>

<h3 id="استمرار-التطوير">
	استمرار التطوير
</h3>

<p>
	الفارق الرئيسي بين بايثون 3 وبايثون 2 ليس في البنية اللغوية وإنما في أنَّ إصدار بايثون 2.7 سيتوقف دعمه في 2020، وسيستمر تطوير بايثون 3 بميزاتٍ جديدة وإصلاحٍ لمزيدٍ من العلل.<br>
	التطويرات الأخيرة في اللغة تتضمن تخصيصًا أبسط لإنشاء الأصناف، وطريقةً أوضح للتعامل مع المصفوفات…<br>
	الاستمرار بتطوير بايثون 3 يعني أنَّ المطورين يمكن أن يعتمدوا على اللغة، وسيطمئنون أنَّ المشاكل التي قد تحدث فيها ستُحَل في فترةٍ قريبة، ويمكن أن تصبح البرامج أكثر كفاءة بإضافة المزيد من الميزات للغة.
</p>

<h2 id="نقاط-أخرى-يجب-أخذها-بعين-الاعتبار">
	نقاط أخرى يجب أخذها بالحسبان
</h2>

<p>
	عليك أن تضع النقاط الآتية بعين الاعتبار عندما تبدأ مشوارك كمبرمج بلغة بايثون، أو عندما تبدأ بتعلم لغة بايثون بعد تعلمك لغيرها، وهنا ننصحك بتعلمها أكاديميًا باحترافية، من خلال الانضمام إلى <a href="https://academy.hsoub.com/learn/python-application-development/" rel="">دورة تطوير تطبيقات باستخدام لغة بايثون</a> المقدمة من أكاديمية حسوب.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="480" id="ips_uid_2917_16" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="600" data-embed-src="https://www.youtube.com/embed/1niwEWY7CN4"></iframe>
</p>

<p>
	إذا كنتَ تأمل بتعلم اللغة دون أن تفكِّر بمشروعٍ معيّن، فأنصحك بالتفكير بمستقبل بايثون، فسيستمر تطوير ودعم بايثون 3 بينما سيوقف دعم بايثون 2.7 عمّا قريب.<br>
	أما إذا كنتَ تُخطِّط للانضمام لفريق تطوير أحد المشاريع، فعليك أن تنظر ما هو إصدار بايثون المستخدم فيه، وكيف يؤدي اختلاف الإصدار إلى اختلاف طريقة تعاملك مع الشيفرات، وإذا ما كانت المكتبات البرمجية المستعملة في المشروع مدعومةً في مختلف الإصدارات، وما هي تفاصيل المشروع نفسه…<br>
	إذا كنت تُفكّر ببدء أحد المشاريع، فيجدر بك أن تنظر ما هي المكتبات المتوفرة وما هي إصدارات بايثون المدعومة. وكما قلنا سابقًا، الإصدارات الأوليّة من بايثون 3 لها توافقية أقل مع المكتبات المبنية لبايثون 2، لكن الكثير منها قد جرى تحويله إلى بايثون 3، وسيستمر ذلك في السنوات الأربع المقبلة.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	لغة بايثون كبيرة جدًا وموثقة توثيقًا ممتازًا وسهلة التعلم، ومهما كان اختيارك (بايثون 2 أو بايثون 3) فستتمكن من العمل على المشاريع الموجودة حاليًا.<br>
	صحيحٌ أنّ هنالك بعض الاختلافات المحورية، لكن ليس من الصعب الانتقال من بايثون 3 إلى بايثون 2، وستجد عادةً أنَّ بايثون 2.7 قادرة على تشغيل شيفرات بايثون 3، خصوصًا في بدايات تعلمك للغة.<br>
	من المهم أن تبقي ببالك أنَّ تركيز المطورين والمجتمع أصبح منصبًّا على بايثون 3، وسيصبح هذه اللغة رائدةً في المستقبل وستلبي الاحتياجات البرمجية المطلوبة، وأنَّ دعم بايثون 2.7 سيقل مع مرور الزمن إلى أن يزول في 2020.<br>
	ترجمة -وبتصرّف- للمقال Python 2 vs Python 3: Practical Considerations لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%d8%aa%d8%ab%d8%a8%d9%8a%d8%aa-%d8%a8%d8%a7%d9%8a%d8%ab%d9%88%d9%86-3-%d9%88%d8%a5%d8%b9%d8%af%d8%a7%d8%af-%d8%a8%d9%8a%d8%a6%d8%aa%d9%87%d8%a7-%d8%a7%d9%84%d8%a8%d8%b1%d9%85%d8%ac%d9%8a%d8%a9-r714/" rel="">تثبيت بايثون على مختلف أنظمة التشغيل وإعداد بيئتها البرمجية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">مميزات لغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">483</guid><pubDate>Mon, 08 Jul 2019 18:01:00 +0000</pubDate></item><item><title>&#x62B;&#x644;&#x627;&#x62B;&#x629; &#x623;&#x62E;&#x637;&#x627;&#x621; &#x639;&#x644;&#x64A;&#x643; &#x62A;&#x641;&#x627;&#x62F;&#x64A;&#x647;&#x627; &#x639;&#x646;&#x62F; &#x62A;&#x639;&#x644;&#x645; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x628;&#x644;&#x63A;&#x629; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/python/%D8%AB%D9%84%D8%A7%D8%AB%D8%A9-%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%B9%D9%84%D9%8A%D9%83-%D8%AA%D9%81%D8%A7%D8%AF%D9%8A%D9%87%D8%A7-%D8%B9%D9%86%D8%AF-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r543/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/59d932f3d8b46_main(70).png.066770f2cf7eb203e414b244809aa93b.png" /></p>

<p>
	أعلم أنَّه ليس من السهل الاعتراف بالأخطاء التي تقوم بها، لكن الخطأ هو جزءٌ رئيسي من كل عمليات التعليم، بدءًا من التعلم كيفية المشي إلى تعلم لغة برمجة جديدة مثل بايثون.<br>
	هذه قائمة بثلاثة أخطاء التي وقعتُ فيها أثناء تعلمي لبايثون، عرضتها هنا لكي يحاول مبرمجو بايثون الجدد تفاديها وعدم الوقوع فيها، وهذه الأخطاء أدت إلى حدوث مشاكل كبيرة أخذت من وقتي ساعات حتى حللتها.
</p>

<h2 id="الخطأ-الأول-استخدام-أنواع-البيانات-القابلة-للتغير-كوسائط-افتراضية-عند-تعريف-الدالة">
	الخطأ الأول: استخدام أنواع البيانات القابلة للتغير كوسائط افتراضية عند تعريف الدالة
</h2>

<p>
	لنقل أنَّ لديك دالة صغيرة التي تبحث عن روابط في الصفحة الحالية وتستطيع إضافتها إلى قائمة (list) معيّنة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<span class="kwd">def</span><span class="pln"> search_for_links</span><span class="pun">(</span><span class="pln">page</span><span class="pun">,</span><span class="pln"> add_to</span><span class="pun">=[]):</span><span class="pln">
    new_links </span><span class="pun">=</span><span class="pln"> page</span><span class="pun">.</span><span class="pln">search_for_links</span><span class="pun">()</span><span class="pln">
    add_to</span><span class="pun">.</span><span class="pln">extend</span><span class="pun">(</span><span class="pln">new_links</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> add_to</span></pre>

<p>
	لا يبدو أنَّ هنالك أيّ خطأ في الدالة السابقة، وهذا صحيح، فهي تعمل لكن هنالك مشاكل فيها؛ فلو مررنا قائمةً (list) إلى المعامل <code>add_to</code> فستعمل كما يجب، لكن ماذا يحدث لو تركنا القيمة الافتراضية دون تعديل؟<br>
	جرِّب تنفيذ الشيفرة الآتية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">fn</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">var1</span><span class="pun">,</span><span class="pln"> var2</span><span class="pun">=[])</span></span><span class="pun">:</span></span><span class="pln">
    var2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">var1</span><span class="pun">)</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pln"> var2

fn</span><span class="pun">(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">
fn</span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">
fn</span><span class="pun">(</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">)</span></code></pre>

<p>
	ستتوقع رؤية الناتج الآتي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs json"><span class="pun">[</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span><span class="pln">
</span><span class="pun">[</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">]</span><span class="pln">
</span><span class="pun">[</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">]</span></code></pre>

<p>
	لكنك ستُفاجأ بالناتج الآتي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs json"><span class="pun">[</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span><span class="pln">
</span><span class="pun">[</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">]</span><span class="pln">
</span><span class="pun">[</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">]</span></code></pre>

<p>
	لماذا؟! يمكنك أن تستنتج أن القائمة (list) نفسها ستستعمل في كل مرة، فعندما نكتب دالة مثل الدالة السابقة في بايثون فسيتم تهيئة القائمة (list) كجزءٍ من تعريف الدالة، أي أنها لن تُهيّئ كل مرة تُستدعى فيها الدالة، وهذا يعني أنَّ الدالة ستحتفظ بكائن القائمة نفسه مرارًا وتكرارًا، ما لم تُحدِّد قيمةً أخرى له:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs rust"><span class="hljs-function"><span class="hljs-keyword"><span class="pln">fn</span></span><span class="pun">(</span></span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">])</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs json"><span class="pun">[</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span></code></pre>

<p>
	الناتج يماثل ما قد توقعناه.<br>
	الطريقة الصحيحة لفعل ذلك هي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">fn</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">var1</span><span class="pun">,</span><span class="pln"> var2</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> var2</span><span class="pun">:</span><span class="pln">
        var2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
    var2</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">var1</span><span class="pun">)</span></code></pre>

<p>
	لنعد كتابة الدالة السابقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">search_for_links</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">page</span><span class="pun">,</span><span class="pln"> add_to</span><span class="pun">=</span><span class="kwd">None</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> add_to</span><span class="pun">:</span><span class="pln">
        add_to </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">
    new_links </span><span class="pun">=</span><span class="pln"> page</span><span class="pun">.</span><span class="pln">search_for_links</span><span class="pun">()</span><span class="pln">
    add_to</span><span class="pun">.</span><span class="pln">extend</span><span class="pun">(</span><span class="pln">new_links</span><span class="pun">)</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> add_to</span></code></pre>

<p>
	نقلنا عملية التهيئة من مكان تعريف الدالة إلى داخلها مما يعني أنَّ عملية التهيئة ستتم في كل مرة تُشغَّل فيها الدالة.<br>
	لاحظ أنَّ ذلك ليس ضروريًا إذا كنتَ تستعمل أنواع بيانات غير قابلة للتعديل مثل <a href="https://docs.python.org/2/library/functions.html?highlight=tuple#tuple" rel="external nofollow">tuple</a> أو <a href="https://docs.python.org/2/library/string.html" rel="external nofollow">string</a> أو <a href="https://docs.python.org/2/library/functions.html#int" rel="external nofollow">int</a>. وهذا يعني أنَّك تستطيع تعريف دالة كما في الدالة الآتية دون إمكانية حدوث أخطاء غير متوقعة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">func</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">message</span><span class="pun">=</span><span class="hljs-string"><span class="str">"my message"</span></span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pln"> message</span></code></pre>

<h2 id="الخطأ-الثاني-استخدام-أنواع-البيانات-القابلة-للتعديل-كمتغيرات-في-الأصناف">
	الخطأ الثاني: استخدام أنواع البيانات القابلة للتعديل كمتغيرات في الأصناف
</h2>

<p>
	هذا الخطأ شبيهٌ كثيرًا بالخطأ السابق. تمعّن في الشيفرة الآتية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs python"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">URLCatcher</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">object</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    urls </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">

    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">add_url</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">urls</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">url</span><span class="pun">)</span></code></pre>

<p>
	الشيفرة السابقة تبدو طبيعية جدًا، فلدينا كائن لتخزين روابط URL، وعند استدعائنا للدالة <code>add_url</code> فسنمرر إليها رابط URL لتخزِّنه، صحيح؟ لنجرِّبها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">URLCatcher</span><span class="pun">()</span><span class="pln">
</span><span class="hljs-operator"><span class="pln">a</span></span><span class="pun">.</span><span class="pln">add_url</span><span class="pun">(</span><span class="hljs-string"><span class="str">'http://www.google.'</span></span><span class="pun">)</span><span class="pln">
b </span><span class="pun">=</span><span class="pln"> </span><span class="typ">URLCatcher</span><span class="pun">()</span><span class="pln">
b</span><span class="pun">.</span><span class="pln">add_url</span><span class="pun">(</span><span class="hljs-string"><span class="str">'http://www.bbc.co.'</span></span><span class="pun">)</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs bash"><span class="pln">b</span><span class="pun">.</span><span class="pln">urls
</span><span class="pun">[</span><span class="hljs-string"><span class="str">'http://www.google.com'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'http://www.bbc.co.uk'</span></span><span class="pun">]</span><span class="pln">

a</span><span class="pun">.</span><span class="pln">urls
</span><span class="pun">[</span><span class="hljs-string"><span class="str">'http://www.google.com'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'http://www.bbc.co.uk'</span></span><span class="pun">]</span></code></pre>

<p>
	ما هذا؟! لم نتوقع ذلك. إذ أنشأنا كائنين منفصلين <code>a</code> و <code>b</code>، وأسندنا رابطًا للكائن <code>a</code> مختلفًا عن رابط الكائن <code>b</code>، فكيف امتلك كلا الكائنين الرابطين نفسهما؟<br>
	اتضح أنَّ هذه المشكلة شبيهة جدًا بالمشكلة في المثال الأول، فقائمة (list) عناوين URL قد تمت تهيئتها عند تعريف الصنف (class)، وبالتالي أمست جميع الكائنات المُنشَأة من ذاك الصنف تستعمل القائمة نفسها.<br>
	هنالك بعض الحالات التي نستفيد فيها من هذه الميزة، لكنها ستضرك في أغلبية الأوقات، فلو أردتَ تخزين بيانات كل كائن على حدة فيمكنك تعديل الشيفرة لتصبح كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs python"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">URLCatcher</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">object</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">__init__</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">urls </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[]</span><span class="pln">

    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">add_url</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">urls</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">url</span><span class="pun">)</span></code></pre>

<p>
	أصبحت قائمة <code>urls</code> تُهيّئ عند إنشاء الكائن، وعندما نُنشِئ كائنين فستُهيّئ قائمتان منفصلتان.
</p>

<h2 id="الخطأ-الثالث-عملية-إسناد-قيم-إلى-نوع-بيانات-قابل-للتعديل">
	الخطأ الثالث: عملية إسناد قيم إلى نوع بيانات قابل للتعديل
</h2>

<p>
	هذا الخطأ أربكني لفترة حتى فهمته، دعنا نستعمل نوع بيانات قابل للتعديل مثل <a href="https://docs.python.org/2/library/stdtypes.html?highlight=dict#dict" rel="external nofollow">dict</a>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-string"><span class="str">'1'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'2'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'two'</span></span><span class="pun">}</span></code></pre>

<p>
	لنفترض أننا نريد أخذ قيمة المتغير <code>a</code> واستعمالها في مكانٍ آخر دون تعديل القيمة الأصلية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs livecodeserver"><span class="pln">b </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">

b</span><span class="pun">[</span><span class="hljs-string"><span class="str">'3'</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'three'</span></span></code></pre>

<p>
	أليس هذا بسيطًا؟ لننظر الآن إلى القيمة المخزّنة في المتغير <code>a</code> التي لم نُعدِّلها قط:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs bash"><span class="pun">{</span><span class="hljs-string"><span class="str">'1'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'2'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'two'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'3'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'three'</span></span><span class="pun">}</span></code></pre>

<p>
	ماذا؟! كيف ستبدو قيمة المتغير <code>b</code> إذًا؟
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs bash"><span class="pun">{</span><span class="hljs-string"><span class="str">'1'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'2'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'two'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'3'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'three'</span></span><span class="pun">}</span></code></pre>

<p>
	دعنا نعود خطوةً إلى الوراء وننظر ماذا يحدث لو استعملنا أنواع البيانات غير القابلة للتعديل، مثل tuple:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">c </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">d </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="pln">c</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">d </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">)</span></span></span></code></pre>

<p>
	قيمة <code>c</code> هي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs clojure"><span class="hljs-list"><span class="pun">(</span><span class="hljs-title"><span class="lit">2</span></span><span class="pun">,</span><span class="hljs-number"><span class="pln"> </span><span class="lit">3</span></span><span class="pun">)</span></span></code></pre>

<p>
	بينما قيمة <code>d</code> هي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs clojure"><span class="hljs-list"><span class="pun">(</span><span class="hljs-title"><span class="lit">4</span></span><span class="pun">,</span><span class="hljs-number"><span class="pln"> </span><span class="lit">5</span></span><span class="pun">)</span></span></code></pre>

<p>
	لقد جرى كل شيءٍ على ما يرام، لذا ماذا حدث في مثالنا؟ عند استخدام أنواع البيانات القابلة للتعديل فسنحصل على شيءٍ شبيهٍ بالمؤشرات (pointers) في لغة C، فعندما قلنا أنَّ <code>b = a</code> في الشيفرة السابقة فهذا يعني أنَّ المتغير <code>b</code> أصبح يُشير إلى <code>a</code>، وكلا المتغيرين يشير إلى نفس الكائن في ذاكرة بايثون؟ هل هذا مألوف لديك؟ ذلك لأن هذه المشكلة شبيهة بالمشاكل السابقة، وكنتُ أنوي تسمية هذا الدرس باسم «المشاكل التي تحدث مع أنواع البيانات القابلة للتعديل».<br>
	هل يحدث الأمر نفسه مع القوائم (list)؟ نعم. وكيف سنلتف على المشكلة؟ حسنًا، يجب أن نكتب الشيفرة الآتية التي تنسخ القائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs fix"><span class="hljs-attribute"><span class="pln">b </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> a</span><span class="pun">[:]</span></span></code></pre>

<p>
	السطر السابق سيؤدي إلى نسخ مرجعية كل عنصر من عناصر القائمة ووضعه في قائمة جديدة، لكن لنأخذ حِذرنا فإذا كان نوع بيانات أحد الكائنات الموجودة في القائمة قابلًا للتعديل فسيؤدي ذلك إلى الحصول إلى مرجعية لتلك الكائنات بدلًا من نسخها.<br>
	تخيل وجود قائمة على قطعة من الورق، ففي المثال الأصلي كان ينظر الشخص A والشخص B إلى الورقة نفسها، فلو عدّل شخصٌ ما القائمةَ فسيرى كلا الشخصين التعديلات التي أجريت على القائمة، وعندما نسخنا المرجعيات فأصبح لكل شخصٍ قائمته الخاصة به، لكن لنفترض أنَّ تلك القائمة تحتوي على أماكن يمكن البحث فيها عن طعام، فلو كانت «الثلاجة» موجودة في القائمة فحتى لو نسخها الشخص A و B فما تزال تشير إلى الثلاجة نفسها؛ فلو أتى الشخص A وعدّل محتويات الثلاثة (لنفترض أنه أكل جميع الحلويات فيها) فسيلاحظ الشخص B أن الحلويات قد اختفت من الثلاثة. ولا توجد طريقة سهلة للالتفاف على هذه المشكلة، وهذا أمرٌ مهمٌ عليك تذكره عندما تبرمج لكي تكتب شيفرتك بطريقة لا تسبِّب أيّة مشاكل.<br>
	تعمل أنواع dict بنفس الطريقة، ويمكنك إنشاء نسخة كاملة باستعمال الدالة <code>copy()‎</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4229_7" style="">
<code class="hljs fix"><span class="hljs-attribute"><span class="pln">b </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> a</span><span class="pun">.</span><span class="pln">copy</span><span class="pun">()</span></span></code></pre>

<p>
	أكرِّر أنَّ ذلك سيُنشِئ متغيرًا جديدًا من نوع dict يُشير إلى نفس العناصر الموجودة في المتغير الأصلي، وبالتالي لو كان لدينا قائمتان متماثلتين وعدّلنا كائنًا قابلًا للتعديل مُشار إليه عبر مفتاح موجود في المتغير <code>a</code> فيمكن معرفة تلك التعديلات من داخل المتغير <code>b</code>.<br>
	الإشكاليات التي تواجهنا مع أنواع البيانات القابلة للتعديل تكون نتيجةً لمرونة تلك الأنواع، حيث لا تُشكِّل أيٌّ مما سبق مشكلةً حقيقة، وإنما هي أمور ضرورية يجب أخذها بالحسبان لتنجب المشاكل. وعمليات النسخ الكاملة التي ذكرناها آنفًا لن تكون ضروريةً في 99% من الحالات، أي يجب تعديل برنامجك لكي لا يحتاج إلى استخدام تلك النسخ من الأساس.<br>
	ترجمة –وبتصرّف– للمقال <a href="https://opensource.com/article/17/6/3-things-i-did-wrong-learning-python" rel="external nofollow">‎3 mistakes to avoid when learning to code in Python</a> لصاحبه Pete Savage
</p>
]]></description><guid isPermaLink="false">543</guid><pubDate>Sun, 08 Oct 2017 15:06:10 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x646;&#x634;&#x626; &#x62A;&#x637;&#x628;&#x64A;&#x642; &#x62A;&#x648;&#x64A;&#x62A;&#x631; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%86%D8%B4%D8%A6-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%AA%D9%88%D9%8A%D8%AA%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r540/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_09/59c7b3688fe5d_main(57).png.14ece2cdbcbba4d183b68034a214810a.png" /></p>

<p>
	تساعدك الواجهة البرمجية (<abbr title="Application Programming Interface | واجهة برمجية">API</abbr>) الخاصة بموقع التواصل الاجتماعي تويتر في إدارة الحسابات الموجودة فيه، كما وتسمح لك بالتنقيب عما يحتويه من بيانات. هذا الأمر يفيدك – مثلاً - في عملية ترويج هوية المؤسسة أو المنظمة التي تعمل فيها، وكذلك يُعدّ ممتعًا ومسليًا للمستخدمين الأفراد وهواة البرمجة.<br>
	في هذا الدرس سوف نشرح لكم الخطوات اللازمة لإنشاء تطبيق توتير، وبعد ذلك سنبني سكربت <a href="https://academy.hsoub.com/programming/python/" rel="">بايثون</a> من خلال استخدام مكتبة Tweepy للاستفادة من التطبيق و نشر تغريدات من خلاله.
</p>

<h2 id="المتطلبات">
	المتطلبات
</h2>

<p>
	قبل البدء، تأكد من وجود المتطلبات التالية:
</p>

<ul>
<li>
		وجود حساب توتير مرتبط برقم هاتف محمول صحيح، وتستطيع إعداد ذلك بالذهاب إلى خيار الهاتف المحمول في قائمة الإعدادات والخصوصية.
	</li>
	<li>
		وجود <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r401/" rel="">بيئة بايثون</a> مثبتة على جهاز العمل.
	</li>
</ul>
<h2 id="الخطوة-الأولى-إنشاء-تطبيق-تويتر">
	الخطوة الأولى: إنشاء تطبيق تويتر
</h2>

<p>
	لنبدأ في بناء تطبيق تويتر والحصول على مفاتيح ورموز الوصول الخاصة بالواجهة البرمجية للتطبيق. هذه الرموز هي التي تسمح لك بالاستيثاق من أي تطبيق تطوّره لكي يعمل مع تويتر. كما ذكرنا في المتطلبات، فأنت تحتاج لرقم هاتف محمول لكي تستطيع بناء التطبيق.<br>
	افتح المتصفح وزر <a href="https://apps.twitter.com/" rel="external nofollow">هذا الرابط</a> وسجّل الدخول للصفحة باستخدام بيانات حسابك. اضغط بمجرد ولوجك على الزر المعنون ب (Create New App).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25067" href="https://academy.hsoub.com/uploads/monthly_2017_09/01_Create_New_App.png.55c6ce2b035e9ca9701a9454179acd41.png" rel=""><img alt="01_Create_New_App.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25067" data-unique="d5ivrv9rv" src="https://academy.hsoub.com/uploads/monthly_2017_09/01_Create_New_App.thumb.png.7107dd72e3d9f4305065cad9427d1108.png"></a>
</p>

<p>
	سوف تُوجَّه إلى صفحة بناء التطبيق التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25068" href="https://academy.hsoub.com/uploads/monthly_2017_09/02_Create_an_application.png.700e507def9c18a16da7ec2c7e7135ff.png" rel=""><img alt="02_Create_an_application.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25068" data-unique="cpfafti53" src="https://academy.hsoub.com/uploads/monthly_2017_09/02_Create_an_application.thumb.png.cdc26c65bbf6077b78a935e0ad507c64.png"></a>
</p>

<p>
	أدخل في هذه الصفحة الحقول المطلوبة كما في المثال التالي:
</p>

<p>
	الاسم: AcademyHsoubTest<br>
	الوصف: Academy Hsoub Application<br>
	الموقع: <a href="https://my.example.placeholder" rel="external nofollow">https://my.example.placeholder</a>
</p>

<p>
	اقرأ اتفاقية مطور تويتر. إذا كنت موافقاً عليها، اضغطعلى خيار الموافقة واضغط على الزر المعنون ب Create your Twitter application والموجود في أسفل الصفحة، وسوف تتلقى صفحة تأكيد على ذلك.
</p>

<p>
	ستُوجَّه بعد أن نجاح إنشاء التطبيق إلى صفحة التطبيق التالية، والتي تُقدم لك بعض المعلومات العامة عن التطبيق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25069" href="https://academy.hsoub.com/uploads/monthly_2017_09/03_Page_Confirmation.png.f9c8b6d8ba17981805bba55307e8dbca.png" rel=""><img alt="03_Page_Confirmation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25069" data-unique="0vqgp9qfr" src="https://academy.hsoub.com/uploads/monthly_2017_09/03_Page_Confirmation.thumb.png.792a5f75329a4322990c0218c9e99927.png"></a>
</p>

<h3 id="الخطوة-الثانية-تعديل-مستوى-الإذن-للتطبيق-وتوليد-رموز-الوصول-الخاصة-به">
	الخطوة الثانية: تعديل مستوى الإذن للتطبيق وتوليد رموز الوصول الخاصة به
</h3>

<p>
	من صفحة التفاصيل (Details Page) السابقة، اذهب لخيار الأذونات (Permissions) وذلك للتأكد من أننا نمتلك مستوى الوصول المطلوب لتوليد مفاتيح التطبيق.
</p>

<p>
	يمتلك التطبيق تلقائيا أذونات القراءة والكتابة. إذا لم يكن كذلك، عدّل التطبيق وتأكد من أن خيار القراءة والكتابة هو المحدد من قائمة الأذونات. هذا الأمر يسمح للتطبيق بالنشر على حساب تويتر بالنيابة عنك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25070" href="https://academy.hsoub.com/uploads/monthly_2017_09/04_Application_Permissions.png.0eac5bf2466c083d06406839d5c8fdf0.png" rel=""><img alt="04_Application_Permissions.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25070" data-unique="msrz9nnj0" src="https://academy.hsoub.com/uploads/monthly_2017_09/04_Application_Permissions.thumb.png.23963a224e2271635cd746aaba5200e4.png"></a>
</p>

<p>
	اذهب بعد التأكد من أذونات التطبيق التي تسمح له بالنشر إلى خيار المفاتيح ورموز الوصول (Keys and Access Tokens). ستُنقَل إلى صفحة تعرض لك مفتاح المستهلك (Consumer Key) والرمز السري للمستهلك (Consumer Secret)، وكذلك تُمكنك من توليد رمز الوصول ورمز الوصول السري. هذه الرموز والمفاتيح هي التي ستقوم بعملية الاستيثاق لتطبيقك مع تويتر.
</p>

<p>
	اضغط على الزر المعنون ب (Create my access token) لتوليد رمز الوصول ورمز الوصول السري.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25064" href="https://academy.hsoub.com/uploads/monthly_2017_09/05_Access_token.png.a581a3842a13e93867a7e4543c9b8571.png" rel=""><img alt="05_Access_token.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25064" data-unique="23fnv2h5x" src="https://academy.hsoub.com/uploads/monthly_2017_09/05_Access_token.thumb.png.196aff5ec47b21f10cb576167a3a466f.png"></a>
</p>

<p>
	أصبح لديك الآن رمز الوصول ورمز الوصول السري.
</p>

<p style="text-align: center;">
	<img alt="06_Tokens_and_Keys.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25065" data-unique="zunoud3pv" src="https://academy.hsoub.com/uploads/monthly_2017_09/06_Tokens_and_Keys.png.29e70dac0d38eafd3c3242bb2151c578.png"></p>

<h2 id="الخطوة-الثالثة-تثبيت-مكتبة-tweepy">
	الخطوة الثالثة: تثبيت مكتبة Tweepy
</h2>

<p>
	تستطيع أن تستخدم مجموعة متنوعة من لغات البرمجة للتخاطب مع الواجهة البرمجية لتويتر. سنختبر التطبيق الذي أنشأناه عن طريق تشغيل سكربت بايثون ينشُر نصًّا معيّنًا على حساب تويترللمستخدم.
</p>

<p>
	مكتبة Tweepy مفتوحة المصدر وسهلة الاستخدام وتسمح للمشاريع المكتوبة بلغة البايثون بالوصول للواجهة البرمجية لتويتر بكل سهولة.
</p>

<p>
	سنستخدم أداة pip لتثبيت مكتبة tweepy.
</p>

<p>
	أنشئ مجلدًا خاصًّا للمشروع باسم twitter.
</p>

<p>
	تأكد قبل تثبيت المكتبة أن أداة pip مُحدثة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_10" style="">
<span class="pun">&gt;&gt;</span><span class="pln"> pip install </span><span class="pun">--</span><span class="pln">upgrade pip</span></pre>

<p>
	بعد أن تُحدَّث الأداة بنجاح، نثبّت مكتبة Tweepy:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_8" style="">
<span class="pun">&gt;&gt;</span><span class="pln"> pip install tweepy</span></pre>

<p>
	بعد تثبيت المكتبة تستطيع البدء بكتابة البرنامج.
</p>

<h2 id="الخطوة-الرابعة-بناء-البرنامج-الذي-يتخاطب-مع-الواجهة-البرمجية-لتويتر">
	الخطوة الرابعة: بناء البرنامج الذي يتخاطب مع الواجهة البرمجية لتويتر
</h2>

<p>
	أصبحنا، بعد أن بنينا التطبيق وولّدنا الرموز والمفاتيح اللازمة للوصول للتطبيق، على مشارف بناء البرنامج الذي سينشر بالنيابة عنك.
</p>

<p>
	أنشئ باستخدام محرر النصوص المفضل لديك ملف بايثون باسم helloworld.py في داخل المجلد twitter الذي أنشأناه في الخطوة السابقة.<br>
	في بداية الملف، نحتاج أن نستورد المكتبة باستخدام جملة import:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_10" style="">
<code class="hljs java"><span class="hljs-keyword"><span class="kwd">import</span></span><span class="pln"> tweepy</span></code></pre>

<p>
	سننشئ متغيرات لكل مفتاح ورمز ولّدناه. استبدل ما بين علامات التنصيص في المتغيرات التالية بالمفاتيح والرموز التي تم توليدها في تطبيقك الخاص.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_10" style="">
<code class="hljs java"><span class="hljs-keyword"><span class="kwd">import</span></span><span class="pln"> tweepy

consumer_key </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_consumer_key'</span></span><span class="pln">
consumer_secret </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_consumer_secret'</span></span><span class="pln">
access_token </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_access_token'</span></span><span class="pln">
access_token_secret </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_access_token_secret'</span></span></code></pre>

<p>
	ننشئ بعدها عنصرًا من الصنف OAuthHandler الموجود في مكتبة Tweepy وسنمرر لهذا العنصر المفاتيح والرموز الموجودة لدينا. يعمل هذا العنصر من خلال بروتوكول HTTP يعطي التصريح اللازم للأجهزة، الواجهات البرمجية، الخوادم والتطبيقات، ويعدّ هذا الصنف صنفا معياريا يقدّم ألية وصول آمن وذي تفويض كامل.<br>
	نعدّ كذلك رموز الوصول وندمجها مع الواجهة البرمجية المنشأة من تعريف عنصر من نوع <abbr title="Application Programming Interface | واجهة برمجية">API</abbr>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_10" style="">
<code class="hljs makefile"><span class="kwd">import</span><span class="pln"> tweepy

</span><span class="hljs-constant"><span class="pln">consumer_key</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'your_consumer_key'</span><span class="pln">
</span><span class="hljs-constant"><span class="pln">consumer_secret</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'your_consumer_secret'</span><span class="pln">
</span><span class="hljs-constant"><span class="pln">access_token</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'your_access_token'</span><span class="pln">
</span><span class="hljs-constant"><span class="pln">access_token_secret</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'your_access_token_secret'</span><span class="pln">

</span><span class="hljs-constant"><span class="pln">auth</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> tweepy</span><span class="pun">.</span><span class="typ">OAuthHandler</span><span class="pun">(</span><span class="pln">consumer_key</span><span class="pun">,</span><span class="pln"> consumer_secret</span><span class="pun">)</span><span class="pln">
auth</span><span class="pun">.</span><span class="pln">set_access_token</span><span class="pun">(</span><span class="pln">access_token</span><span class="pun">,</span><span class="pln"> access_token_secret</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-constant"><span class="pln"><abbr title="Application Programming Interface | واجهة برمجية">api</abbr></span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> tweepy</span><span class="pun">.</span><span class="pln"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></span><span class="pun">(</span><span class="pln">auth</span><span class="pun">)</span></code></pre>

<p>
	نحدّد في نهاية البرنامج النص الذي سننشره. عرف متغيرًا باسم tweet ومرر له النص الذي تريد نشره ومرّر هذا المتغير للدالة <abbr title="Application Programming Interface | واجهة برمجية">api</abbr>.update_status.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_10" style="">
<code class="hljs sql"><span class="kwd">import</span><span class="pln"> tweepy

</span><span class="com"># </span><span class="hljs-operator"><span class="hljs-keyword"><span class="com">Create</span></span><span class="com"> variables </span><span class="hljs-keyword"><span class="com">for</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">each</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">key</span></span><span class="com">, secret, token</span><span class="pln">
consumer_key </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_consumer_key'</span></span><span class="pln">
consumer_secret </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_consumer_secret'</span></span><span class="pln">
access_token </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_access_token'</span></span><span class="pln">
access_token_secret </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'your_access_token_secret'</span></span><span class="pln">

</span><span class="com"># </span><span class="hljs-keyword"><span class="com">Set</span></span><span class="com"> up OAuth </span><span class="hljs-keyword"><span class="com">and</span></span><span class="com"> integrate </span><span class="hljs-keyword"><span class="com">with</span></span><span class="com"> <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></span><span class="pln">
auth </span><span class="pun">=</span><span class="pln"> tweepy</span><span class="pun">.</span><span class="typ">OAuthHandler</span><span class="pun">(</span><span class="pln">consumer_key</span><span class="pun">,</span><span class="pln"> consumer_secret</span><span class="pun">)</span><span class="pln">
auth</span><span class="pun">.</span><span class="pln">set_access_token</span><span class="pun">(</span><span class="pln">access_token</span><span class="pun">,</span><span class="pln"> access_token_secret</span><span class="pun">)</span><span class="pln">
<abbr title="Application Programming Interface | واجهة برمجية">api</abbr> </span><span class="pun">=</span><span class="pln"> tweepy</span><span class="pun">.</span><span class="pln"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></span><span class="pun">(</span><span class="pln">auth</span><span class="pun">)</span><span class="pln">

</span><span class="com"># </span><span class="hljs-keyword"><span class="com">Write</span></span><span class="com"> a tweet </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> push </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> our Twitter account</span><span class="pln">
tweet </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'أكاديمية حسوب، أهلا بالعالم'</span></span><span class="pln">
<abbr title="Application Programming Interface | واجهة برمجية">api</abbr></span><span class="pun">.</span><span class="pln">update_status</span><span class="pun">(</span><span class="pln">status</span><span class="pun">=</span><span class="pln">tweet</span><span class="pun">)</span></span></code></pre>

<p>
	تستطيع الان حفظ الملف وتشغيله:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5979_10" style="">
<code class="hljs avrasm"><span class="pun">&gt;&gt;</span><span class="pln"> python helloworld</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">py</span></span></code></pre>

<p>
	بعد انتهاء تنفيذ البرنامج، قم بمراجعة الحساب توتير الخاص بك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25066" href="https://academy.hsoub.com/uploads/monthly_2017_09/07_Tweet.png.ec7320332f3e23e23e3f30d09b402a22.png" rel=""><img alt="07_Tweet.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25066" data-unique="yevfocurz" src="https://academy.hsoub.com/uploads/monthly_2017_09/07_Tweet.thumb.png.58b06c6dfa608518982a052e6c8ad9f2.png"></a>
</p>

<p>
	نشرت التغريدة على الخط الزمني لحسابك بنجاح وبذلك تكون قد هيّأت تطبيق تويتر واستخدمته من خلال مكتبة Tweepy!
</p>

<h3 id="خاتمة">
	خاتمة
</h3>

<p>
	باتباعك للشرح في هذا المقال، أنت أصبحت قادرا على تهيئة تطبيق تويتر وربطه بحسابك الخاص على الموقع.
</p>

<p>
	بمجرد بناء التطبيق وتوليد المفاتيح والرموز اللازمة، قمنا باستخدام التطبيق والرموز للاستيثاق من برنامج بايثون باستخدام المكتبة المفتوحة المصدر Tweepy.
</p>

<p>
	إذا لم تكن مبرمجًا للغة فابدأ <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">بتعلم بايثون</a>، أو هناك العديد من لغات البرمجة والمكتبات التي من الممكن استخدامها مع الواجهة البرمجية لتويتر. يحتوي الموقع الخاص بمطوري تويتر العديد من هذه المكتبات التي تدعم التخاطب مع الواجهة البرمجية لتويتر. 
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-create-a-twitter-app" rel="external nofollow">How To Create a Twitter App</a> لصاحبته Lisa Tagliaferri.
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="http://www.freepik.com/free-photo/pile-of-3d-twitter-logos_1191372.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">540</guid><pubDate>Fri, 29 Sep 2017 14:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639; &#x625;&#x644;&#x649; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; Python 3</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-python-3-r535/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/------Python-3.png.6421b72ddbe1d440954b89336032e7fd.png" /></p>
<p>
	في بدايات التسعينات، قام Guido van Rossum بإنشاء لغة البايثون. تُعتبر البايثون من أشهر لغات البرمجة حاليا، ولها حضور واسع في العديد من المجالات التطبيقية والعلمية، وتتميز بسهولة شفرتها البرمجية وسرعة تعلمها مع متانة وقوة تضاهي اللغات الأخرى.<br>
	سوف نتناول في هذا المقال المواضيع التالية:
</p>

<ol>
	<li>
		التعليقات.
	</li>
	<li>
		أنواع البيانات.
	</li>
	<li>
		المتغيرات والتراكيب.
	</li>
	<li>
		جمل التحكم.
	</li>
	<li>
		الدوال Functions.
	</li>
	<li>
		الوحدات.
	</li>
	<li>
		 الفئات.
	</li>
</ol>

<p>
	<strong>ملاحظة</strong>: إصدار البايثون 3 هو المعتمد في شرح هذا المقال، وناتج العمليات والأوامر في هذا المقال سيتم كتابتها بعد الرمز <span style="color:#c0392b;"># =&gt;</span>.
</p>

<h2 id="التعليقات">
	التعليقات
</h2>

<p>
	تبدأ التعليقات ذات السطر الواحد برمز #، أما التعليقات التي تحتوي أكثر من سطر فتجب إحاطتها بثلاث علامات تنصيص (منفردة أو مزدوجة) في البداية والنهاية. أنظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><span class="com"># Single line comments start with a number symbol.</span><span class="pln">

</span><span class="str">""" Multiline strings can be written
    using three "s, and are often used
    as documentation.
"""</span></pre>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 id="أنواع-البيانات-والعمليات">
	أنواع البيانات والعمليات
</h2>

<p>
	الأرقام:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">3</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 3</span></span></code></pre>

<p>
	العمليات الرياضية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 2</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">8</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 7</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 20</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">35</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 7.0</span></span></code></pre>

<p>
	يوجد نوعان من القسمة في بايثون 3، الأولى تُسمى القسمة بعدد فاصل عائم “floating point division” ونَستخدم رمز القسمة المعروف / ، وناتج العملية هو دائما عدد حقيقي من النوع float:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">10.0</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 3.3333333333333335</span></span></code></pre>

<p>
	أما النوع الثاني من القسمة فيُسمى القسمة الصحيحة “integer division” ونَستخدم الرمز // لهذا النوع، ويكون ناتج العملية دون الفاصلة والأرقام التي بعدها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="com">// </span><span class="hljs-number"><span class="com">3</span></span><span class="com">       </span><span class="hljs-comment"><span class="com"># =&gt; 1</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">5.0</span></span><span class="pln"> </span><span class="com">// </span><span class="hljs-number"><span class="com">3.0</span></span><span class="com">   </span><span class="hljs-comment"><span class="com"># =&gt; 1.0 # يعمل هذا النوع من القسمة على الأعداد الحقيقية أيضا</span></span><span class="pln">
</span><span class="pun">-</span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="com">// </span><span class="hljs-number"><span class="com">3</span></span><span class="com">      </span><span class="hljs-comment"><span class="com"># =&gt; -2</span></span><span class="pln">
</span><span class="pun">-</span><span class="hljs-number"><span class="lit">5.0</span></span><span class="pln"> </span><span class="com">// </span><span class="hljs-number"><span class="com">3.0</span></span><span class="com">  </span><span class="hljs-comment"><span class="com"># =&gt; -2.0</span></span></code></pre>

<p>
	عملية باقي القسمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">7</span></span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 1</span></span></code></pre>

<p>
	عملية الأس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">2</span></span><span class="pun">**</span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 8</span></span></code></pre>

<p>
	قاعدة أولوية العمليات حسب الأقواس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 8</span></span></code></pre>

<p>
	القيم المنطقية (لاحظ الحرف الكبير في البداية):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mathematica"><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">False</span></span></code></pre>

<p>
	عكس القيمة المنطقية باستخدام not:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">False</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	العمليات المنطقية (العمليات المنطقية حساسة لحالة الأحرف):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs php"><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">and</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">False</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">False</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">or</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	القيمة المنطقية False تساوي الرقم 0، والقيمة المنطقية True تساوي الرقم 1:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs php"><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">and</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">     </span><span class="hljs-comment"><span class="com"># =&gt; 0</span></span><span class="pln">
</span><span class="pun">-</span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">or</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">     </span><span class="hljs-comment"><span class="com"># =&gt; -5</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">False</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="pun">-</span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">False</span></span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">True</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">#=&gt; True</span></span></code></pre>

<p>
	عملية فحص المساواة باستخدام ==:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ini"><span class="hljs-setting"><span class="lit">1</span><span class="pln"> </span><span class="pun">=</span><span class="hljs-value"><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">  </span><span class="com"># =&gt; </span><span class="hljs-keyword"><span class="com">True</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="lit">2</span><span class="pln"> </span><span class="pun">=</span><span class="hljs-value"><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">  </span><span class="com"># =&gt; </span><span class="hljs-keyword"><span class="com">False</span></span></span></span></code></pre>

<p>
	فحص عدم المساواة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	المقارنات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span></code></pre>

<p>
	تفحص عملية is إذا كان متغيران يشيران لنفس الكائن أم لا، ولكن العملية == تفحص إذا كانا بنفس القيمة أم لا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">]</span><span class="pln">  
b </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">             
b </span><span class="kwd">is</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">            </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
b </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">            </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
b </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">]</span><span class="pln">  
b </span><span class="kwd">is</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">            </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
b </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pln">            </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	تُنشَأ النصوص باستخدام علامات التنصيص المزدوجة أو الفردية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs vhdl"><span class="hljs-string"><span class="str">"This is a string."</span></span><span class="pln">
</span><span class="hljs-attribute"><span class="str">'This</span></span><span class="str"> </span><span class="hljs-keyword"><span class="str">is</span></span><span class="str"> also a </span><span class="hljs-typename"><span class="str">string</span></span><span class="str">.'</span></code></pre>

<p>
	تستطيع جمع النصوص ببعضها، ولكن حاول تجنب هذه الطريقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="hljs-string"><span class="str">"Hello "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">"world!"</span></span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; </span><span class="hljs-string"><span class="com">"Hello world!"</span></span></code></pre>

<p>
	تستطيع دمج النصوص ببعضها دون استخدام + :
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="hljs-string"><span class="str">"Hello "</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"world!"</span></span><span class="pln">    </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; </span><span class="hljs-string"><span class="com">"Hello world!"</span></span></code></pre>

<p>
	من الممكن التعامل مع النص وكأنه مصفوفة من الحروف:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="hljs-string"><span class="str">"This is a string"</span></span><span class="pun">[</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; </span><span class="hljs-string"><span class="com">'T'</span></span></code></pre>

<p>
	للحصول على طول نص نستخدم الدالة المضمنة len :
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="hljs-built_in"><span class="pln">len</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"This is a string"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 16</span></span></code></pre>

<p>
	تستطيع استخدام الدالة format لإجراء عملية التنسيق على النص:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="hljs-string"><span class="str">"{} can be {}"</span></span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Strings"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"interpolated"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; </span><span class="hljs-string"><span class="com">"Strings can be interpolated"</span></span></code></pre>

<p>
	تستطيع عند استخدام الدالة format ترقيم المدخلات حسب ترتيبها واستخدامها في تنسيق النص أكثر من مرة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="hljs-string"><span class="str">"{0} be nimble, {0} be quick, {0} jump over the {1}"</span></span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Jack"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"candle stick"</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; </span><span class="hljs-string"><span class="com">"Jack be nimble, Jack be quick, Jack jump over the candle stick"</span></span></code></pre>

<p>
	أو باستخدام طريقة تسمية المدخلات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="hljs-string"><span class="str">"{name} wants to eat {food}"</span></span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">name</span><span class="pun">=</span><span class="hljs-string"><span class="str">"Bob"</span></span><span class="pun">,</span><span class="pln"> food</span><span class="pun">=</span><span class="hljs-string"><span class="str">"lasagna"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; </span><span class="hljs-string"><span class="com">"Bob wants to eat lasagna"</span></span></code></pre>

<p>
	تستطيع في البايثون 3 استخدام الطريقة القديمة في بايثون 2 لعمل تنسيق للنصوص:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs perl"><span class="hljs-string"><span class="str">"</span><span class="hljs-variable"><span class="str">%s</span></span><span class="str"> can be </span><span class="hljs-variable"><span class="str">%s</span></span><span class="str"> the </span><span class="hljs-variable"><span class="str">%s</span></span><span class="str"> way"</span></span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-string"><span class="str">"Strings"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"interpolated"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"old"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; "Strings can be interpolated the old way"</span></span></code></pre>

<p>
	None عبارة عن كائن:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mathematica"><span class="hljs-keyword"><span class="kwd">None</span></span><span class="pln">  </span><span class="com"># =&gt; </span><span class="hljs-keyword"><span class="com">None</span></span></code></pre>

<p>
	لا تستخدم فحص المساواة باستخدام رمز == للمقارنة مع None واستخدم عملية الفحص is بدلا منها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-string"><span class="str">"etc"</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">is</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">None</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">None</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">is</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">None</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	None والرقم 0 والمتغيرات الفارغة من الأنواع strings، lists، dict، وtuples جميعها تُرادف القيمة المنطقية False، أما باقي القيم فهي True:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs cs"><span class="hljs-preprocessor"><span class="com"># All other values are True</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">bool</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">)</span><span class="pln">   </span><span class="hljs-preprocessor"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">bool</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">""</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">bool</span></span><span class="pun">([])</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">bool</span></span><span class="pun">({})</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; False</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">bool</span></span><span class="pun">(())</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; False</span></span></code></pre>

<h2 id="المتغيرات-والتراكيب">
	المتغيرات والتراكيب:
</h2>

<p>
	تتوفّردالة خاصة للطباعة (الإخراج على الطرفية) وتسمى print:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs php"><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"I'm Python. Nice to meet you!"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; I'm Python. Nice to meet you!</span></span></code></pre>

<p>
	يُطبَع سطر جديد تلقائيا عند استخدام الدالة print. تستطيع استخدام المعطى end لتغيير هذا الأمر وتحديد النص الذي تريده بدلا من السطر الجديد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruby"><span class="kwd">print</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Hello, World"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">end</span></span><span class="pun">=</span><span class="hljs-string"><span class="str">"!"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; Hello, World!</span></span></code></pre>

<p>
	للحصول على مدخلات من الطرفية نستخدم الدالة input:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs haskell"><span class="hljs-title"><span class="pln">input_string_var</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> input</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Enter some data: "</span></span><span class="pun">)</span><span class="pln"> </span><span class="com"># </span><span class="hljs-type"><span class="com">Returns</span></span><span class="com"> the </span><span class="hljs-typedef"><span class="hljs-keyword"><span class="com">data</span></span><span class="com"> as a string</span></span></code></pre>

<p>
	ملاحظة/ في النسخ القديمة من البايثون، كانت الدالة input باسم raw_input.
</p>

<p>
	لا يوجد في البايثون تعريفات، ولكن يوجد إعطاء قيم مباشرة. الطريقة المتعارف عليها في تسمية المتغيرات هي الأحرف الصغيرة مع التسطير السفلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs makefile"><span class="hljs-constant"><span class="pln">some_var</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="hljs-constant"><span class="pln">some_var</span></span><span class="pln">  </span><span class="com"># =&gt; 5</span></code></pre>

<p>
	محاولة استخدام متغير لم يأخذ قيمة مسبقاً ينتج عنه خطأ، راجع كيفية معالجة الأخطاء تحت عنوان جمل التحكم.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">some_unknown_var  </span><span class="hljs-comment"><span class="com"># ينتُج خطأ من الصنف NameError</span></span></code></pre>

<p>
	تشبه القوائم المصفوفات في اللغات الأخرى:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ini"><span class="hljs-setting"><span class="pln">li </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="pun">[]</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">other_li </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="pun">[</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">]</span></span></span></code></pre>

<p>
	نستخدم append لإضافة عناصر في نهاية القائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs avrasm"><span class="pln">li</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">append</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">)</span><span class="pln">    </span><span class="hljs-preprocessor"><span class="com"># li is now [1]</span></span><span class="pln">
li</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">append</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln">    </span><span class="hljs-preprocessor"><span class="com"># li is now [1, 2]</span></span><span class="pln">
li</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">append</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">    </span><span class="hljs-preprocessor"><span class="com"># li is now [1, 2, 4]</span></span><span class="pln">
li</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">append</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">    </span><span class="hljs-preprocessor"><span class="com"># li is now [1, 2, 4, 3]</span></span></code></pre>

<p>
	نستخدم الدالةpop لحذف العناصر من آخر القائمة. ترجع التعليمة أدناه القيمة 3 وتصبح مكونات القائمة [1, 2, 4]:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mizar"><span class="pln">li</span><span class="pun">.</span><span class="pln">pop</span><span class="pun">()</span><span class="pln">        </span><span class="com"># =&gt; 3 </span><span class="hljs-keyword"><span class="com">and</span></span><span class="com"> li </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">now</span></span><span class="com"> [1, 2, 4]</span></code></pre>

<p>
	تعود القائمة إلى حالتها السابقة لتنفيذ الدالة pop بعد تنفيذ الدالة append على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs avrasm"><span class="pln">li</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">append</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">    </span><span class="hljs-preprocessor"><span class="com"># li is now [1, 2, 4, 3] again.</span></span></code></pre>

<p>
	تستطيع التعامل مع القائمة مثل المصفوفة من حيث الوصول لعناصرها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li</span><span class="pun">[</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">]</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 1</span></span><span class="pln">
li</span><span class="pun">[-</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 3</span></span></code></pre>

<p>
	في حال استخدام فهرس خارج حدود القائمة سينتج خطأ من نوع IndexError:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li</span><span class="pun">[</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># Raises an IndexError</span></span></code></pre>

<p>
	تستطيع استخدام مجال للحصول على جزء أكبر من القائمة بحيث نحدد فهرس البداية وفهرس النهاية.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li</span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; [2, 4]</span></span></code></pre>

<p>
	ملاحظة: فهرس النهاية غير مشمول في القيمة المرجعة، حيث يعدّ النمط المستخدم هو نمط نطاق مغلق-مفتوح.
</p>

<p>
	في حال عدم استخدام فهرس النهاية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li</span><span class="pun">[</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">:]</span><span class="pln">    </span><span class="hljs-comment"><span class="com"># =&gt; [4, 3]</span></span></code></pre>

<p>
	في حال عدم استخدام فهرس البداية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li</span><span class="pun">[:</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]</span><span class="pln">    </span><span class="hljs-comment"><span class="com"># =&gt; [1, 2, 4]</span></span></code></pre>

<p>
	اختيار عنصر كل خطوتين ابتداء من العنصر الأول في القائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li</span><span class="pun">[::</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">]</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt;[1, 4]</span></span></code></pre>

<p>
	إرجاع كامل المصفوفة بطريقة عكسية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruby"><span class="pln">li</span><span class="pun">[</span><span class="hljs-symbol"><span class="pun">:</span></span><span class="hljs-symbol"><span class="pun">:-</span></span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; [3, 4, 2, 1]</span></span></code></pre>

<p>
	القاعدة العامة للاستعلامات السابقة في القوائم هي كالتالي(البداية start، النهاية end والخطوة step):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># li[start:end:step]</span></span></code></pre>

<p>
	نسخ عميق (Deep Copy):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li2 </span><span class="pun">=</span><span class="pln"> li</span><span class="pun">[:]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; li2 = [1, 2, 4, 3]</span></span></code></pre>

<p>
	عندما نفحص المساواة باستخدام عملية is كالتالي: (li2 is li) ستكون النتيجة False.
</p>

<p>
	لحذف عنصر من القائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs css"><span class="hljs-tag"><span class="kwd">del</span></span><span class="pln"> </span><span class="hljs-tag"><span class="pln">li</span></span><span class="hljs-attr_selector"><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span></span><span class="pln">  </span><span class="com"># </span><span class="hljs-tag"><span class="com">li</span></span><span class="com"> </span><span class="hljs-tag"><span class="com">is</span></span><span class="com"> </span><span class="hljs-tag"><span class="com">now</span></span><span class="com"> </span><span class="hljs-attr_selector"><span class="com">[1, 2, 3]</span></span></code></pre>

<p>
	لحذف أول عنصر في القائمة يساوي القيمة المدخلة في الدالة remove:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs cmake"><span class="pln">li</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">remove</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># li is now [1, 3]</span></span><span class="pln">
li</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">remove</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># ValueError لأن القيمة غير موجودة</span></span></code></pre>

<p>
	إضافة عنصر في مكان معين في القائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs sql"><span class="pln">li</span><span class="pun">.</span><span class="hljs-operator"><span class="hljs-keyword"><span class="pln">insert</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln">  </span><span class="com"># li </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> now [</span><span class="hljs-number"><span class="com">1</span></span><span class="com">, </span><span class="hljs-number"><span class="com">2</span></span><span class="com">, </span><span class="hljs-number"><span class="com">3</span></span><span class="com">] again</span></span></code></pre>

<p>
	الحصول على فهرس أول عنصر في القائمة يساوي القيمة المعطاة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs axapta"><span class="pln">li</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">index</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; 1</span></span><span class="pln">
li</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">index</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># ValueError لأن القيمة غير موجودة</span></span></code></pre>

<p>
	لإضافة قائمة لقائمة وإرجاع النتيجة كقائمة جديدة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">li </span><span class="pun">+</span><span class="pln"> other_li  </span><span class="hljs-comment"><span class="com"># =&gt; [1, 2, 3, 4, 5, 6]</span></span></code></pre>

<p>
	لتمديد قائمة وإضافة قائمة إليها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs avrasm"><span class="pln">li</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">extend</span></span><span class="pun">(</span><span class="pln">other_li</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># Now li is [1, 2, 3, 4, 5, 6]</span></span></code></pre>

<p>
	لفحص وجود قيمة في القائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> li  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	للحصول على حجم القائمة (عدد العناصر التي بها):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="hljs-built_in"><span class="pln">len</span></span><span class="pun">(</span><span class="pln">li</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 6</span></span></code></pre>

<p>
	نوع البيانات Tuple تشبه القائمة ولكنها غير قابلة للتعديل (ثابتة-immutable):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs makefile"><span class="hljs-constant"><span class="pln">tup</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln">
tup</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln">      </span><span class="hljs-comment"><span class="com"># =&gt; 1</span></span><span class="pln">
tup</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># Raises a TypeError</span></span></code></pre>

<p>
	لاحظ أنه في حالة وجود عنصر واحد في tuple لابد من وضع فاصلة عادية بعد العنصر، أما في حالة وجود أكثر من عنصر فتصبح الفاصلة إضافية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ocaml"><span class="hljs-class"><span class="hljs-keyword"><span class="pln">type</span></span><span class="pun">(</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">))</span><span class="pln">   </span><span class="com"># =&gt; &lt;</span><span class="hljs-keyword"><span class="com">class</span></span><span class="com"> </span><span class="hljs-string"><span class="com">'int'</span></span><span class="com">&gt;</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">type</span></span><span class="pun">(</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,))</span><span class="pln">  </span><span class="com"># =&gt; &lt;</span><span class="hljs-keyword"><span class="com">class</span></span><span class="com"> </span><span class="hljs-string"><span class="com">'tuple'</span></span><span class="com">&gt;</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">type</span></span><span class="pun">(</span></span><span class="pun">())</span><span class="pln">    </span><span class="com"># =&gt; &lt;</span><span class="hljs-keyword"><span class="com">class</span></span><span class="com"> </span><span class="hljs-string"><span class="com">'tuple'</span></span><span class="com">&gt;</span></code></pre>

<p>
	تستطيع تنفيذ أغلب عمليات القوائم على النوع Tuple:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="hljs-built_in"><span class="pln">len</span></span><span class="pun">(</span><span class="pln">tup</span><span class="pun">)</span><span class="pln">         </span><span class="hljs-comment"><span class="com"># =&gt; 3</span></span><span class="pln">
tup </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; (1, 2, 3, 4, 5, 6)</span></span><span class="pln">
tup</span><span class="pun">[:</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">]</span><span class="pln">          </span><span class="hljs-comment"><span class="com"># =&gt; (1, 2)</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-operator"><span class="kwd">in</span></span><span class="pln"> tup         </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	تستطيع تفريغ (unpacking) محتويات Tuples وكذلك القوائم في متغيرات كما في الأمثلة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="hljs-operator"><span class="pln">a</span></span><span class="pun">,</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># a = 1, b = 2, c = 3</span></span><span class="pln">
</span><span class="hljs-operator"><span class="pln">a</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">*</span><span class="pln">b</span><span class="pun">,</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># a = 1, b = [2, 3], c = 4</span></span></code></pre>

<p>
	عند عدم استخدام الأقواس فإن نوع البيانات التلقائي الذي سيتم استخدامه هو Tuple:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">d</span><span class="pun">,</span><span class="pln"> e</span><span class="pun">,</span><span class="pln"> f </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span></span></code></pre>

<p>
	تبديل قيم المتغيرات بطريقة سهلة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">e</span><span class="pun">,</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> d</span><span class="pun">,</span><span class="pln"> e  </span><span class="hljs-comment"><span class="com"># d = 5, e = 4</span></span></code></pre>

<p>
	القواميس عبارة عن مؤشرات (مُخططات) من المفاتيح للقيم (كل مفتاح يؤشر على قيمة خاصة به).<br>
	تعريف قاموس فارغ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">empty_dict </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="pun">{}</span></span></code></pre>

<p>
	تعريف قاموس بقيم مسبقة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ini"><span class="hljs-setting"><span class="pln">filled_dict </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="pun">{</span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"two"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"three"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">}</span></span></span></code></pre>

<p>
	لاحظ أن المفاتيح في القواميس لابد أن يكون نوع بياناتها ثابتا (immutable) وذلك لضمان الحصول على مفتاح ثابت (لا تتغير قيمته).<br>
	أنواع البيانات الثابتة والتي من الممكن استخدامها هي int , float, string, tuple.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs fsharp"><span class="pln">invalid_dict </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"123"</span></span><span class="pun">}</span><span class="pln">  </span><span class="com"># =&gt; Raises a TypeError: unhashable </span><span class="hljs-class"><span class="hljs-keyword"><span class="com">type</span></span><span class="com">: '</span><span class="hljs-title"><span class="com">list</span></span><span class="com">'</span></span><span class="pln">
valid_dict </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">):[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]}</span><span class="pln">   </span><span class="com"># Values can be </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> any </span><span class="hljs-class"><span class="hljs-keyword"><span class="com">type</span></span><span class="com">, </span><span class="hljs-title"><span class="com">however</span></span><span class="com">.</span></span></code></pre>

<p>
	يمكن للقيم – عكس المفاتيح – أن تكون من أي نوع.<br>
	للبحث عن قيم نستخدم الأقواس المعكوفة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">filled_dict</span><span class="pun">[</span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 1</span></span></code></pre>

<p>
	للحصول على مفاتيح قاموس على شكل قائمة (الترتيب في القواميس غير ثابت):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="pln">list</span><span class="pun">(</span><span class="pln">filled_dict</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">())</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; [</span><span class="hljs-string"><span class="com">"three"</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"two"</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"one"</span></span><span class="com">]</span></code></pre>

<p>
	للحصول على قيم قاموس على شكل قائمة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs php"><span class="hljs-keyword"><span class="pln">list</span></span><span class="pun">(</span><span class="pln">filled_dict</span><span class="pun">.</span><span class="pln">values</span><span class="pun">())</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; [3, 2, 1]</span></span></code></pre>

<p>
	للتأكد من وجود مفتاح قاموس معين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-string"><span class="str">"one"</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> filled_dict  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> filled_dict      </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span></code></pre>

<p>
	في حالة استخدام مفتاح غير موجود للبحث في قاموس، فإن ذلك ينتج خطأ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">filled_dict</span><span class="pun">[</span><span class="hljs-string"><span class="str">"four"</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># KeyError</span></span></code></pre>

<p>
	استخدم الدالة get لتجنب الخطأ السابق:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs cs"><span class="pln">filled_dict</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">get</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">)</span><span class="pln">      </span><span class="hljs-preprocessor"><span class="com"># =&gt; 1</span></span><span class="pln">
filled_dict</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">get</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"four"</span></span><span class="pun">)</span><span class="pln">     </span><span class="hljs-preprocessor"><span class="com"># =&gt; None</span></span></code></pre>

<p>
	تدعم الدالة get إعادة قيمة تلقائية في حالة عدم وجود المفتاح:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs cs"><span class="pln">filled_dict</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">get</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">   </span><span class="hljs-preprocessor"><span class="com"># =&gt; 1</span></span><span class="pln">
filled_dict</span><span class="pun">.</span><span class="hljs-keyword"><span class="kwd">get</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"four"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; 4</span></span></code></pre>

<p>
	تضيف الدالة setdefault المفتاح المُمرر إلى القاموس في حالة عدم وجوده. تضيف التعليمة التالية مفتاحا باسم five وتعطيه قيمة 5، أما التعليمة الثانية فلا تحدت تغييرا على القاموس.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs vbscript"><span class="pln">filled_dict</span><span class="pun">.</span><span class="pln">setdefault</span><span class="pun">(</span><span class="hljs-string"><span class="str">"five"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">)</span><span class="pln">  </span><span class="com"># filled_dict[</span><span class="hljs-string"><span class="com">"five"</span></span><span class="com">] </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">set</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> </span><span class="hljs-number"><span class="com">5</span></span><span class="pln">
filled_dict</span><span class="pun">.</span><span class="pln">setdefault</span><span class="pun">(</span><span class="hljs-string"><span class="str">"five"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">)</span><span class="pln">  </span><span class="com"># filled_dict[</span><span class="hljs-string"><span class="com">"five"</span></span><span class="com">] </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> still </span><span class="hljs-number"><span class="com">5</span></span></code></pre>

<p>
	للإضافة إلى القاموس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="pln">filled_dict</span><span class="pun">.</span><span class="pln">update</span><span class="pun">({</span><span class="hljs-string"><span class="str">"four"</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">})</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; {</span><span class="hljs-string"><span class="com">"one"</span></span><span class="com">: </span><span class="hljs-number"><span class="com">1</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"two"</span></span><span class="com">: </span><span class="hljs-number"><span class="com">2</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"three"</span></span><span class="com">: </span><span class="hljs-number"><span class="com">3</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"four"</span></span><span class="com">: </span><span class="hljs-number"><span class="com">4</span></span><span class="com">}</span><span class="pln">
filled_dict</span><span class="pun">[</span><span class="hljs-string"><span class="str">"four"</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">         </span><span class="hljs-array"><span class="com"># </span></span><span class="com">طريقة أخرى</span></code></pre>

<p>
	حذف المفتاح من القاموس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="kwd">del</span><span class="pln"> filled_dict</span><span class="pun">[</span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-array"><span class="com"># Removes the key </span></span><span class="hljs-string"><span class="com">"one"</span></span><span class="com"> from filled dict</span></code></pre>

<p>
	بعض طرق التفريغ في القواميس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="pun">{</span><span class="hljs-string"><span class="str">'a'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">**{</span><span class="hljs-string"><span class="str">'b'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">}}</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; {</span><span class="hljs-string"><span class="com">'a'</span></span><span class="com">: </span><span class="hljs-number"><span class="com">1</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'b'</span></span><span class="com">: </span><span class="hljs-number"><span class="com">2</span></span><span class="com">}</span><span class="pln">
</span><span class="pun">{</span><span class="hljs-string"><span class="str">'a'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">**{</span><span class="hljs-string"><span class="str">'a'</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">}}</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; {</span><span class="hljs-string"><span class="com">'a'</span></span><span class="com">: </span><span class="hljs-number"><span class="com">2</span></span><span class="com">}</span></code></pre>

<p>
	المجموعات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">empty_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">set</span></span><span class="pun">()</span><span class="pln">
some_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">}</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># some_set is now {1, 2, 3, 4}</span></span></code></pre>

<p>
	نوع البيانات الخاص بعناصر المجموعات لابد أن يكون ثابتا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">invalid_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">],</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">}</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; Raises a TypeError: unhashable type: 'list'</span></span><span class="pln">
valid_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,),</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">}</span></code></pre>

<p>
	للإضافة إلى المجموعة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="pln">filled_set</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">add</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># filled_set is now {1, 2, 3, 4, 5}</span></span></code></pre>

<p>
	إجراء عملية التقاطع بين مجموعتين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">other_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">}</span><span class="pln">
filled_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln"> other_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; {3, 4, 5}</span></span></code></pre>

<p>
	إجراء عملية الاتحاد بين مجموعتين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">filled_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln"> other_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; {1, 2, 3, 4, 5, 6}</span></span></code></pre>

<p>
	إجراء عملية الطرح بين مجموعتين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mathematica"><span class="hljs-list"><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">}</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="hljs-list"><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">}</span></span><span class="pln">  </span><span class="com"># =&gt; </span><span class="hljs-list"><span class="com">{1, 4}</span></span></code></pre>

<p>
	لإجراء عملية فرق التماثل بين مجموعتين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mathematica"><span class="hljs-list"><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">}</span></span><span class="pln"> </span><span class="pun">^</span><span class="pln"> </span><span class="hljs-list"><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">}</span></span><span class="pln">  </span><span class="com"># =&gt; </span><span class="hljs-list"><span class="com">{1, 4, 5}</span></span></code></pre>

<p>
	لفحص إذا كانت المجموعة على الشمال هي مجموعة تحتوي المجموعة على اليمين أم لا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mathematica"><span class="hljs-list"><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">}</span></span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="hljs-list"><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">}</span></span><span class="pln"> </span><span class="com"># =&gt; </span><span class="hljs-keyword"><span class="com">False</span></span></code></pre>

<p>
	عكس المثال السابق:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mathematica"><span class="hljs-list"><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">}</span></span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="hljs-list"><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">}</span></span><span class="pln"> </span><span class="com"># =&gt; </span><span class="hljs-keyword"><span class="com">True</span></span></code></pre>

<p>
	فحص وجود قيمة في مجموعة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> filled_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> filled_</span><span class="hljs-keyword"><span class="pln">set</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; False</span></span></code></pre>

<h2 id="جمل-التحكم">
	جمل التحكم
</h2>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">some_var </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="lit">5</span></span></code></pre>

<p>
	جملة if:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> some_var </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-string"><span class="str">"قيمة المتغيّر أكبر تماما من 10"</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">elif</span></span><span class="pln"> some_var </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">:</span><span class="pln">    </span><span class="hljs-comment"><span class="com"># هذه الجملة اختيارية</span></span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-string"><span class="str">"قيمة المتغيّر أصغر من 10"</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pun">:</span><span class="pln">                  </span><span class="hljs-comment"><span class="com"># هذه الجملة اختيارية    print("قيمة المتغيّر تساوي 10")</span></span></code></pre>

<p>
	جملة for:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mel"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> animal </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">"dog"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cat"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"mouse"</span></span><span class="pun">]:</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"{} is a mammal"</span></span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">format</span></span><span class="pun">(</span><span class="pln">animal</span><span class="pun">))</span></code></pre>

<p>
	لاحظ استخدام الدالة format في جملة for السابقة. يمكن أيضا تطبيق الجملة على مجال عددي range:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs lua"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> i </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> range</span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">):</span><span class="pln">
    </span><span class="hljs-built_in"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> i </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> range</span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pun">):</span><span class="pln">
    </span><span class="hljs-built_in"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> i </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> range</span><span class="pun">(</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">):</span><span class="pln">
    </span><span class="hljs-built_in"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span></code></pre>

<p>
	جملة while:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs php"><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">while</span></span><span class="pln"> x </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">:</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln">
    x </span><span class="pun">+=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">  </span><span class="hljs-comment"><span class="com"># اختصارا ل x = x + 1</span></span></code></pre>

<p>
	معالجة الأخطاء باستخدام try/except (استخدم raise لتوليد الخطأ):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-keyword"><span class="kwd">try</span></span><span class="pun">:</span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">raise</span></span><span class="pln"> </span><span class="typ">IndexError</span><span class="pun">(</span><span class="hljs-string"><span class="str">"This is an index error"</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">except</span></span><span class="pln"> </span><span class="typ">IndexError</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">as</span></span><span class="pln"> e</span><span class="pun">:</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">pass</span></span><span class="pln">                 </span><span class="hljs-keyword"><span class="kwd">except</span></span><span class="pln"> </span><span class="pun">(</span><span class="typ">TypeError</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NameError</span><span class="pun">):</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">pass</span></span><span class="pln">                 
</span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pun">:</span><span class="pln">                    
    </span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-string"><span class="str">"All good!"</span></span><span class="pun">)</span><span class="pln">   
</span><span class="hljs-keyword"><span class="kwd">finally</span></span><span class="pun">:</span><span class="pln">                 
    </span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-string"><span class="str">"We can clean up resources here"</span></span><span class="pun">)</span></code></pre>

<p>
	ملاحظات حول معالجة الأخطاء:
</p>

<ol>
	<li>
		Pass تعني عدم وجود عملية للتنفيذ.
	</li>
	<li>
		تستطيع سرد أكثر من نوع خطأ في جملة except.
	</li>
	<li>
		تستطيع استخدام جملة else مع try/except اختياريا (تنفذ في حالة كانت الشفرة البرمجية في try لم تُصدر أي خطأ).
	</li>
	<li>
		نستخدم جملة finally لتنفيذ شفرة برمجية بعد try/except بغض النظر عن وجود أخطاء أم لا، وعادةً يُعاد تحرير المصادر المستخدمة.
	</li>
</ol>

<p>
	بدلا من استخدام جملة finally لإعادة تحرير المصادر المستخدمة، تستطيع استخدام جملة with:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="hljs-operator"><span class="kwd">with</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">open</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"myfile.txt"</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">as</span></span><span class="pln"> f</span><span class="pun">:</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">line</span></span><span class="pln"> </span><span class="hljs-operator"><span class="kwd">in</span></span><span class="pln"> f</span><span class="pun">:</span><span class="pln">
        </span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">line</span></span><span class="pun">)</span></code></pre>

<p>
	تُقدم البايثون كائنًا متُعددًا (Iterable) وهو كائن مجرد (عام) يُتعامل معه مثل sequence. فمثلا الكائن المُرجع من الدالة range هو كائن مُتعدد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="pln">filled_dict </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-string"><span class="str">"one"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"two"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"three"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">}</span><span class="pln">
our_iterable </span><span class="pun">=</span><span class="pln"> filled_dict</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">()</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">our_iterable</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; dict_keys([</span><span class="hljs-string"><span class="com">'one'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'two'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'three'</span></span><span class="com">]).</span></code></pre>

<p>
	تستطيع المرور على عناصر الكائن المتعدد والتعامل معها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> i </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> our_iterable</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># Prints one, two, three</span></span></code></pre>

<p>
	على الرغم من خاصية الكائن المتعدد، إلا أنه لا تستطيع استخدام الفهرس معه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln">our_iterable</span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># Raises a TypeError</span></span></code></pre>

<p>
	تستطيع الحصول من خلال الكائن المُتعدد على كائن iterator منه بحيث تستطيع المرور على عناصره:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">our_iterator </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> iter</span><span class="pun">(</span><span class="pln">our_iterable</span><span class="pun">)</span></span></code></pre>

<p>
	يحتفظ الكائن iterator بحالته كلما تم استخدامه، فمثلا، باستخدام وظيفة next تستطيع الحصول على العنصر التالي في هذا الكائن:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruby"><span class="hljs-keyword"><span class="kwd">next</span></span><span class="pun">(</span><span class="pln">our_iterator</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; "one"</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">next</span></span><span class="pun">(</span><span class="pln">our_iterator</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; "two"</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">next</span></span><span class="pun">(</span><span class="pln">our_iterator</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; "three"</span></span></code></pre>

<p>
	بعد الحصول على كافة عناصر iterator فإن استخدام الدالة next سيعيد خطأ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruby"><span class="hljs-keyword"><span class="kwd">next</span></span><span class="pun">(</span><span class="pln">our_iterator</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># Raises StopIteration</span></span></code></pre>

<p>
	تستطيع الحصول على كافة عناصر iterator دفعة واحدة على شكل قائمة وذلك باستخدام الدالة list :
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruleslanguage"><span class="pln">list</span><span class="pun">(</span><span class="pln">filled_dict</span><span class="pun">.</span><span class="pln">keys</span><span class="pun">())</span><span class="pln">  </span><span class="hljs-array"><span class="com"># </span></span><span class="com">=&gt; Returns [</span><span class="hljs-string"><span class="com">"one"</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"two"</span></span><span class="com">, </span><span class="hljs-string"><span class="com">"three"</span></span><span class="com">]</span></code></pre>

<h2 id="الدوال">
	الدوال
</h2>

<p>
	نستخدم الكلمة def في تعريف الدالة، ونستخدم كلمة return في إرجاع النتيجة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">add</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-string"><span class="str">"x is {} and y is {}"</span></span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">))</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y  </span></code></pre>

<p>
	تطبع الدالة السابقة قيمتيْ المعامليْن المُمرّرين لها وتعيد ناتج جمعهما:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs mizar"><span class="pln">add</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">)</span><span class="pln">  </span><span class="com"># =&gt; prints out "x </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> 5 </span><span class="hljs-keyword"><span class="com">and</span></span><span class="com"> y </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> 6" </span><span class="hljs-keyword"><span class="com">and</span></span><span class="com"> returns 11</span></code></pre>

<p>
	يمكن أيضا استدعاء الدالة بذكر أسماء المعاملات (شرط الترتيب غير مطلوب هنا للمعاملات):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">add</span><span class="pun">(</span><span class="pln">y</span></span><span class="pun">=</span><span class="hljs-string"><span class="lit">6</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">=</span><span class="lit">5</span><span class="pun">)</span><span class="pln">  </span></span></code></pre>

<p>
	تستطيع تعريف دالة باستقبال عددًا غير محدد من المعاملات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">varargs</span></span><span class="hljs-params"><span class="pun">(*</span><span class="pln">args</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> args

varargs</span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; (1, 2, 3)</span></span></code></pre>

<p>
	من الممكن استخدام المعاملات المُسماة لاستقبال عدد غير محدد من المعاملات أيضا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">keyword_args</span></span><span class="hljs-params"><span class="pun">(**</span><span class="pln">kwargs</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> kwargs

keyword_args</span><span class="pun">(</span><span class="pln">big</span><span class="pun">=</span><span class="hljs-string"><span class="str">"foot"</span></span><span class="pun">,</span><span class="pln"> loch</span><span class="pun">=</span><span class="hljs-string"><span class="str">"ness"</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; {"big": "foot", "loch": "ness"}</span></span></code></pre>

<p>
	كما نستطيع دمج الطريقتين في نفس الدالة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">all_the_args</span></span><span class="hljs-params"><span class="pun">(*</span><span class="pln">args</span><span class="pun">,</span><span class="pln"> </span><span class="pun">**</span><span class="pln">kwargs</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">args</span><span class="pun">)</span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">kwargs</span><span class="pun">)</span><span class="pln">
all_the_args</span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> a</span><span class="pun">=</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> b</span><span class="pun">=</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com"># =&gt;  </span></span><span class="pln">
    </span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="hljs-string"><span class="str">"a"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"b"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">}</span></code></pre>

<p>
	توجد طريقة أخرى لاستدعاء الدوال باستخدام args/kwargs وذلك عندما تكون المعطيات من النوع tuple أو قاموس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs perl"><span class="pln">args </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">)</span><span class="pln">
kwargs </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-string"><span class="str">"a"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"b"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">}</span><span class="pln">
all_the_args</span><span class="pun">(</span><span class="hljs-variable"><span class="pun">*</span><span class="pln">args</span></span><span class="pun">)</span><span class="pln">            </span><span class="hljs-comment"><span class="com"># equivalent to foo(1, 2, 3, 4)</span></span><span class="pln">
all_the_args</span><span class="pun">(</span><span class="hljs-variable"><span class="pun">**</span></span><span class="pln">kwargs</span><span class="pun">)</span><span class="pln">         </span><span class="hljs-comment"><span class="com"># equivalent to foo(a=3, b=4)</span></span><span class="pln">
all_the_args</span><span class="pun">(</span><span class="hljs-variable"><span class="pun">*</span><span class="pln">args</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-variable"><span class="pun">**</span></span><span class="pln">kwargs</span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># equivalent to foo(1, 2, 3, 4, a=3, b=4)</span></span></code></pre>

<p>
	يمكن أيضا إرجاع نتيجة من قيم متعددة على شكل tuple:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">swap</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> y</span><span class="pun">,</span><span class="pln"> x  

x </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">
y </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
x</span><span class="pun">,</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> swap</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">     </span><span class="hljs-comment"><span class="com"># =&gt; x = 2, y = 1</span></span></code></pre>

<p>
	يختلف المتغيّر في نطاق scope الدالة عن المتغيّرات العامة Global:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">set_x</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">num</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    x </span><span class="pun">=</span><span class="pln"> num    </span><span class="hljs-comment"><span class="com"># =&gt; 43</span></span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 43</span></span></code></pre>

<p>
	تُستخدَم الكلمة المفتاحية global لتعريف متغيّر عام من داخل الدالة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">set_global_x</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">num</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">global</span></span><span class="pln"> x
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 5</span></span><span class="pln">
    x </span><span class="pun">=</span><span class="pln"> num    </span><span class="hljs-comment"><span class="com"># هذا المتغير يمثل المتغير على النطاق العام وقيمته الان 6</span></span><span class="pln">
    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 6</span></span><span class="pln">

set_x</span><span class="pun">(</span><span class="hljs-number"><span class="lit">43</span></span><span class="pun">)</span><span class="pln">
set_global_x</span><span class="pun">(</span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">)</span></code></pre>

<p>
	تعدّ الدوال في بايثون كائنات من الفئة الأولى:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">create_adder</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">adder</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> adder

add_10 </span><span class="pun">=</span><span class="pln"> create_adder</span><span class="pun">(</span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">)</span><span class="pln">
add_10</span><span class="pun">(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">   </span><span class="hljs-comment"><span class="com"># =&gt; 13</span></span></code></pre>

<p>
	كما يمكنك تعريف دوال غير مسمّاة Anonymous functions:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">lambda</span></span><span class="pln"> x</span><span class="pun">:</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)(</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">)</span><span class="pln">                  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span><span class="pln">
</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">lambda</span></span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">:</span><span class="pln"> x </span><span class="pun">**</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> y </span><span class="pun">**</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">)(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; 5</span></span></code></pre>

<p>
	ويمكنك تمرير الدالة معاملا لدالة أخرى:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs cpp"><span class="hljs-built_in"><span class="pln">list</span></span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">map</span></span><span class="pun">(</span><span class="pln">add_10</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]))</span><span class="pln">          </span><span class="hljs-preprocessor"><span class="com"># =&gt; [11, 12, 13]</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">list</span></span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">map</span></span><span class="pun">(</span><span class="pln">max</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">]))</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; [4, 2, 3]</span></span><span class="pln">

</span><span class="hljs-built_in"><span class="pln">list</span></span><span class="pun">(</span><span class="pln">filter</span><span class="pun">(</span><span class="kwd">lambda</span><span class="pln"> x</span><span class="pun">:</span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">]))</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; [6, 7]</span></span></code></pre>

<p>
	تستطيع استخدام مبدأ “تفهيم القائمة” للحصول على نفس نتيجة الدوال map و filter:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs bash"><span class="pln"> </span><span class="pun">[</span><span class="pln">add_10</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> i </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">]]</span><span class="pln">         </span><span class="hljs-comment"><span class="com"># =&gt; [11, 12, 13]</span></span><span class="pln">
</span><span class="pun">[</span><span class="pln">x </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">]</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> x </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">]</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; [6, 7]</span></span></code></pre>

<p>
	تستطيع استخدام مبدأ “تفيهم القاموس” و “تفهيم المجموعة” كذلك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs lua"><span class="pun">{</span><span class="pln">x </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'abcddeef'</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'abc'</span></span><span class="pun">}</span><span class="pln">  </span><span class="com"># =&gt; {</span><span class="hljs-string"><span class="com">'d'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'e'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'f'</span></span><span class="com">}</span><span class="pln">
</span><span class="pun">{</span><span class="pln">x</span><span class="pun">:</span><span class="pln"> x</span><span class="pun">**</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> range</span><span class="pun">(</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">)}</span><span class="pln">  </span><span class="com"># =&gt; {</span><span class="hljs-number"><span class="com">0</span></span><span class="com">: </span><span class="hljs-number"><span class="com">0</span></span><span class="com">, </span><span class="hljs-number"><span class="com">1</span></span><span class="com">: </span><span class="hljs-number"><span class="com">1</span></span><span class="com">, </span><span class="hljs-number"><span class="com">2</span></span><span class="com">: </span><span class="hljs-number"><span class="com">4</span></span><span class="com">, </span><span class="hljs-number"><span class="com">3</span></span><span class="com">: </span><span class="hljs-number"><span class="com">9</span></span><span class="com">, </span><span class="hljs-number"><span class="com">4</span></span><span class="com">: </span><span class="hljs-number"><span class="com">16</span></span><span class="com">}</span></code></pre>

<h2 id="الوحدات-modules">
	الوحدات Modules
</h2>

<p>
	الوحدات في بايثون عبارة عن ملفات بايثون عادية. تستطيع أن تكتب الوحدة الخاصة بك وتستوردها في الشفرة البرمجة الخاصة بمشروعك. اسم الوحدة سيكون نفس اسم الملف الذي أنشأته لهذا الغرض.<br>
	تُستورَد الوحدات بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs lua"><span class="kwd">import</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">math</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="kwd">print</span></span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">math</span></span><span class="pun">.</span><span class="pln">sqrt</span><span class="pun">(</span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">))</span><span class="pln">  </span><span class="com"># =&gt; </span><span class="hljs-number"><span class="com">4.0</span></span></code></pre>

<p>
	تستطيع الحصول على دوال محددة من الوحدات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs glsl"><span class="kwd">from</span><span class="pln"> math </span><span class="kwd">import</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">ceil</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">floor</span></span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">ceil</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">3.7</span></span><span class="pun">))</span><span class="pln">   </span><span class="hljs-preprocessor"><span class="com"># =&gt; 4.0</span></span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">floor</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">3.7</span></span><span class="pun">))</span><span class="pln">  </span><span class="hljs-preprocessor"><span class="com"># =&gt; 3.0</span></span></code></pre>

<p>
	تستطيع استيراد جميع الدوالّ من الوحدة دفعة واحدة ولكن هذا الأمر غير منصوح به:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="hljs-keyword"><span class="kwd">from</span></span><span class="pln"> math </span><span class="hljs-keyword"><span class="kwd">import</span></span><span class="pln"> </span><span class="pun">*</span></code></pre>

<p>
	تستطيع اختصار أسماء الوحدات عند استيرادها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs livecodeserver"><span class="kwd">import</span><span class="pln"> math </span><span class="hljs-keyword"><span class="kwd">as</span></span><span class="pln"> m
math</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">sqrt</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> m</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">sqrt</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">)</span><span class="pln">  </span><span class="hljs-comment"><span class="com"># =&gt; True</span></span></code></pre>

<p>
	تُستخدَم الدالة المضمنة dir لمعرفة مكان ملف الوحدة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs lua"><span class="kwd">import</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">math</span></span><span class="pln">
dir</span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">math</span></span><span class="pun">)</span></code></pre>

<p>
	إذا كان لديك ملف بايثون باسم math في نفس المجلد الذي يوجد به ملف العمل الخاص بك، فإن الملف math هو الذي سيُحمَّل ويُستورد بدلا من الوحدة التلقائية المضمنة في البايثون باسم math ذلك لأن الأولوية في حال تشابه الأسماء هي للملفات في مجلد العمل المحلي أو الحالي.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h2 id="الأصناف-classes">
	الأصناف Classes
</h2>

<p>
	نستخدم كلمة class لتعريف صنف:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ruby"><span class="hljs-class"><span class="hljs-keyword"><span class="kwd">class</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Human</span></span><span class="pun">:</span></span></code></pre>

<p>
	لتعريف خاصية للصنف (هذه الخاصية تكون مُشاركة بين كل العناصر المتولدة من هذا الصنف):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs ini"><span class="hljs-setting"><span class="pln">species </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"H. sapiens"</span></span></span></span></code></pre>

<p>
	<strong>init</strong> هو المشيّدات Constructor الأساسي ويُستدعى عند توليد عنصر من الصنف. التسطير السفلي المكرر مرتين قبل كلمة init وبعدها يدل على أن هذا الكائن أو الخاصية يستخدمه بايثون ولا يجب علينا استخدامها مباشرة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">__init__</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-comment"><span class="com"># إعطاء قيمة المعطى للخاصية الموجودة في الصنف</span></span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> name

        </span><span class="hljs-comment"><span class="com"># قيمة مبدئية</span></span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">_age </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span></code></pre>

<p>
	الدالة say هي تابع عيّنة Instance method، أي أن لكل كائن نسخة خاصة به منها. تأخذ هذه التوابع أن self في أول معامل يُمرّر لها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">say</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">,</span><span class="pln"> msg</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-string"><span class="str">"{name}: {message}"</span></span><span class="pun">.</span><span class="pln">format</span><span class="pun">(</span><span class="pln">name</span><span class="pun">=</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> message</span><span class="pun">=</span><span class="pln">msg</span><span class="pun">))</span><span class="pln">

        </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sing</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'yo... yo... microphone check... one two... one two...'</span></span></code></pre>

<p>
	يمكن أيضا تعريف تابع متشارك بين كل كائنات الصنف:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-decorator"><span class="lit">@classmethod</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">get_species</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">cls</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> cls</span><span class="pun">.</span><span class="pln">species</span></code></pre>

<p>
	نستطيع كذلك تعريف تابع ساكن يُستدعى دون الحاجة لإنشاء كائن من الصنف:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-decorator"><span class="lit">@staticmethod</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">grunt</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"*grunt*"</span></span></code></pre>

<p>
	يحوّل التعليمة property@ دالة إلى خاصيّة للقراءة فقط لها نفس اسم الدالة، لتؤدّي بالتالي وظيفة المسترجعات Getters.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-decorator"><span class="lit">@property</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">age</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">_age</span></code></pre>

<pre><code>يمكننا جعل الخاصية قابلة للتعيين لتصبح الدالة تعمل معدّلا Setter:
</code></pre>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-decorator"><span class="lit">@age</span><span class="pun">.</span><span class="pln">setter</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">age</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">,</span><span class="pln"> age</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">_age </span><span class="pun">=</span><span class="pln"> age</span></code></pre>

<p>
	كما يمكننا السماح بحذفها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs python"><span class="pln">    </span><span class="hljs-decorator"><span class="lit">@age</span><span class="pun">.</span><span class="pln">deleter</span></span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">def</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">age</span></span><span class="hljs-params"><span class="pun">(</span><span class="kwd">self</span><span class="pun">)</span></span><span class="pun">:</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">del</span></span><span class="pln"> </span><span class="kwd">self</span><span class="pun">.</span><span class="pln">_age</span></code></pre>

<p>
	يقوم مُفسر البايثون بتنفيذ كافة اشيفرة البرمجية في ملف الوحدة الذي يقرأه، ومن خلال الخاصية <strong>name</strong> نتأكد من أن كتلة الشفرة البرمجية التي في جملة الشرط ستُنفَّذ في حال كانت الوحدة هي البرنامج الرئيسي المُنفذ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs perl"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> __name_</span><span class="hljs-number"><span class="pln">_</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-string"><span class="str">'__main__'</span></span><span class="pun">:</span><span class="pln">
    i </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Human</span><span class="pun">(</span><span class="pln">name</span><span class="pun">=</span><span class="hljs-string"><span class="str">"Ian"</span></span><span class="pun">)</span><span class="pln">
    i</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">say</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"hi"</span></span><span class="pun">)</span><span class="pln">               </span><span class="hljs-comment"><span class="com"># "Ian: hi"</span></span><span class="pln">
    j </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Human</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Joel"</span></span><span class="pun">)</span><span class="pln">
    j</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">say</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"hello"</span></span><span class="pun">)</span><span class="pln">            </span><span class="hljs-comment"><span class="com"># "Joel: hello"</span></span><span class="pln">

    </span><span class="hljs-comment"><span class="com"># استدعاء دالة الفئة</span></span><span class="pln">
    i</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">say</span></span><span class="pun">(</span><span class="pln">i</span><span class="pun">.</span><span class="pln">get_species</span><span class="pun">())</span><span class="pln">          </span><span class="hljs-comment"><span class="com"># "Ian: H. sapiens"</span></span><span class="pln">

 </span><span class="hljs-comment"><span class="com"># تغيير الخاصية المشتركة</span></span><span class="pln">
    </span><span class="typ">Human</span><span class="pun">.</span><span class="pln">species </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"H. neanderthalensis"</span></span><span class="pln">
    i</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">say</span></span><span class="pun">(</span><span class="pln">i</span><span class="pun">.</span><span class="pln">get_species</span><span class="pun">())</span><span class="pln">          </span><span class="hljs-comment"><span class="com"># =&gt; "Ian: H. neanderthalensis"</span></span><span class="pln">
    j</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">say</span></span><span class="pun">(</span><span class="pln">j</span><span class="pun">.</span><span class="pln">get_species</span><span class="pun">())</span><span class="pln">          </span><span class="hljs-comment"><span class="com"># =&gt; "Joel: H. neanderthalensis"</span></span><span class="pln">

    </span><span class="hljs-comment"><span class="com"># استدعاء الدالة الساكنة</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="typ">Human</span><span class="pun">.</span><span class="pln">grunt</span><span class="pun">())</span><span class="pln">            </span><span class="hljs-comment"><span class="com"># =&gt; "*grunt*"</span></span></code></pre>

<p>
	لا تستطيع استدعاء الدالة الساكنة من خلال العنصر المتولد i لأن استدعاءها بهذه الطريقة سيضيف self كمعامل لها مما سينتج عنه خطأ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_3263_9" style=""><code class="hljs avrasm"><span class="pln">    </span><span class="kwd">print</span><span class="pun">(</span><span class="pln">i</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">grunt</span></span><span class="pun">())</span><span class="pln">                </span><span class="hljs-preprocessor"><span class="com"># =&gt; TypeError: grunt() takes 0 positional arguments but 1 was given</span></span><span class="pln">

    i</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">age</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">42</span></span><span class="pln">
    i</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">say</span></span><span class="pun">(</span><span class="pln">i</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">age</span></span><span class="pun">)</span><span class="pln">                 </span><span class="hljs-preprocessor"><span class="com"># =&gt; "Ian: 42"</span></span><span class="pln">
    j</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">say</span></span><span class="pun">(</span><span class="pln">j</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">age</span></span><span class="pun">)</span><span class="pln">                 </span><span class="hljs-preprocessor"><span class="com"># =&gt; "Joel: 0"</span></span><span class="pln">
    </span><span class="kwd">del</span><span class="pln"> i</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">age</span></span><span class="pln">
    </span><span class="hljs-preprocessor"><span class="com"># i.age                         # =&gt; this would raise an AttributeError</span></span></code></pre>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://learnxinyminutes.com/docs/python3/" rel="external nofollow">Learn X in Y minutes Where X=Python3</a>
</p>

<h2>
	اقرأ أيضا:
</h2>

<ul>
	<li>
		<p>
			<a href="https://academy.hsoub.com/python/" rel="">تعلم لغة بايثون</a>
		</p>
	</li>
</ul>
]]></description><guid isPermaLink="false">535</guid><pubDate>Tue, 19 Sep 2017 13:05:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r484/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_05/main.png.aa3e4d55c018616a479309159c416e64.png" /></p>

<h2 id="تمهيد">
	تمهيد
</h2>

<p>
	بايثون هي أداةٌ رائعةٌ لمعالجة البيانات. ومن المحتمل أنَّ البرامج التي تكتبها ستتضمن قراءة البيانات أو كتابتها أو تعديلها، ولهذا السبب ستستفيد جدًا من قدرة بايثون على التعامل مع مختلف صيغ الملفات التي تُخزِّن أصنافًا متنوعةً من البيانات.
</p>

<p style="text-align: center;">
	<img alt="main.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23249" data-unique="e0cww0ha0" src="https://academy.hsoub.com/uploads/monthly_2017_05/main.png.df24c3224f80f5a2993bc409bae13473.png"></p>

<p>
	<br>
	ليكن لديك -على سبيل المثال- برنامج بايثون الذي يتحقق من امتيازات الوصول لقائمة من المستخدمين؛ فيكون من المرجح في هذه الحالة أن تُخزَّن قائمة المستخدمين في ملفٍ نصيٍ بسيط. أو ربما لم تكن تتعامل مع النصوص، وإنما مهمة برنامجك هي التحليل الاقتصادي؛ ومن المرجح أنَّك ستأخذ الأرقام التي ستجري عملياتك عليها من ورقة عمل في أحد البرامج مثل Excel أو Calc. وأرى أنَّه من المرجح أن يتطلب تطبيقك إدخال أو إخراج البيانات بغض النظر عن الهدف منه.<br>
	سيشرح هذا الدرس باختصار بعض الصيغ التي تستطيع بايثون التعامل معها. سنستعرض أولًا لمحة عن بعض أنواع الملفات، ثم سنكمل الدرس بكيفية فتح وقراءة الملفات والكتابة إليها في بايثون 3.<br>
	يجب أن تُصبح قادرًا بعد نهاية هذا الدرس على التعامل مع أيّة ملفات نصية في بايثون.
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<p>
	ستحتاج في هذا الدرس إلى توافر بايثون 3 على حاسوبك بالإضافة إلى بيئة برمجية محلية مضبوطة عليه.<br>
	لغة بايثون هي لغة متكاملة وتستطيع التعامل بسهولة (نسبيًا) مع مختلف صيغ الملفات، بما فيها الصيغ الآتية:
</p>

<ul>
<li>
		<code>txt</code>: ملف نصي بسيط يُخزِّن البيانات التي تُمثِّل المحارف (أو السلاسل النصية) ولا تضم أيّة بيانات وصفية.
	</li>
	<li>
		<code>CSV</code>: ملف يحتوي قيمًا مفصولٌ بينها بفاصلة (أو غيرها من المحارف التي تستعمل لفصل الحقول) لتنظيم بُنية هيكلية للبيانات، مما يسمح بحفظ المعلومات بصيغةٍ مجدولة.
	</li>
	<li>
		<code>HTML</code>: لغة توصيفية تُخزِّن البيانات الهيكلية وتستعمل عادةً لبناء صفحات الويب.
	</li>
	<li>
		<code>JSON</code>: صيغة بسيطة وعملية، مما يجعلها أشهر الصيغ المستعملة لتخزين ونقل البيانات.
	</li>
</ul>
<p>
	سنُركِّز في هذا الدرس على صيغة txt.
</p>

<h2 id="الخطوة-الأولى-إنشاء-ملف-نصي">
	الخطوة الأولى: إنشاء ملف نصي
</h2>

<p>
	قبل أن نبدأ بإنشاء برامج بايثون، سنحتاج إلى ملفٍ نصيٍ لنعمل عليه؛ لذا افتح محررك النصي المُفضَّل وأنشِئ ملف txt جديد واجعل اسمه <code>days.txt</code>.<br>
	أدخِل في الملف الجديد بضعة أسطر، ولتكن مثلًا أيام الأسبوع:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<span class="typ">Monday</span><span class="pln">
</span><span class="typ">Tuesday</span><span class="pln">
</span><span class="typ">Wednesday</span><span class="pln">
</span><span class="typ">Thursday</span><span class="pln">
</span><span class="typ">Friday</span><span class="pln">
</span><span class="typ">Saturday</span><span class="pln">
</span><span class="typ">Sunday</span></pre>

<p>
	احفظ الآن الملف وانتبه إلى مكان تخزينه. فمثلًا، كان اسم المستخدم في نظامي هو sammy وحفظتُ الملف في المسار <code>‎/users/sammy/days.txt</code>. هذا المسار مهمٌ جدًا في الخطوات القادمة، لأننا سنحاول فتحه باستخدام بايثون.<br>
	بعد أن حصلنا على ملفٍ نصيٍ لنعمل عليه، فلنبدأ عملية كتابة البرنامج.
</p>

<h2 id="الخطوة-الثانية-فتح-الملف">
	الخطوة الثانية: فتح الملف
</h2>

<p>
	قبل أن نبدأ بكتابة البرنامج علينا إنشاء ملف لحفظه، لذا سنُنشِئ الملف <code>files.py</code> في المحرر النصي. وللتبسيط سنضعه في نفس المجلد الذي يحتوي الملف <code>days.txt</code>: أي <code>‎/users/sammy/‎</code>.<br>
	علينا لنفتح ملف في بايثون أن نعثر على طريقةٍ لربط الملف الموجود على القرص الصلب بأحد المتغيرات. تدعى هذه العملية «بفتح» الملف. سنبدأ بإخبار بايثون أين يوجد الملف، ويُشار عادةً إلى مكان تخزين الملف بالمصطلح «المسار» (path). ولكي تستطيع لغة بايثون أن تفتح لك الملف، فستحتاج إلى مساره. ومسار الملف <code>days.txt</code> كما ذكرنا في القسم السابق هو <code>‎/users/sammy/days.txt</code>، وسنُنشِئ متغيرًا لتخزين هذا المسار باسم path في ملف <code>files.py</code> وضبط قيمته إلى مسار الملف <code>days.txt</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs bash"><span class="pln">path </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/users/sammy/days.txt'</span></span></code></pre>

<p>
	سنستخدم بعد ذلك الدالة <code>open()‎</code> الموجودة في بايثون لفتح الملف <code>days.txt</code>. تتطلب الدالة <code>open()‎</code> تمرير مسار الملف كأوّل وسيط (argument) لها، لكنها تقبل عددًا كبيرًا من المعاملات (parameters)؛ لكن أهم معامل منها هو المعامل الاختياري الذي يُحدِّد «نمط» فتح الملف (opening mode)، فالنمط هو سلسلةٌ نصيةٌ تُحدِّد ماذا تستطيع أن تفعله مع الملف. هذه قائمة ببعض الأنماط المتوافرة:
</p>

<ul>
<li>
		<code>'r'</code>: فتح الملف للقراءة
	</li>
	<li>
		<code>'w'</code>: فتح الملف للكتابة
	</li>
	<li>
		<code>'x'</code>: إنشاء الملف وفتحه للكتابة
	</li>
	<li>
		<code>'a'</code>: الإضافة إلى نهاية الملف
	</li>
	<li>
		<code>'r+‎'</code>: فتح الملف للقراءة والكتابة معًا
	</li>
</ul>
<p>
	أريد أن أقرأ من الملف فقط في المثال الآتي، لذا سأستخدم النمط <code>r</code>. سنستعمل الدالة <code>open()‎</code> لفتح الملف <code>days.txt</code> وإسناده إلى المتغير <code>days_file</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs fsharp"><span class="pln">days_file </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">open</span></span><span class="pun">(</span><span class="pln">path</span><span class="pun">,</span><span class="hljs-attribute"><span class="str">'r</span></span><span class="str">'</span><span class="pun">)</span></code></pre>

<p>
	نستطيع الآن بعد فتح الملف أن نقرأ منه، وهذا ما سنناقشه في القسم التالي.
</p>

<h2 id="الخطوة-الثالثة-قراءة-الملف">
	الخطوة الثالثة: قراءة الملف
</h2>

<p>
	نستطيع الآن بعد فتح الملف أن نُجري عمليات عليه (مثلًا: أن نقرأ منه) عبر المتغير الذي أسندناه إليه. توفِّر بايثون ثلاثة عمليات متعلقة بقراءة المعلومات من ملف، وسأريك إياها كلها في أمثلةٍ لتفهم كيف تعمل.<br>
	أوّل عملية هي <code>‎&lt;file&gt;.read()‎</code> التي تُعيد كامل محتويات الملف كسلسلةٍ نصيةٍ وحيدة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs livecodeserver"><span class="pln">days_file</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">read</span></span><span class="pun">()</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs tex"><span class="str">'Monday</span><span class="hljs-command"><span class="str">\nTuesday</span></span><span class="hljs-command"><span class="str">\nWednesday</span></span><span class="hljs-command"><span class="str">\nThursday</span></span><span class="hljs-command"><span class="str">\nFriday</span></span><span class="hljs-command"><span class="str">\nSaturday</span></span><span class="hljs-command"><span class="str">\nSunday</span></span><span class="hljs-command"><span class="str">\n</span></span><span class="str">'</span></code></pre>

<p>
	العملية الثانية <code>‎&lt;file&gt;.readline()‎</code> تُعيد السطر التالي من الملف، حيث تُعيد السطر بأكمله بالإضافة إلى محرف السطر الجديد. ببساطة: هذه العملية ستؤدي إلى قراءة الملف سطرًا بسطر.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs perl"><span class="pln">days_file</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">readline</span></span><span class="pun">()</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs bash"><span class="hljs-string"><span class="str">'Monday\n'</span></span></code></pre>

<p>
	وبعد أن تقرأ سطرًا عبر <code>readline()‎</code> فسيتم الانتقال إلى السطر الذي يليه، فلو استدعيتَ هذه العملية مرةً أخرى، فستُعيد السطر الذي يلي السطر السابق في الملف كما في الناتج الآتي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs bash"><span class="hljs-string"><span class="str">'Tuesday\n'</span></span></code></pre>

<p>
	آخر عملية هي <code>‎&lt;file&gt;.readlines()‎</code> التي تُعيد قائمةً (list) بجميع الأسطر الموجودة في الملف، حيث يُمثَّل كل سطر في الملف بعنصرٍ في القائمة.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs avrasm"><span class="pln">days_file</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">readlines</span></span><span class="pun">()</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs json"><span class="pun">[</span><span class="str">'Monday\n'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Tuesday\n'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Wednesday\n'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Thursday\n'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Friday\n'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Saturday\n'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Sunday\n'</span><span class="pun">]</span></code></pre>

<p>
	أحد الأمور التي يجب عليك أن تبقيها في ذهنك عند القراءة من الملفات هو عدم قدرتك على إعادة قراءة الملف بعد استخدام إحدى عمليات القراءة السابقة. فمثلًا لو استدعيتَ <code>days_file.read()‎</code> متبوعةً بالدالة <code>days_file.readlines()‎</code> فستُعيد العملية الثانية سلسلةً نصيةً فارغةً، وبالتالي ستحتاج إلى إنشاء متغير جديد مرتبط بالملف في كل مرة ترغب فيها بقراءته.<br>
	بعد أن تعلمنا طرائق القراءة من ملف فحان الوقت الآن إلى تعلم كيفية الكتابة إلى ملفٍ جديد.
</p>

<h2 id="الخطوة-الرابعة-الكتابة-إلى-ملف">
	الخطوة الرابعة: الكتابة إلى ملف
</h2>

<p>
	سنكتب الآن السلسلة النصية «Days of the Week» إلى ملفٍ جديد متبوعةً بأيام الأسبوع. سنُنشِئ بادئ الأمر المتغير <code>title</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs vhdl"><span class="pln">title </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'Days</span></span><span class="str"> </span><span class="hljs-keyword"><span class="str">of</span></span><span class="str"> the Week\n'</span></code></pre>

<p>
	سنحتاج أيضًا إلى تخزين أيام الأسبوع في متغيرٍ الذي سنسميه <code>days</code>. ولتبسيط ذلك سنضع نفس الشيفرة التي استخدمناها في القسم أعلاه؛ حيث سنفتح الملف بنمط القراءة ثم نقرأه ونُخزِّن ناتج عملية القراءة في المتغير الجديد <code>days</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs livecodeserver"><span class="pln">path </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/users/sammy/days.txt'</span></span><span class="pln">
days_file </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">open</span></span><span class="pun">(</span><span class="pln">path</span><span class="pun">,</span><span class="hljs-string"><span class="str">'r'</span></span><span class="pun">)</span><span class="pln">
days </span><span class="pun">=</span><span class="pln"> days_file</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">read</span></span><span class="pun">()</span></code></pre>

<p>
	أصبح لدينا الآن متغيران أولهما للعنوان والآخر لأيام الأسبوع، لذا نستطيع البدء بالكتابة إلى الملف الجديد. لكننا سنحتاج أولًا إلى تحديد مسار الملف، وسنستخدم المجلد <code>‎/users/sammy</code> مجددًا، ثم سنُحدِّد اسم الملف الجديد الذي نود إنشاءه؛ لذا سيكون المسار النهائي هو <code>‎/users/sammy/new_days.txt</code>، وسنضع هذا المسار في المتغير <code>new_path</code>، ثم سنفتح الملف الجديد بنمط الكتابة، وذلك باستخدام الدالة <code>open()‎</code> مع النمط <code>w</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs livecodeserver"><span class="pln">new_path </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/users/sammy/new_days.txt'</span></span><span class="pln">
new_days </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">open</span></span><span class="pun">(</span><span class="pln">new_path</span><span class="pun">,</span><span class="hljs-string"><span class="str">'w'</span></span><span class="pun">)</span></code></pre>

<p>
	من المهم أن تعلم أنَّه لو كان الملف <code>new_days.txt</code> موجودًا من قبل «فتح» الملف، فستُحذف جميع محتوياته السابق، لذا توخى الحذر عند استخدام النمط <code>w</code>.<br>
	بعد أن فتحنا الملف للقراءة، سنستطيع الآن أن نكتب البيانات فيه وذلك باستخدام الدالة <code>‎&lt;file&gt;.write()‎</code>. تأخذ دالة الكتابة معاملًا وحيدًا الذي يجب أن يكون سلسلةً نصية وتكتبه إلى الملف. إذا أردتَ أن تبدأ سطرًا جديدًا في الملف، فعليك توفير محرف بداية السطر (newline) يدويًا.<br>
	سنكتب أولًا العنوان إلى الملف متبوعًا بأيام الأسبوع. ولنضف أيضًا بعض تعبيرات <code>print</code> لنعرف ما الذي سيُكتَب إلى الملف، وهذا أمرٌ مستحسنٌ لكي تتتبع مسار تنفيذ برنامجك.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs perl"><span class="pln">new_days</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">write</span></span><span class="pun">(</span><span class="pln">title</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">title</span><span class="pun">)</span><span class="pln">

new_days</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">write</span></span><span class="pun">(</span><span class="pln">days</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">days</span><span class="pun">)</span></code></pre>

<p>
	بعد أن تنتهي من التعامل مع ملفٍ ما، فاحرص على أن تغلقه، وهذا ما سنفعله في الخطوة الأخيرة.
</p>

<h2 id="الخطوة-الخامسة-إغلاق-الملف">
	الخطوة الخامسة: إغلاق الملف
</h2>

<p>
	عملية إغلاق الملف تعني إغلاق قناة التواصل بين الملف على القرص وبين المتغير الموجود في برنامجك. إغلاق الملفات يعني أنَّ البرامج الأخرى ستتمكن من الوصول إلى الملف وستُبقي بياناتك بأمان؛ لذا احرص دومًا على إغلاق الملفات التي تفتحها؛ وهذا ما سنفعله في الأسطر الآتية عبر استعمال الدالة <code>‎&lt;file&gt;.close()‎</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs livecodeserver"><span class="pln">days_file</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">close</span></span><span class="pun">()</span><span class="pln">
new_days</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">close</span></span><span class="pun">()</span></code></pre>

<p>
	أنهينا عملية معالجة الملفات في بايثون، ولننظر الآن إلى الشيفرة النهائية.
</p>

<h2 id="الخطوة-السادسة-التحقق-من-سلامة-الشيفرة">
	الخطوة السادسة: التحقق من سلامة الشيفرة
</h2>

<p>
	قبل أن تجرِّب الشيفرة تأكَّد أنَّ كل شيء يبدو سليمًا. يجب أن تكون الشيفرة النهائية شبيهةً بما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs perl"><span class="pln">path </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/users/sammy/days.txt'</span></span><span class="pln">
days_file </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">open</span></span><span class="pun">(</span><span class="pln">path</span><span class="pun">,</span><span class="hljs-string"><span class="str">'r'</span></span><span class="pun">)</span><span class="pln">
days </span><span class="pun">=</span><span class="pln"> days_file</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">read</span></span><span class="pun">()</span><span class="pln">


new_path </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'/users/sammy/new_days.txt'</span></span><span class="pln">
new_days </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">open</span></span><span class="pun">(</span><span class="pln">new_path</span><span class="pun">,</span><span class="hljs-string"><span class="str">'w'</span></span><span class="pun">)</span><span class="pln">

title </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Days of the Week\n'</span></span><span class="pln">
new_days</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">write</span></span><span class="pun">(</span><span class="pln">title</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">title</span><span class="pun">)</span><span class="pln">

new_days</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">write</span></span><span class="pun">(</span><span class="pln">days</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">print</span></span><span class="pun">(</span><span class="pln">days</span><span class="pun">)</span><span class="pln">

days_file</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">close</span></span><span class="pun">()</span><span class="pln">
new_days</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">close</span></span><span class="pun">()</span></code></pre>

<p>
	بعد أن تحفظ الشيفرة في ملفها، فافتح الطرفية (terminal) وشغِّل سكربت بايثون:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs livecodeserver"><span class="pln">python </span><span class="hljs-built_in"><span class="pln">files</span></span><span class="pun">.</span><span class="pln">py</span></code></pre>

<p>
	يجب أن يبدو الناتج كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs mathematica"><span class="typ">Days</span><span class="pln"> of the </span><span class="typ">Week</span><span class="pln">

</span><span class="hljs-keyword"><span class="typ">Monday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Tuesday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Wednesday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Thursday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Friday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Saturday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Sunday</span></span></code></pre>

<p>
	لنتحقق الآن من أنَّ الشيفرة تعمل كما ينبغي لها وذلك بفتح الملف الجديد المُنشَأ <code>new_days.txt</code> فلو نُفِّذ البرنامج تنفيذًا صحيحًا فيجب أن تكون مخرجاته كالآتي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_8917_7" style="">
<code class="hljs mathematica"><span class="typ">Days</span><span class="pln"> of the </span><span class="typ">Week</span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Monday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Tuesday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Wednesday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Thursday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Friday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Saturday</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">Sunday</span></span></code></pre>

<p>
	إذا ظهر معك نفس الناتج السابق فأود أن أهنِّئك على إتمامك لهذا الدرس بنجاح.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا الدرس كيفية التعامل مع الملفات النصية البسيطة في بايثون 3 ومعالجتها. يمكنك الآن أن تفتح الملفات وتقرأها وتكتب إليها ثم تغلقها. جرِّب ما تعلمته في هذا الدرس على ملفات التي تريد معالجتها واسأل إن واجهتَ صعوبةً في ذلك.<br>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-handle-plain-text-files-in-python-3" rel="external nofollow">How To Handle Plain Text Files in Python 3 </a>لصاحبته Michelle Morales
</p>
]]></description><guid isPermaLink="false">484</guid><pubDate>Tue, 16 May 2017 06:41:39 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; 3 &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x628;&#x64A;&#x626;&#x629; &#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x641;&#x64A; &#x62A;&#x648;&#x632;&#x64A;&#x639;&#x629; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 16.04</title><link>https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r401/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d24753aaaca4_1604.jpg.11034f34f700a7fb55e954c4a07b59e9.jpg" /></p>

<p>
	سنشرح في هذا الدرس كيفية إعداد بيئة برمجية محليّة للغة بايثون 3 في توزيعة أوبنتو 16.04 أو دبيان 8.<br>
	بايثون هي لغةٌ سهلة القراءة للغاية ومتنوعة ومتعددة الاستخدامات، واسمها مستوحى من مجموعة كوميدية بريطانية باسم «Monty Python»، وكان أحد الأهداف الأساسية لفريق تطوير بايثون هو جعل اللغة مرحةً وسهلة الاستخدام، وإعدادها بسيطٌ، وطريقة كتابتها مباشرة وتعطيك تقريرًا مباشرًا عند حدوث أخطاء، وهي خيارٌ ممتازٌ للمبتدئين والوافدين الجدد على البرمجة. إصدار بايثون 3 هو الإصدار الحالي من اللغة ويُعتَبَر أنَّه مستقبل بايثون.<br>
	سيُرشِدُك هذا الدرس خطوةً بخطوة إلى كيفية تثبيت بايثون 3 على نظام لينكس المحلي عندك وذلك عبر سطر الأوامر، وصحيحٌ أنَّ هذا الدرس يشرح عملية التثبيت لتوزيعة أوبنتو 16.04 أو دبيان 8، إلا أنَّ المفاهيم الأساسية فيه تنطبق على أيّة توزيعة أخرى.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="30657" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d247544d4075_1604.jpg.6b68ee3f6503ccd19e6333c763c87e2e.jpg" rel=""><img alt="تثبيت بايثون على أوبنتو 1604.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="30657" data-unique="kdox1zyf8" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d247544ea79e_1604.thumb.jpg.299c3ae1e5a3f3c54421a061539d584b.jpg"></a>
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<p>
	يجب أن يكون لديك حاسوبٌ يعمل بتوزيعة أوبنتو 16.04 أو دبيان 8 (أو أيّ إصدار آخر من دبيان)، وأن تكون لديك امتيازات إدارية على النظام، بالإضافة إلى اتصالٍ بالإنترنت.
</p>

<h2 id="الخطوة-الأولى-إعداد-بايثون-3">
	الخطوة الأولى: إعداد بايثون 3
</h2>

<p>
	سنُثبِّت ونضبط بايثون عبر سطر الأوامر، والذي هو طريقةٌ غيرُ رسوميةٍ للتعامل مع الحاسوب، فبدلًا من الضغط على الأزرار فستكتب نصًا وتعطيه للحاسوب لينفذه وسيُظهِر لك ناتجًا نصيًا أيضًا. يمكن أن يساعدك سطر الأوامر على تعديل أو أتمتة مختلف المهام التي تنجزها على الحاسوب يوميًا، وهو أداةٌ أساسيةٌ لمطوري البرمجيات، وهنالك الكثير من الأوامر التي عليك تعلمها لكي تتمكن من الاستفادة منه. هنالك مقالات في أكاديمية حسوب (كدرس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>) ستعلمك أساسيات سطر الأوامر، وهنالك كتاب «<a href="http://sourceforge.net/projects/omlx/files/open%20books/TLCL/The_Linux_Command_Line-arabic-14.07.pdf/download" rel="external nofollow">سطر أوامر لينكس</a>» الذي يُعتَبر مرجعًا تفصيلًا لطريقة التعامل مع سطر الأوامر.<br>
	ستجد تطبيق «Terminal» (البرنامج الذي تستعمله للوصول إلى سطر الأوامر) بالضغط على أيقونة Dash في الزاوية العليا اليسرى من الشاشة ثم كتابة «terminal» في شريط البحث، ثم الضغط على أيقونة التطبيق التي ستظهر بعدئذٍ. يمكنك بشكلٍ بديلٍ أن تضغط على Ctrl+Alt+T في لوحة المفاتيح بنفس الوقت لتشغيل تطبيق Terminal.
</p>

<p style="text-align: center;">
	<img alt="1-UbuntuSetUp.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20502" data-unique="v2wvqiz4i" src="https://academy.hsoub.com/uploads/monthly_2016_12/1-UbuntuSetUp.png.3a4b29fa4ae5368ffdcb6d96d41e1751.png"></p>

<p>
	<br>
	أما على دبيان 8 فيمكنك فتح القائمة الموجودة أيضًا في الزاوية العليا اليسرى من الشاشة ثم البحث عن «terminal» في شريط البحث، ثم النقر على أيقونة التطبيق. يمكنك أيضًا أن تضغط على Ctrl+Alt+T في لوحة المفاتيح بنفس الوقت لتشغيل تطبيق Terminal.
</p>

<p style="text-align: center;">
	<img alt="2-DebianSetUp.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20503" data-unique="jiw8vn9hf" src="https://academy.hsoub.com/uploads/monthly_2016_12/2-DebianSetUp.png.3e2763dbfb49f4384babde913452728c.png"></p>

<p>
	تأتي توزيعات أوبنتو 16.04 ودبيان 8 وإصدارات دبيان الأخرى مثبتةً مسبقًا مع بايثون 3 وبايثون 2. للتأكد أنَّك تملك آخر الإصدارات منها فحدِّث نظامك باستخدام <code>apt-get</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8918_9">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get update
sudo apt</span><span class="pun">-</span><span class="pln">get </span><span class="pun">-</span><span class="pln">y upgrade</span></pre>

<p>
	الخيار <code>‎-y</code> يعني أنَّك توافق على تثبيت جميع الحزم القابلة للتحديث، لكن قد تحتاج إلى تأكيد ذلك عند تحديث النظام وذلك اعتمادًا على الحزم التي ستُحدَّث ونسخة نظامك.<br>
	بعد إكمال العملية، يمكننا التحقق من إصدار بايثون 3 المُثبّت في النظام بكتابة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8918_16">
<span class="pln">python3 </span><span class="pun">-</span><span class="pln">V</span></pre>

<p>
	ستحصل على مخرجات في نافذة الطرفية والتي ستريك ما هو إصدار بايثون المثبّت. قد يختلف الرقم بناءً على النسخة المثبتة في توزيعتك، لكن يجب أن يكون شبيهًا بما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8918_18">
<span class="typ">Python</span><span class="pln"> </span><span class="lit">3.5</span><span class="pun">.</span><span class="lit">2</span></pre>

<p>
	لإدارة الحزم البرمجية الخاصة ببايثون، فثبّت <code>pip</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_21">
<span class="pln">sudo apt-get install -y python3-pip</span></pre>

<p>
	الأداة <code>pip</code> هي أداةٌ تعمل مع لغة بايثون تُثَبِّت وتدير الحزم البرمجية التي قد نحتاج إلى استخدامها في تطوير مشاريعنا. يمكنك تثبيت حزم بايثون بكتابة الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_23">
<span class="pln">pip3 install package_name</span></pre>

<p>
	حيث عليك وضع اسم الحزمة أو المكتبة التابعة لبايثون مكان <code>package_name</code> مثل Django لتطوير الويب أو NumPy لإجراء حسابات علمية. لذا إن شئتَ تنزيل NumPy فيمكنك تنفيذ الأمر <code>pip3 install numpy</code>.<br>
	بعد أن انتهينا من ضبط بايثون وتثبيت pip، فيمكننا الآن إنشاء «بيئة وهمية» (virtual environment) لمشاريعنا.
</p>

<h2 id="الخطوة-الثانية-إعداد-بيئة-وهمية">
	الخطوة الثانية: إعداد بيئة وهمية
</h2>

<p>
	تُمكِّنك البيئات الوهمية من إنشاء مساحة معزولة في حاسوبك مخصصة لمشاريع بايثون، مما يعني أنَّ كل مشروع تعمل عليه يملك مجموعة من الاعتماديات (dependencies) والتي لن تؤثِّر على غيره من المشاريع.<br>
	يوفِّر لنا ضبط بيئةٍ برمجيةٍ تحكمًا أكبر بمشاريع بايثون وإمكانية التعامل مع إصداراتٍ مختلفةٍ من حزم بايثون. وهذا مهمٌ كثيرًا عندما تتعامل مع الحزم الخارجية.<br>
	يمكنك ضبط أيُّ عددٍ تشاء من البيئات الوهمية، وكل بيئة تُمثِّل مجلدًا في حاسوبك الذي فيه عددٌ من السكربتات.<br>
	علينا أولًا تثبيت وحدة (module) برمجية باسم <code>venv</code>، وهي جزءٌ من مكتبة بايثون3 القياسية، وذلك لكي نتمكن من استخدام الأمر <code>pyvenv</code> الذي سيُنشِئ البيئات الوهمية لنا. لنثبِّت <code>venv</code> على نظامنا بكتابة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_25">
<span class="pln">sudo apt-get install -y python3-venv</span></pre>

<p>
	سنتمكن الآن من إنشاء بيئات وهمية بعد إتمام التثبيت، لنختار ما هو المجلد الذي سنضع فيه بيئات بايثون، أو لننشِئ مجلدًا جديدًا باستخدام الأمر <code>mkdir</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_27">
<span class="pln">mkdir environments
cd environments</span></pre>

<p>
	بعد أن انتقلتَ إلى المجلد الذي تريد احتواء البيئات فيه، فتستطيع الآن إنشاء بيئة جديدة بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_29">
<span class="pln">pyvenv my_env</span></pre>

<p>
	سيُنشِئ الأمر <code>pyvenv</code> مجلدًا جديدًا فيه بعض الملفات التي يمكننا عرضها باستخدام الأمر <code>ls</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_31">
<span class="pln">ls my_env

bin include lib lib64 pyvenv.cfg share</span></pre>

<p>
	تعمل هذه الملفات مع بعضها لضمان أنَّ مشاريعك معزولةٌ عن بقية النظام، لكي لا تختلط ملفات النظام مع ملفات المشاريع. وهذا أمرٌ حسنٌ لإدارة الإصدارات ولضمان أنَّ كل مشروع يملك وصولًا إلى حزمٍ معيّنة التي يحتاج لها. تتوافر أيضًا Python Wheels والتي هي صيغة بناء حزمٍ لبايثون والتي يمكن أن تُسرِّع من تطوير البرامج بتقليل عدد المرات التي تحتاج فيها إلى بناءٍ (compile) للمشروع، وهي موجودةٌ في مجلد <code>share</code> في توزيعة أوبنتو 16.04 لكنها ستكون في دبيان 8 في أحد مجلدات <code>lib</code> وليس في <code>share</code>.<br>
	عليك تفعيل البيئة لاستخدامها، وذلك بكتابة الأمر الآتي الذي سيُنفِّذ سكربت التفعيل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_33">
<span class="pln">source my_env/bin/activate</span></pre>

<p>
	يجب أن تظهر الآن سابقةٌ (prefix) في المِحث (prompt) والتي هي اسم البيئة المستخدمة، وفي حالتنا هذه يكون اسمها <code>my_env</code>، وقد يكون مظهر المِحَث مختلفًا في توزيعة دبيان، وذلك اعتمادًا على الإصدار المستخدم؛ لكن يجب أن تشاهد اسم البيئة بين قوسين في بداية السطر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_35">
<span class="pln">(my_env) sammy@sammy:~/environments$</span></pre>

<p>
	السابقة ستسمح لك بمعرفة أنَّ البيئة <code>my_env</code> مفعلة حاليًا، وهذا يعني أننا سنستخدم إعدادات وحزم هذه البيئة عند إنشائنا لمشاريع جديدة.<br>
	ملاحظة: يمكنك داخل البيئة الوهمية أن تستخدم الأمر <code>python</code> بدلًا من <code>python3</code> والأمر <code>pip</code> بدلًا من <code>pip3</code> إن شئتَ. أما إذا كنتَ ستستخدم بايثون 3 خارج البيئة الوهمية، فيجب عليك حينها استخدام <code>python3</code> و <code>pip3</code> حصرًا.<br>
	يجب أن تكون بيئتك الوهمية جاهزةً للاستخدام بعد اتباعك للخطوات السابقة.
</p>

<h2 id="الخطوة-الثالثة-إنشاء-برنامج-بسيط">
	الخطوة الثالثة: إنشاء برنامج بسيط
</h2>

<p>
	بعد أن أكملنا ضبط بيئتنا الوهمية، لننشِئ برنامجًا بسيطًا يعرض العبارة «Hello World!‎»، وبهذا سنتحقق من أنَّ البيئة تعمل عملًا صحيحًا، وستصبح طريقة إنشاء برامج بايثون مألوفةً لديك إن كنتَ وافدًا جديدًا على اللغة.<br>
	علينا أولًا تشغيل محرر ملفات نصية لإنشاء ملف جديد، وليكن المحرر <code>nano</code> الذي يعمل من سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_37">
<span class="pln">(my_env) sammy@sammy:~/environments$ nano hello.py</span></pre>

<p>
	بعد فتح الملف في نافذة الطرفية، فاكتب البرنامج الخاص بنا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_41">
<span class="pln">print("Hello, World!")</span></pre>

<p>
	أغلق محرر nano بالضغط على Ctrl+x ثم اضغط على y عندما يسألك عن حفظ الملف.<br>
	بعد أن يُغلَق محرر nano وتعود إلى سطر الأوامر، فحاول تشغيل البرنامج:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_39">
<span class="pln">(my_env) sammy@sammy:~/environments$ python hello.py</span></pre>

<p>
	سيؤدي برنامج <code>hello.py</code> الذي أنشأتَه إلى طباعة الناتج الآتي في الطرفية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8918_43">
<span class="pln">Hello, World!</span></pre>

<p>
	للخروج من البيئة، فاكتب الأمر <code>deactivate</code> وستعود إلى مجلدك الأصلي.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	تهانينا! لقد ضبطتَ الآن بيئة تطوير للغة بايثون 3 في جهازك الذي يعمل بتوزيعة أوبنتو أو دبيان، حان الآن الوقت للتعمق بلغة بايثون وإنشاء برامج رائعة! بالتوفيق.<br>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-ubuntu-16-04" rel="external nofollow">How To Install Python 3 and Set Up a Local Programming Environment on Ubuntu 16.04</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقالة التالية: <a href="https://academy.hsoub.com/programming/python/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D9%84-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D9%83-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r715/" rel="">كيف تكتب أول برنامج لك</a>
	</li>
	<li>
		المقالة السابقة: <a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B9%D8%AA%D8%A8%D8%A7%D8%B1%D8%A7%D8%AA-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D9%85%D8%A7-%D8%A8%D9%8A%D9%86-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-2-%D9%88-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-3-r483/" rel="">اعتبارات عملية للاختيار ما بين بايثون 2 و بايثون 3</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">المرجع الشامل إلى تعلم لغة بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/15-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A8%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">كتاب البرمجة بلغة بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">401</guid><pubDate>Sun, 25 Dec 2016 09:36:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x648;&#x62D;&#x62F;&#x627;&#x62A; Modules &#x648;&#x627;&#x644;&#x62D;&#x632;&#x645; Packages &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-modules-%D9%88%D8%A7%D9%84%D8%AD%D8%B2%D9%85-packages-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r329/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/python-modules-packages.png.6228ddf50505939918d166066b5d43a7.png" /></p>
<div id="wmd-preview-section-33">
	<p style="text-align: center;">
		<img alt="python-modules-packages.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16262" data-unique="nkc1scdo4" src="https://academy.hsoub.com/uploads/monthly_2016_05/python-modules-packages.png.8c97fc2a41b7e53875ef20782510413e.png">
	</p>

	<h2 id="الوحدات-والحزم-في-بايثون">
		الوحدات Modules
	</h2>
</div>

<div id="wmd-preview-section-34">
	<p>
		الوحدة مجموعة من شيفرات بايثون (دوال، أصناف…) يُمكن إعادة استخدامها من طرف المبرمج بسهولة، و يُمكن كذلك أن تسمى بالمكتبة.
	</p>

	<p>
		يُمكن استيراد وحدة في برنامجك باستخدام كلمة <span style="font-family:courier new,courier,monospace;">import</span> مع إلحاق اسم الوحدة. في المثال التالي نستورد وحدة <span style="font-family:courier new,courier,monospace;">time</span> المُساعدة في التعامل مع الوقت في لغة بايثون، إذ توفّر دوالًا جاهزة تُمكننا من إجراء عدّة عمليات، كالحصول على الوقت الحالي، وكذلك التاريخ وغير ذلك.
	</p>
</div>

<div id="wmd-preview-section-35">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_8"><span class="pln"> import time</span></pre>

	<p>
		بعد أن قمنا باستيراد وحدة الوقت، يُمكننا الآن الوصول إلى العديد من الدوال والمتغيرات المتواجدة بهذه الوحدة. 
	</p>

	<p>
		يُمكننا مثلا الحصول على تاريخ اليوم والوقت باستدعاء الدالة <span style="font-family:courier new,courier,monospace;">asctime</span> كالتالي:
	</p>
</div>

<div id="wmd-preview-section-36">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_10"><span class="pln">&gt;&gt;&gt; import time
&gt;&gt;&gt; time.asctime()
'Fri Apr  8 19:47:35 2016'</span></pre>

	<p>
		يُمكننا كذلك الوصول إلى العديد من الدوال الأخرى المتعلّقة بالوقت، وهذه قائمة ببعض هذه الدوال: 
	</p>

	<ul>
		<li>
			<span style="font-family:courier new,courier,monospace;">time</span>: الحصول على عدد الثواني التي مرّت منذ يوم 1 يناير 1970، الذي يُسمى توقيت يونكس أو Unix Time.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-37">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_12"><span class="pln">&gt;&gt;&gt; time.time()
1460139948.733128</span></pre>

	<ul>
		<li>
			<span style="font-family:courier new,courier,monospace;">sleep</span>: الانتظار لعدد من الثواني قبل تنفيذ أمر معيّن. الأمر التالي سيوقف مُفسّر لغة بايثون عن العمل لخمس ثوان قبل استكمال العمل:
		</li>
	</ul>
</div>

<div id="wmd-preview-section-38">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_14"><span class="pln">&gt;&gt;&gt; time.sleep(5)</span></pre>

	<p>
		البرنامج التالي سيقوم بالانتظار لمدة ثانية واحدة قبل طباعة كلمة <span style="font-family:courier new,courier,monospace;">!Hello</span>:
	</p>
</div>

<div id="wmd-preview-section-39">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_16"><span class="pln">&gt;&gt;&gt; time.sleep(1); print 'Hello!'</span></pre>

	<p>
		يُمكننا كذلك استيراد دالة واحدة أو مجموعة من الدوال فقط دون كامل الوحدة، وذلك باستخدام الجملة<span style="font-family:courier new,courier,monospace;"> from import</span>. مثلا يُمكننا استيراد الدالة <span style="font-family:courier new,courier,monospace;">asctime</span> بمُفردها بالسّطر التالي:
	</p>
</div>

<div id="wmd-preview-section-40">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_18"><span class="pln">from time import asctime</span></pre>

	<p>
		لاستدعاء أكثر من دالة، افصل بينها بفواصل.
	</p>
</div>

<div id="wmd-preview-section-41">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_20"><span class="pln">from time import asctime, sleep</span></pre>

	<p>
		لاستعمال هذه الدوال المُستوردة يكفي استدعاؤها باسمها دون البادئة <span style="font-family:courier new,courier,monospace;">time</span>.
	</p>
</div>

<div id="wmd-preview-section-42">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_22"><span class="pln">&gt;&gt;&gt; from time import asctime, sleep
&gt;&gt;&gt; sleep(1)
&gt;&gt;&gt; asctime()
'Fri Apr  8 19:49:25 2016'</span></pre>

	<h2>
		الحصول على مساعدة حول الوحدة أو حول دالة من وحدة ما
	</h2>
</div>

<div id="wmd-preview-section-43">
	<p>
		يُمكنك استعمال سطر الأوامر للحصول على التوثيق الخاص بالوحدة الذي يشرح كل دالة على حدة بتنفيذ الأمر التالي من برنامج الطّرفيّة Terminal:
	</p>
</div>

<div id="wmd-preview-section-44">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_24"><span class="pln">pydoc time</span></pre>

	<p>
		غيّر <span style="font-family:courier new,courier,monospace;">time</span> باسم الوحدة التي ترغب بالحصول على توثيق لها. 
	</p>

	<p>
		يُمكن كذلك استخدام الدالة <span style="font-family:courier new,courier,monospace;">help</span> على بايثون مع تمرير اسم الوحدة أو الدالة التي ترغب في معرفة المزيد عنها:
	</p>
</div>

<div id="wmd-preview-section-45">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_26"><span class="pln">help('time') # توثيق الوحدة time الكامل
help('time.sleep') # التوثيق الخاص بالدالة sleep</span></pre>

	<p>
		مُخرج السّطر الثاني:
	</p>
</div>

<div id="wmd-preview-section-46">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_28"><span class="pln">Help on built-in function sleep in time:

time.sleep = sleep(...)
    sleep(seconds)

    Delay execution for a given number of seconds.  The argument may be
    a floating point number for subsecond precision.</span></pre>

	<h2>
		إنشاء وحدة خاصة بك
	</h2>
</div>

<div id="wmd-preview-section-47">
	<p>
		أشرنا من قبل بأنّ الوحدة مُجرّد دوال ومتغيّرات، ما يعني بأنّك تستطيع تحويل أي ملف مكتوب بلغة بايثون إلى وحدة ما دام به دوال وأصناف.
	</p>

	<p>
		سننشئ في هذا المثال وحدة لحساب مربّع عدد ومكعّبه، أي أنّ الوحدة ستحتوي على دالتين <span style="font-family:courier new,courier,monospace;">square</span> لحساب مُربّع العدد، و <span style="font-family:courier new,courier,monospace;">cube</span> لحساب مُكعّبه، أنشئ ملفا باسم <span style="font-family:courier new,courier,monospace;">num.py</span> وضع به ما يلي:
	</p>
</div>

<div id="wmd-preview-section-48">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_30"><span class="pln">mill = 1000000

def square(x):
    return x * x

def cube(x):
    return x * x * x</span></pre>

	<p>
		لقد أنشأت الآن وحدة يُمكن أن يستعملها غيرك من المُبرمجين. افتح مُفسّر بايثون واستورد الوحدة <span style="font-family:courier new,courier,monospace;">num</span> وبعدها جرّب استعمال الدالتين على عدد معيّن:
	</p>
</div>

<div id="wmd-preview-section-49">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_32"><span class="pln">&gt;&gt;&gt; import num
&gt;&gt;&gt; num.square(3)
9
&gt;&gt;&gt; num.cube(3)
27
&gt;&gt;&gt; num.mill
1000000</span></pre>

	<p>
		لاحظ بأنّنا استطعنا الوصول إلى قيمة المُتغيّر <span style="font-family:courier new,courier,monospace;">mill</span> كذلك. 
	</p>

	<p>
		يُمكن كذلك استدعاء دالة واحدة فقط:
	</p>
</div>

<div id="wmd-preview-section-50">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_34"><span class="pln">&gt;&gt;&gt; from num import cube
&gt;&gt;&gt; cube(3)
27</span></pre>

	<h3>
		توثيق الوحدة
	</h3>
</div>

<div id="wmd-preview-section-51">
	<p>
		يُمكنك توثيق الوحدة ليسهل على المبرمجين فهم الدوال ووظائفها، وذلك باستعمال سلسلة التوثيق <span style="font-family:courier new,courier,monospace;">Docstring</span> تكون داخل ثلاث علامات تنصيص كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-52">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_36"><span class="pln">"""The num module provides utilties to work on numbers.
"""

mill = 1000000

def square(x):
    """Computes square of a number."""
    return x * x

def cube(x):
    """Computes cube of a number."""
    return x * x</span></pre>

	<p>
		إذا نفّذت الأمر <span style="font-family:courier new,courier,monospace;">pydoc</span> على الوحدة، فستجد أن التوثيق قد أضيف تلقائيا.
	</p>
</div>

<div id="wmd-preview-section-53">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_38"><span class="pln">Help on module num:

NAME
    num - The num module provides utilties to work on numbers.

FILE
    /home/dyouri/num.py

FUNCTIONS
    cube(x)
        Computes cube of a number.

    square(x)
        Computes square of a number.

DATA
    mill = 1000000</span></pre>

	<h2>
		الوحدة OS
	</h2>
</div>

<div id="wmd-preview-section-54">
	<p>
		تُمكّن الوحدة <span style="font-family:courier new,courier,monospace;">os</span> من إجراء عمليات نظام التّشغيل مثل إنشاء المجلّدات وعرض قائمة بالملفات المتواجدة بمجلّد معيّن، أو حتى حذف مُجلّد أو ملف بلغة بايثون.
	</p>
</div>

<div id="wmd-preview-section-55">
	<h3 id="عرض-مسار-مجلد-العمل-الحالي">
		عرض مسار مجلد العمل الحالي
	</h3>

	<p>
		يُمكنك أن تحصل على مسار المجلّد الحالي بالدّالة <span style="font-family:courier new,courier,monospace;">getcwd</span> وهي اختصار لـ get current working direcrtory أي (احصل على مُجلّد العمل الحالي)، ويُمكن تنفيذ الدّالة كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-56">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_40"><span class="pln">&gt;&gt;&gt; import os
&gt;&gt;&gt; os.getcwd()
'/home/dyouri'</span></pre>

	<p>
		إذا كنت تستعمل مُفسّر بايثون في Windows، فالمُخرج سيكون مشابها لما يلي:
	</p>
</div>

<div id="wmd-preview-section-57">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_42"><span class="pln">'C:\Python27'</span></pre>

	<h3>
		إنشاء مجلد جديد
	</h3>
</div>

<div id="wmd-preview-section-58">
	<p>
		يُمكنك إنشاء مُجلّد بالدالة <span style="font-family:courier new,courier,monospace;">mkdir</span> مع تمرير اسم المُجلّد كمُعامل:
	</p>
</div>

<div id="wmd-preview-section-59">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_44"><span class="pln">&gt;&gt;&gt; import os
&gt;&gt;&gt; os.mkdir('New Folder')</span></pre>

	<p>
		بعد تنفيذ الأمر ستجد بأنّ المجلّد قد أضيف إلى قائمة المُجلّدات.
	</p>
</div>

<div id="wmd-preview-section-60">
	<h3 id="عرض-مكونات-مجلد-معين">
		عرض مكونات مجلد معين
	</h3>

	<p>
		يُمكنك كذلك عرض مُكونات مُجلّد بالدّالة <span style="font-family:courier new,courier,monospace;">listdir</span> وسيكون المخرج عبارة عن قائمة بأسماء الملفات والمجلّدات الموجودة في المسار المُمرّر للدالة. في هذه الحالة سنُمرّر مسار المُجلّد الحالي.
	</p>
</div>

<div id="wmd-preview-section-61">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_46"><span class="pln">dir = os.getcwd()
os.listdir(dir)</span></pre>

	<p>
		يُمكنك عرض كل عنصر في سطر بحلقة <span style="font-family:courier new,courier,monospace;">for</span>.
	</p>
</div>

<div id="wmd-preview-section-62">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_48"><span class="pln">dir = os.getcwd()
list = os.listdir(dir)

for item in list:
    print item</span></pre>

	<h3>
		إعادة تسمية ملف أو مجلد 
	</h3>

	<p>
		يُمكنك إعادة تسمية ملفّ أو مُجلّد بالدّالة <span style="font-family:courier new,courier,monospace;">rename</span> كما يلي:
	</p>
</div>

<div id="wmd-preview-section-63">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_50"><span class="pln">os.rename('Old', 'New')</span></pre>

	<p>
		حيث Old هو الاسم القديم، وNew هو الاسم الجديد.
	</p>
</div>

<div id="wmd-preview-section-64">
	<h3 id="حذف-ملف">
		حذف ملف
	</h3>

	<p>
		لحذف ملف يكفي استخدام الدالة <span style="font-family:courier new,courier,monospace;">remove</span>، مع تمرير مسار الملف.
	</p>
</div>

<div id="wmd-preview-section-65">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_52"><span class="pln">os.remove('file.txt')</span></pre>

	<h3>
		حذف مجلد فارغ
	</h3>
</div>

<div id="wmd-preview-section-66">
	<p>
		يُمكن حذف مُجلّد فارغ بالدّالة <span style="font-family:courier new,courier,monospace;">rmdir</span> مع تمرير مسار المجلّد المرغوب حذفه.
	</p>
</div>

<div id="wmd-preview-section-67">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_54"><span class="pln">os.rmdir('New Folder')</span></pre>

	<p>
		إذا أردت أن تحذف مجلّدا يحتوي على ملفات فيمكن استخدام وحدة <span style="font-family:courier new,courier,monospace;">Shutil</span>. (انظر القسم التالي).
	</p>
</div>

<div id="wmd-preview-section-68">
	<h3 id="تنفيذ-أوامر-النظام">
		تنفيذ أوامر النظام
	</h3>

	<p>
		أوامر النّظام هي الأوامر التي تستطيع تنفيذها من الطّرفيّة Terminal أو من برنامج Cmd على Windows. 
	</p>

	<p>
		يُمكنك تنفيذ أوامر النّظام عبر الدالة <span style="font-family:courier new,courier,monospace;">system</span> وذلك بتمرير الأمر كمُعامل.
	</p>
</div>

<div id="wmd-preview-section-69">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_56"><span class="pln">os.system('ls')</span></pre>

	<h2>
		الوحدة Shutil
	</h2>
</div>

<div id="wmd-preview-section-70">
	<p>
		تُمكّن الوحدة <span style="font-family:courier new,courier,monospace;">Shutil</span> من إجراء عمليات على الملفات والمجلّدات، مثل نسخ ملف من مسار إلى مسار آخر أو نقله، أو حذف مُجلّد كامل.
	</p>
</div>

<div id="wmd-preview-section-71">
	<h3 id="حذف-مجلد">
		حذف مجلد
	</h3>

	<p>
		كما أشرنا سابقا، تستطيع استخدام<span style="font-family:courier new,courier,monospace;"> os.rmdir</span> لحذف مُجلّد فارغ، لكن ماذا لو أردت حذف به ملفات؟ 
	</p>

	<p>
		يُمكنك استخدام الدّالة <span style="font-family:courier new,courier,monospace;">rmtree</span> من وحدة <span style="font-family:courier new,courier,monospace;">shutil</span> للقيام بذلك.
	</p>
</div>

<div id="wmd-preview-section-72">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_58"><span class="pln">import shutil
shutil.rmtree('Folder')</span></pre>

	<h3>
		نسخ ملف
	</h3>
</div>

<div id="wmd-preview-section-73">
	<p>
		يُمكنك استخدام الدّالة <span style="font-family:courier new,courier,monospace;">copy</span> لنسخ ملف من مسار إلى مسار آخر، الدالة تقبل مُعاملين، المُعامل الأول يُمثّل مسار الملف المراد نسخه، والمُعامل الثاني يُمثّل مسار الملفّ المراد النّسخ إليه.
	</p>
</div>

<div id="wmd-preview-section-74">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_60"><span class="pln">shutil.copy('file.txt', 'Folder/file.txt')</span></pre>

	<h3>
		نقل ملف
	</h3>
</div>

<div id="wmd-preview-section-75">
	<p>
		لنقل ملفّ يُمكن استخدام الدّالة <span style="font-family:courier new,courier,monospace;">move</span> عوضا عن الدالة <span style="font-family:courier new,courier,monospace;">copy</span> الخاصّة بالنّسخ.
	</p>
</div>

<div id="wmd-preview-section-76">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_62"><span class="pln">shutil.move('file.txt', 'Folder/file.txt')</span></pre>

	<h2>
		تمرير معاملات إلى ملف بايثون من الطرفية بالوحدة Sys
	</h2>
</div>

<div id="wmd-preview-section-77">
	<p>
		تُمكّننا الوحدة <span style="font-family:courier new,courier,monospace;">sys</span> من تمرير مُعاملات عند تشغيل ملف مكتوب بلغة بايثون، فمثلا يُمكنك أن تكتب برنامجا للطّباعة دون الحاجة إلى الدّخول إلى مُفسّر بايثون. سيكون اسم الملف مثلا<span style="font-family:courier new,courier,monospace;"> print.py</span> وسنمكن من تمرير مُعامل له عند تشغيله كالتالي:
	</p>
</div>

<div id="wmd-preview-section-78">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_64"><span class="pln">python print.py 'Hello World!'</span></pre>

	<p>
		يُمكن الحصول على المُعاملات الممرّرة على شكل قائمة، وهي مخزّنة في المُتغيّر <span style="font-family:courier new,courier,monospace;">argv</span> من الوحدة <span style="font-family:courier new,courier,monospace;">sys</span>. 
	</p>

	<p>
		أنشئ ملفا باسم <span style="font-family:courier new,courier,monospace;">print.py </span>وضع به ما يلي:
	</p>
</div>

<div id="wmd-preview-section-79">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_66"><span class="pln">import sys
print sys.argv</span></pre>

	<p>
		إذا قُمت بتشغيل الملفّ مع تمرير معامل أو أكثر فستُطبع قائمة تحتوي على جميع هذه المُعاملات.
	</p>

	<p>
		جرّب تنفيذ الملف مع تمرير كلمة <span style="font-family:courier new,courier,monospace;">hello</span> كمُعامل.
	</p>
</div>

<div id="wmd-preview-section-80">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_68"><span class="pln">python print.py hello</span></pre>

	<p>
		ستجد بأنّ المُخرج سيكون عبارة عن قائمة بعنصرين:
	</p>
</div>

<div id="wmd-preview-section-81">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_70"><span class="pln">['print.py', 'hello']</span></pre>

	<p>
		العنصر الأول هو اسم الملفّ، والعنصر الثاني هو ما قُمنا بتمريره. 
	</p>

	<p>
		يُمكنك بالطّبع الوصول إلى عنصر محدّد فقط بتحديد رقمه من القائمة:
	</p>
</div>

<div id="wmd-preview-section-82">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_72"><span class="pln">import sys
print sys.argv[1]</span></pre>

	<p>
		في الشيفرة أعلاه، قمنا بطباعة العنصر الثاني. إذا كرّرت أمر التّشغيل السّابق ستُلاحظ بأنّ المُخرج هو كلمة <span style="font-family:courier new,courier,monospace;">hello</span> فقط. 
	</p>

	<p>
		لتمرير جملة، يكفي إحاطتها بعلامتي التّنصيص.
	</p>
</div>

<div id="wmd-preview-section-83">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_74"><span class="pln">python print.py 'Hello World!'</span></pre>

	<h2>
		الحزم Packages
	</h2>
</div>

<div id="wmd-preview-section-84">
	<p>
		الحزمة أو الرّزمة عبارة عن مُجلّد يحتوي على وحدة أو أكثر. 
	</p>

	<p>
		عوضا عن ملفّ<span style="font-family:courier new,courier,monospace;"> num.py</span> يُمكن أن نقوم بوضع الملفات داخل مُجلّد الحزمة.
	</p>

	<p>
		لإنشاء حزمة عليك إنشاء مُجلّد باسم الحزمة، التي سنُسميها <span style="font-family:courier new,courier,monospace;">num_package</span> وداخل هذا المجلّد سنضع ملفيّن<span style="font-family:courier new,courier,monospace;"> square .py</span> و <span style="font-family:courier new,courier,monospace;">cube.py</span>. كذلك يجب أن يحتوي المُجلّد على ملف باسم <span style="font-family:courier new,courier,monospace;">init__.py__</span> وذلك لإخبار بايثون بأنّ هذا المُجلّد عبارة عن حزمة.
	</p>

	<p>
		لإنشاء المُجلّد والملفّات اللازمة، يُمكنك تنفيذ البرنامج التّالي:
	</p>
</div>

<div id="wmd-preview-section-85">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_76"><span class="pln">import os

os.mkdir('num_package')

open('num_package/__init__.py', 'w').close()
open('num_package/square.py', 'w').close()
open('num_package/cube.py', 'w').close()</span></pre>

	<p>
		سنضع في ملفّ<span style="font-family:courier new,courier,monospace;"> square.py</span> الدالة الأولى:
	</p>
</div>

<div id="wmd-preview-section-86">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_78"><span class="pln">def square(x):
    return x * x</span></pre>

	<p>
		وفي ملف <span style="font-family:courier new,courier,monospace;">cube.py</span> الدالة الثانية:
	</p>
</div>

<div id="wmd-preview-section-87">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_80"><span class="pln">def cube(x):
    return x * x * x</span></pre>

	<p>
		وسنترك الملفّ <span style="font-family:courier new,courier,monospace;">init__.py__</span> فارغا.
	</p>
</div>

<div id="wmd-preview-section-88">
	<h2 id="استيراد-الحزمة">
		استيراد الحزمة
	</h2>

	<p>
		يُمكنك استيراد الحزمة كاملة كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-89">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_82"><span class="pln">import num_package</span></pre>

	<p>
		أو يُمكنك استيراد كل وحدة على حدة.
	</p>
</div>

<div id="wmd-preview-section-90">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_84"><span class="pln">import num_package.square
import num_package.cube</span></pre>

	<p>
		بعد الاستيراد، يُمكن الوصول إلى الدوال كالتالي:
	</p>
</div>

<div id="wmd-preview-section-91">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_86"><span class="pln">&gt;&gt;&gt; num_package.square.square(3)
9
&gt;&gt;&gt; num_package.cube.cube(3)
27</span></pre>

	<p>
		يُمكن كذلك وضع إختصار للوحدة وذلك لاختصار الوصول إلى الدوال، فقط ألحق سطر الاستيراد بكلمة <span style="font-family:courier new,courier,monospace;">as</span> وبعدها أعطها اسما مُختصرا.
	</p>
</div>

<div id="wmd-preview-section-92">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_88"><span class="pln">import num_package.square as sqr</span></pre>

	<p>
		ستستطيع الآن الوصول إلى الدالة بكتابة شيفرة أقل:
	</p>
</div>

<div id="wmd-preview-section-93">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_90"><span class="pln">sqr.square(3)</span></pre>

	<p>
		يُمكن كذلك استخدام جملة <span style="font-family:courier new,courier,monospace;">from .. import.</span>
	</p>
</div>

<div id="wmd-preview-section-94">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_92"><span class="pln">from num_package.square import square as sqr
sqr(3)</span></pre>

	<h2>
		تمارين
	</h2>
</div>

<div id="wmd-preview-section-96">
	<h3 id="التمرين-1">
		التمرين 1
	</h3>

	<p>
		استعمل وحدة <span style="font-family:courier new,courier,monospace;">time</span> لإنشاء ساعة بسيطة تطبع الوقت الحالي كل ثانية.
	</p>
</div>

<div id="wmd-preview-section-97">
	<h3 id="التمرين-2">
		التمرين 2
	</h3>

	<p>
		أنشئ المُجلدات التّالية (10 مُجلّدات) باستخدام لغة بايثون:
	</p>
</div>

<div id="wmd-preview-section-98">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_94"><span class="pln">Folder1
Folder2
Folder3
.
.
Folder10</span></pre>

	<p>
		<strong>ملاحظة</strong>: استخدام حلقة تكرار لإنجاز الأمر.
	</p>
</div>

<div id="wmd-preview-section-99">
	<h3 id="التمرين-3">
		التمرين 3
	</h3>

	<p>
		أعد تسمية المُجلّدات التي أنشأتها في التّمرين 2 بإضافة العدد واحد لنهاية كل مُجلّد، أي أنّ المُجلّد Folder1 يتغيّر اسمه إلى Folder2 وهكذا إلى أن تصل إلى المُجلّد العاشر Folder11.
	</p>
</div>

<div id="wmd-preview-section-100">
	<h3 id="التمرين-4">
		التمرين 4
	</h3>

	<p>
		استعمل وحدة <span style="font-family:courier new,courier,monospace;">Sys</span> لإنشاء آلة حاسبة بسيطة، يُمكن استخدامها كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-101">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7164_96"><span class="pln">python calc.py 3 + 4
=&gt; 7

python calc.py 10 - 4
=&gt; 6</span></pre>

	<h2>
		ما التالي؟
	</h2>
</div>

<div id="wmd-preview-section-102">
	<p>
		وصلنا أخيرا إلى نهاية هذه السّلسلة التي تشرح أساسيات اللغة، فهنيئا لك على صبرك وهنيئا لك على إضافة لغة بايثون كمهارة أخرى إلى قائمة مهاراتك، ستتمكّن الآن من برمجة برامج ذات وظائف مُتعدّدة ومُعقّدة، وتستطيع قراءة وفهم بعض الشيفرات المُتواجدة على موقع Github.
	</p>

	<p>
		إنّ ما يجعل بايثون لغة شهيرة هي مكتباتها التي تتعدّى الآلاف في شتى المجالات، لذا فالحديث عن لغة بايثون لا يمكن أن ينتهي هنا.
	</p>

	<p>
		يُمكنك اختيار مكتبة أو إطار عمل لتعلّم تطوير الويب (Flask, Bottle, Django)، <a href="https://academy.hsoub.com/programming/general/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8/" rel="">تطبيقات سطح المكتب</a> (Python Qt, Python Gtk, TkInter, Kivy)، أو حتى مُعالجة الصّور بمكتبة OpenCV، وغيرها الكثير.
	</p>

	<p>
		إذا كنت مُهتما بتطوير تطبيقات الويب فيُمكنك إلقاء نظرة على درس <a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D9%85%D8%B5%D8%BA%D8%B1-bottle-%D9%84%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-python-%D9%84%D9%84%D9%88%D9%8A%D8%A8-r93/" rel="">إنشاء موقع بسيط بإطار العمل Bottle</a>. 
	</p>

	<h2>
		المصادر المعتمدة
	</h2>
</div>

<div id="wmd-preview-section-103">
	<ul>
		<li>
			<a href="https://docs.python.org/2/tutorial/modules.html" rel="external nofollow">التوثيق الرّسمي للغة بايثون، فصل الوحدات</a> 
		</li>
		<li>
			كتاب <a href="http://anandology.com/python-practice-book/index.html" rel="external nofollow">Python Practice Book</a> لكاتبه Anand Chitipothu
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">329</guid><pubDate>Wed, 11 May 2016 08:53:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; (Object Oriented Programming) &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x62B;&#x627;&#x646;&#x64A;</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-programming-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r313/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/python-object-oriented-programming.png.1d15a7dfb6b8f065ae7cebf4ef2b67ff.png" /></p>

<div id="wmd-preview-section-19">
	<p id="البرمجة-كائنية-التوجه-في-لغة-بايثون-الجزء-الثاني">
		بعد أن تعرّفنا في الدّرس السابق على <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-programming-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r309/" rel="">أساسيات البرمجة كائنية التوجّه</a>، سنُكمل في هذا الجزء ما بدأناه وسنتعلّم بعض المبادئ المتقدّمة حول البرمجة كائنيّة التّوجه.
	</p>

	<p style="text-align: center;">
		<img alt="python-object-oriented-programming.png" class="ipsImage ipsImage_thumbnailed" data-fileid="15104" data-unique="mem0xfo9l" src="https://academy.hsoub.com/uploads/monthly_2016_04/python-object-oriented-programming.png.b17009165b1241661a4519d7c29747ca.png"></p>
</div>

<div id="wmd-preview-section-21">
	<h2 id="تغيير-قيمة-متغير-الصنف">
		تغيير قيمة متغير الصنف
	</h2>

	<p>
		في الدّرس السّابق تعلّمنا كيفيّة تعريف مُتغيّر داخل صنف وكيفيّة الوصول إليه، في هذا الجزء من هذا الدّرس سنتعرّف على كيفيّة استخدام هذه المُتغيّرات بشكل أكثر واقعيّة، لنقل مثلا بأنّنا نمتلك صنفًا باسم <span style="font-family:courier new,courier,monospace;">Car</span> (سيارة)، ونريد أن ننشئ كائنات من هذا الصّنف، بحيثُ يكون لكل كائن قيم مُختلفة لمُتغيّرات الصّنف، انظر ما يلي:
	</p>
</div>

<div id="wmd-preview-section-22">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_8">
<span class="pln">class Car:
    name  = None
    speed = 0
    brand = None
    def specs(self):
        print '{} speed is {}Km/h and it\'s brand is {}'.format(self.name, self.speed, self.brand)</span></pre>

	<p>
		أنشأنا أعلاه صنفا بسيطا باسم <span style="font-family:courier new,courier,monospace;">Car</span> مع ثلاثة مُتغيّرات <span style="font-family:courier new,courier,monospace;">name</span> لاسم السّيارة، <span style="font-family:courier new,courier,monospace;">speed</span> لسرعة السّيارة و <span style="font-family:courier new,courier,monospace;">brand</span> لاسم العلامة التّجاريّة، كلمة <span style="font-family:courier new,courier,monospace;">None</span> تُشير إلى أنّ المُتغيّر مُعرّف لكنّه لا يحمل أية قيمة. بعدها عرّفنا تابعا <span style="font-family:courier new,courier,monospace;">specs</span> (اختصار لـ specifications) لطباعة مواصفات السّيارة.
	</p>

	<p>
		لننشئ كائنات مُتعدّدة من الصّنف الذّي كتبناه للتو.
	</p>
</div>

<div id="wmd-preview-section-23">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_10">
<span class="pln"># Toyota Corolla
corolla = Car()
corolla.name = 'Toyota Corolla'
corolla.speed = 200
corolla.brand = 'Toyota'

# Ford Focus
focus = Car()
focus.name = 'Ford Focus'
focus.speed = 220
focus.brand = 'Ford'

# Honda Civic
civic = Car()
civic.name = 'Honda Civic'
civic.speed = 210
civic.brand = 'Honda'</span></pre>

	<p>
		بعد أن أنشأنا الصّنف والكائنات المندرجة تحت هذا الصّنف، وقمنا بتعيين قيم المُتغيّرات التي تُعتبر مواصفات كلّ سيارة، يُمكننا أخيرا طباعة مواصفات كل سيارة (كائن) وذلك باستدعاء التابع <span style="font-family:courier new,courier,monospace;">specs</span>.
	</p>
</div>

<div id="wmd-preview-section-24">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_12">
<span class="pln">corolla.specs()
focus.specs()
civic.specs()</span></pre>

	<p>
		وكما تتوقّع، المُخرج سيكون كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-25">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_14">
<span class="pln">Toyota Corolla speed is 200Km/h and it's brand is Toyota

Ford Focus speed is 220Km/h and it's brand is Ford

Honda Civic speed is 210Km/h and it's brand is Honda</span></pre>

	<h2>
		إرجاع الصنف داخل تابع
	</h2>
</div>

<div id="wmd-preview-section-26">
	<p>
		يُمكنك أن تقوم بكتابة تابع داخل صنف، بحيث يقوم التابع بتنفيذ شيفرة ما ثمّ إعادة الصّنف نفسه (ما نُشير إليه بالكلمة <span style="font-family:courier new,courier,monospace;">self</span>) وبهذا ستتمكّن من استدعاء التابع أكثر من مرّة في سطر واحد، تأمل ما يلي:
	</p>
</div>

<div id="wmd-preview-section-27">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_16">
<span class="pln">class Car:
    def start(self):
        print 'Starting engine…'
        return self</span></pre>

	<p>
		ما فعلناه في الشّيفرة أعلاه ليس بالشيء الكثير، أولا نقوم بتعريف الصّنف ثمّ بعد ذلك نُعرّف التّابع <span style="font-family:courier new,courier,monospace;">start</span> المسؤول عن تشغيل السّيارة، وبعدها نطبع جملة تُفيد بأنّ مُحرّك السّيارة قيد التّشغيل، بعد تنفيذ الشيفرة سيُرجع التّابع الصّنف نفسه. ما سيُمكّننا من استدعاء التّابع أكثر من مرّة في سطر واحد كما يلي:
	</p>
</div>

<div id="wmd-preview-section-28">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_18">
<span class="pln">corolla = Car()
corolla.start().start().start()</span></pre>

	<p>
		المُخرج سيكون كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-29">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_20">
<span class="pln">Starting engine…
Starting engine…
Starting engine…</span></pre>

	<p>
		كما تُلاحظ لقد نُفّذت الشّيفرة الموجودة داخل التّابع <span style="font-family:courier new,courier,monospace;">start</span> ثلاث مرّات. 
	</p>

	<p>
		قد تتساءل عن أهميّة الأمر، وأتّفق معك في أنّ الأمر يُمكن أن لا يكون مُفيدا. لكنّه يكون مُفيدا إذا أردت أن تقوم بتنفيذ تابعين بشكل تسلسلي، لنقل بأنّ لدينا تابعا آخر باسم <span style="font-family:courier new,courier,monospace;">move</span> ولنفرض بأنّه سيكون مسؤولا عن تحريك السّيارة، سيكون من الأفضل لو استطعنا أن نستدعي تابع الحركة مُباشرة بعد استدعاء تابع التّشغيل. بحيث يبدو الاستعمال كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-30">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_22">
<span class="pln">corolla.start().move()</span></pre>

	<p>
		يُمكننا أن نقوم بالأمر ببساطة، وفي الحقيقة لن نحتاج إلا لإضافة التابع <span style="font-family:courier new,courier,monospace;">move</span> لما كتبناه سابقا.
	</p>
</div>

<div id="wmd-preview-section-31">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_24">
<span class="pln">class Car:
    def start(self):
        print 'Starting engine…'
        return self
    def move(self):
        print 'The car is moving…'</span></pre>

	<p>
		بهذه الطّريقة سنتمكن من تنفيذ الشيفرة دون مشاكل:
	</p>
</div>

<div id="wmd-preview-section-32">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_26">
<span class="pln">Car().start().move()</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-33">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_28">
<span class="pln">Starting engine…
Starting engine…
The car is moving…</span></pre>

	<p>
		لكن لاحظ هذه المرّة بأنّنا لم نُرجع كلمة <span style="font-family:courier new,courier,monospace;">self</span> في التّابع <span style="font-family:courier new,courier,monospace;">move</span> ما يعني بأنّنا لن نتمكن من القيام باستدعاء التابع أكثر من مرّة:
	</p>
</div>

<div id="wmd-preview-section-34">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_30">
<span class="pln">Car().start().move().move()</span></pre>

	<p>
		إذا حاولت أن تُنفّذ الأمر السّابق ستحصل على خطأ كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-35">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_32">
<span class="pln">AttributeError: 'NoneType' object has no attribute 'move'</span></pre>

	<p>
		وهذا راجع لكوننا لم نُرجع الصنف في آخر التّابع <span style="font-family:courier new,courier,monospace;">move</span>.
	</p>
</div>

<div id="wmd-preview-section-36">
	<h2 id="الوراثة">
		الوراثة
	</h2>

	<p>
		مفهوم الوراثة في البرمجة كائنيّة التوجه لا يختلف كثيرا عن مفهوم الوراثة في العالم الواقعي، الصّنف الابن يرث جميع المتغيرات والتوابع من الصّنف الأب، يُمكن التّفكير في الأمر على أنّه نسخ. أي أنّ الصّنف الابن مُجرّد نُسخة طبق الأصل من الصّنف الأصلي، الفرق هنا هو أنّك تستطيع أن تُضيف المزيد من الخصائص والتوابع للصّنف الابن. وطريقة إنشاء صنف يرث من صنف آخر هي بوضع الصّنف الأب بين قوسين عند إنشاء الصّنف الابن. انظُر المثال التّالي:
	</p>
</div>

<div id="wmd-preview-section-37">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_35">
<span class="pln">class Parent:
    a = 1
    b = 2

class Child(Parent):
    c = 3</span></pre>

	<p>
		في المثال أعلاه، قُمنا بإنشاء صنف باسم <span style="font-family:courier new,courier,monospace;">Parent</span> مع مُتغيّرين <span style="font-family:courier new,courier,monospace;">a</span> و <span style="font-family:courier new,courier,monospace;">b</span>، وبعدها أنشأنا صنفا <span style="font-family:courier new,courier,monospace;">Child</span> الذي يرث خصائص الصّنف السابق، وبالتّالي فسنتمكّن من الوصول إلى مُتغيّرات الصّنف <span style="font-family:courier new,courier,monospace;">Parent</span> من خلال الصّنف <span style="font-family:courier new,courier,monospace;">Child</span>، ما يعني بأنّ الشيفرة التّالية ستعمل دون مشاكل:
	</p>
</div>

<div id="wmd-preview-section-38">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_37">
<span class="pln">child = Child()
print child.a
print child.b
print child.c</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-39">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_39">
<span class="pln">1
2
3</span></pre>

	<p>
		كما تُلاحظ فإنّنا قد استطعنا الوصول إلى المتغيّرين <span style="font-family:courier new,courier,monospace;">a</span> و <span style="font-family:courier new,courier,monospace;">b </span>رغم أنّهما لم يُعرّفا مُباشرة داخل الصّنف <span style="font-family:courier new,courier,monospace;">Child</span>.
	</p>

	<p>
		يُمكن أن نجعل صنفا يرث توابع من صنف آخر بنفس الطّريقة:
	</p>
</div>

<div id="wmd-preview-section-40">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_43">
<span class="pln">class Person:
    name = 'Person'
    def say_hello(self):
        name = self.name
        print 'Hello my name is {}'.format(name)

class Abdelhadi(Person):
    name = 'Abdelhadi'</span></pre>

	<p>
		استدعاء التّابع <span style="font-family:courier new,courier,monospace;">say_hello </span>من كائن من الصّنف Abdelhadi.
	</p>
</div>

<div id="wmd-preview-section-41">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_41">
<span class="pln">me = Abdelhadi()
me.say_hello()</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-42">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_45">
<span class="pln">Hello my name is Abdelhadi</span></pre>

	<p>
		في الشيفرة أعلاه، قُمنا أولا بتعريف صنف "شخص" باسم <span style="font-family:courier new,courier,monospace;">Person</span> ثمّ عرّفنا المُتغيّر <span style="font-family:courier new,courier,monospace;">name</span> داخل الصّنف، وأعطيناه قيمة افتراضيّة، بعدها عرّفنا التّابع<span style="font-family:courier new,courier,monospace;"> say_hello</span> ليطبع جُملة التّرحيب.
	</p>
</div>

<div id="wmd-preview-section-43">
	<h2 id="متغيرات-الصنف-المبنية-مسبقا">
		متغيرات الصنف المبنية مسبقا
	</h2>

	<p>
		توجد مُتغيّرات مبنية مُسبقا في لغة <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">بايثون</a>، وتُسمى هذه المُتغيّرات بمُتغيّرات الصّنف، وما نعنيه بأنّها مبنية مُسبقا هو أنّك لا تحتاج إلى تعريفها، وتمتاز هذه المُتغيّرات بأنّها مُحاطة بتسطيرين سُفليّين Underscores وإليك بعضا من هذه المُتغيّرات:
	</p>

	<h3>
		<span style="font-family:arial,helvetica,sans-serif;">__doc__</span>
	</h3>

	<p>
		سلسلة توثيق الصنف (Documentation string) وهو ما يُكتب مُباشرة بعد تعريف الصنف، ويحتوي في الغالب معلومات حول وظيفة الصّنف. القيمة الافتراضية لهذا المتغير هي <span style="font-family:courier new,courier,monospace;">None</span> ألق نظرة على الصّنف التالي:
	</p>
</div>

<div id="wmd-preview-section-44">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_47">
<span class="pln">class Person:
    ''' This class does nothing '''
    pass</span></pre>

	<p>
		لاحظ بأنّ سلسلة التوثيق مُحاطة بثلاث علامات تنصيص
	</p>

	<p>
		إذا أردنا الوصول إلى هذا التوثيق فكلّ ما علينا فعله هو استخدام الصّفة<span style="font-family:courier new,courier,monospace;"> __doc__</span>:
	</p>
</div>

<div id="wmd-preview-section-45">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_49">
<span class="pln">print Person.__doc__</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-46">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_51">
<span class="pln"> This class does nothing</span></pre>

	<h3>
		__module__
	</h3>

	<p>
		الوحدة التي عُرّفَ فيها الصّنف، وقيمتها الافتراضية هي'<span style="font-family:courier new,courier,monospace;">__main__</span>'.
	</p>
</div>

<div id="wmd-preview-section-47">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_53">
<span class="pln">print Person.__module__</span></pre>

	<p>
		المخرج:
	</p>
</div>

<div id="wmd-preview-section-48">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_55">
<span class="pln">__main__</span></pre>

	<h3>
		__dict__
	</h3>

	<p>
		هذا المُتغيّر عبارة عن قاموس يحمل ما سبق كقيم بدئية، كما يحمل أسماء المتغيّرات التي تُنشؤها أنت وقيمها وكذلك أسماء التوابع، لاحظ المثال التالي (نفّذه مُباشرة على مُفسّر بايثون لتُلاحظ النّتيجة):
	</p>
</div>

<pre class="ipsCode" id="ips_uid_8250_57">
&gt;&gt;&gt; class Math:
...     x = 1
...     y = 2
...     def x_plus_y(self):
...         return self.x + self.y
... 
&gt;&gt;&gt; Math.__dict__
{'y': 2, 'x': 1, '__module__': '__main__', '__doc__': None, 'x_plus_y': &lt;function x_plus_y at 0x7f186e76a6e0&gt;}</pre>

<div id="wmd-preview-section-49">
	<p>
		كما تُلاحظ مُخرجات القاموس تحتوي على كل من قيم المُتغيرات الخاصّة بالصّنف سواء التي عرّفناها أو المبنية مُسبقا، لاحظ كذلك العنصر الأخير من القاموس:
	</p>
</div>

<div id="wmd-preview-section-50">
	<pre class="ipsCode" id="ips_uid_8250_59">
'x_plus_y': &lt;function x_plus_y at 0x7f186e76a6e0&gt;}</pre>

	<p>
		هذا العنصر يحمل مفتاحا باسم التابع <span style="font-family:courier new,courier,monospace;">x_plus_y</span> الذي عرّفناه، وقيمة هذه المفتاح تُشير إلى أنّه دالة.
	</p>

	<h3>
		__name__
	</h3>

	<p>
		اسم الصّنف، يُمكنك تطبيقه على أي صنف للحصول على اسمه، انظر المثال التالي:
	</p>
</div>

<div id="wmd-preview-section-51">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_61">
<span class="pln">&gt;&gt;&gt; a = Math
&gt;&gt;&gt; a.__name__
'Math'</span></pre>

	<p>
		كما تُلاحظ فقد حصلنا على اسم الصنف <span style="font-family:courier new,courier,monospace;">Math</span>.
	</p>
</div>

<div id="wmd-preview-section-52">
	<h2 id="الوصول-إلى-الصنف-الخاص-بكائن-ما">
		الوصول إلى الصنف الخاص بكائن ما
	</h2>

	<p>
		المُتغيّرات التي ذكرناها سابقا خاصّة بالصّنف فقط ولا يُمكن الوصول إليها من كائن من هذا الصّنف. تأمّل الصّنف التالي:
	</p>
</div>

<div id="wmd-preview-section-53">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_63">
<span class="pln">class Person:
    name = 'Abdelhadi'</span></pre>

	<p>
		لننشئ الآن كائنا من هذا الصّنف:
	</p>
</div>

<div id="wmd-preview-section-54">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_65">
<span class="pln">me = Person()</span></pre>

	<p>
		يُمكننا الآن الوصول إلى قيمة المُتغيّر <span style="font-family:courier new,courier,monospace;">name</span> كالتالي:
	</p>
</div>

<div id="wmd-preview-section-55">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_67">
<span class="pln">&gt;&gt;&gt; me.name
'Abdelhadi'</span></pre>

	<p>
		لكننّا لن نستطيع الوصول إلى مُتغيّرات الصّنف من الكائن، بل من الصّنف فقط:
	</p>
</div>

<div id="wmd-preview-section-56">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_69">
<span class="pln">person_class = Person
person_class.__name__ # الشيفرة صحيحة

person_object = Person()
person_object.__name__ # الشيفرة خاطئة لأنّنا نحاول الوصول إلى مُتغيّر غير مُعرّف داخل الكائن</span></pre>

	<p>
		ستحصل على خطأ من نوع <span style="font-family:courier new,courier,monospace;">AttributeError</span> عند تنفيذ السّطر الأخير:
	</p>
</div>

<div id="wmd-preview-section-57">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_71">
<span class="pln">AttributeError: Person instance has no attribute '__name__'</span></pre>

	<p>
		الحل الأمثل هو أن نصل إلى الصّنف انطلاقا من الكائن، وبعدها سنتمكّن من الوصول إلى مُتغيّرات/صفات الصّنف دون مشاكل، وطريقة الوصول إلى صنف كائن هي بإلحاقه بكلمة<span style="font-family:courier new,courier,monospace;"> __class__</span>، انظر المثال التّالي (سنعتمد على الصنف الذي أنشأناه أعلاه):
	</p>
</div>

<div id="wmd-preview-section-58">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_73">
<span class="pln">person_object = Person()
person_object_class = person_object.__class__ # إسناد صنف الكائن لمتغيّر

print person_object_class.__name__ # اسم الصّنف
print person_object_class.__dict__ # قاموس يحتوي على بيانات الصّنف</span></pre>

	<p>
		بدأنا بإنشاء كائن <span style="font-family:courier new,courier,monospace;">person_object</span> ثمّ استخدام جُملة <span style="font-family:courier new,courier,monospace;">__class__</span> للوصول إلى الصّنف. 
	</p>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-59">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_75">
<span class="pln">Person

{'__module__': '__main__', 'name': 'Abdelhadi', '__doc__': None}</span></pre>

	<p>
		يُمكنك كذلك القيام بالأمر داخل تابع في الصّنف:
	</p>
</div>

<div id="wmd-preview-section-60">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_77">
<span class="pln">class Person:
    def say_hello(self):
        print 'Hi I am a {}'.format(self.__class__.__name__)

person_obj = Person()
person_obj.say_hello()</span></pre>

	<p>
		لاحظ استخدام <span style="font-family:courier new,courier,monospace;">self.__class__.__name__</span> للوصول إلى اسم الصّنف في التّابع<span style="font-family:courier new,courier,monospace;"> say_hello</span>. 
	</p>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-61">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_79">
<span class="pln">Hi I am a Person</span></pre>

	<h2>
		التوابع الخاصة
	</h2>
</div>

<div id="wmd-preview-section-62">
	<p>
		يُمكن استخدام بعض التّوابع الخاصّة لتنفيذ شيفرة عند القيام بإجراء معيّن، وإليك قائمة بأهم هذه التّوابع (لاحظ بأنّها مُحاطة بتسطيرين سُفليّين Underscores).
	</p>

	<ul>
<li>
			<strong>التابع <span style="font-family:courier new,courier,monospace;">init</span></strong>: تُنفَّذُ الشيفرة التي بداخله عند إنشاء كائن من الصّنف، ويُسمّى أيضا بتابع البناء Contractor .
		</li>
		<li>
			<strong>التابع <span style="font-family:courier new,courier,monospace;">del</span></strong>: تُنفّذ شيفرته عند حذف كائن أو عند استدعاء دالة الخروج <span style="font-family:courier new,courier,monospace;">exit</span>.
		</li>
		<li>
			<strong>التابع <span style="font-family:courier new,courier,monospace;">repr</span></strong>: تُنفّذ الشيفرة عند استدعاء الكائن، ويُستخدم هذا التابع لإرجاع معلومات حول الكائن في الوضع التّفاعلي (من مُفسّر لغة بايثون مُباشرة)
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-63">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_82">
<span class="pln"># استدعاء __init__
person_obj = Person() 
# استدعاء __repr__
person_obj
repr(person_obj)
# حذف الكائن واستدعاء __del__
del(person_obj)</span></pre>

	<h3>
		التابع init
	</h3>
</div>

<div id="wmd-preview-section-64">
	<p>
		هذا مثال بسيط على إنشاء واستدعاء هذا التّابع:
	</p>
</div>

<div id="wmd-preview-section-65">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_84">
<span class="pln">class Person:
    def __init__(self):
        print 'A new object was created'

me = Person()</span></pre>

	<p>
		مُخرج البرنامج سيكون جُملة تُفيد بأنّ كائنا قد أنشئ، لاحظ أنّ الجملة A new object was created قد طُبعت رغم عدم استدعاء التّابع <span style="font-family:courier new,courier,monospace;">init</span> بشكل صريح، ويُمكن الحصول على نفس المُخرج باستدعاء التّابع كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-66">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_86">
<span class="pln">me.__init__()</span></pre>

	<p>
		حسنا تعلّمنا الآن بأنّنا نستطيع تنفيذ الشيفرة الموجودة بداخل التّابع <span style="font-family:courier new,courier,monospace;">__init__ </span>بمُجرّد إنشاء كائن من الصّنف، ولكن ماذا عن المُعاملات؟ 
	</p>

	<p>
		يُمكن تمرير المُعاملات للتّابع<span style="font-family:courier new,courier,monospace;"> __init__ </span>عند إنشاء صنف كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-67">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_88">
<span class="pln">me = Person('Abdelhadi')</span></pre>

	<p>
		وفي التّابع سيكون الأمر كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-68">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_90">
<span class="pln">def __init__(self, name):
    name = self.name
    print 'Hello My name is {}'.format(name)</span></pre>

	<p>
		الشيفرة الكاملة:
	</p>
</div>

<div id="wmd-preview-section-69">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_92">
<span class="pln">class Person:
    def __init__(self, name):
        self.name = name 
        print 'Hello My name is {}'.format(name)

me = Person('Abdelhadi')</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-70">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_95">
<span class="pln">Hello My name is Abdelhadi</span></pre>

	<h3>
		التابع repr
	</h3>
</div>

<div id="wmd-preview-section-71">
	<p>
		يُستعمل هذا التّابع لإرجاع معلومات قابلة للطّباعة، ويُستخدم كثيرا في الوضع التّفاعلي (مُفسّر بايثون)، ويجب أن تكون القيمة المُرجعَةُ عبارة عن سلسلة نصيّة. وإليك مثالا لكيفيّة استخدامه:
	</p>
</div>

<div id="wmd-preview-section-72">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_97">
<span class="pln">class Math:
    x = 1
    y = 2
    def __repr__(self):
        x = self.x
        y = self.y
        return 'x: {}, y: {}'.format(x, y) 
x_y = Math()
print x_y</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-73">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_99">
<span class="pln">x: 1, y: 2</span></pre>

	<p>
		يُمكننا الاستفادة من هذا التّابع للوصول إلى اسم الصنف عند الوراثة:
	</p>
</div>

<div id="wmd-preview-section-74">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_101">
<span class="pln"># تعريف الصّنف الرّئيسي
class Person:
    def __repr__(self):
        return 'Hi I am a {}'.format(self.__class__.__name__)

# الوراثة
class Writer(Person):
    pass

class Student(Person):
    pass
# إنشاء الكائنات
omar = Student()
abdelhadi = Writer()

# طباعة قيّم التّابع repr
print omar
print abdelhadi </span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-75">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_103">
<span class="pln">Hi I am a Student
Hi I am a Writer</span></pre>

	<p>
		لاحظ بأنّ الصّنفين <span style="font-family:courier new,courier,monospace;">Writer</span> و <span style="font-family:courier new,courier,monospace;">Student</span> لا يحتويان على أية شيفرة، ومع ذلك فقد نُفّذ التّابع <span style="font-family:courier new,courier,monospace;">repr</span> واستجاب بطريقة مُختلفة مع كلّ كائن.
	</p>
</div>

<div id="wmd-preview-section-76">
	<h3 id="التابع-del">
		التابع del
	</h3>

	<p>
		تُنَفّذُ الشّيفرة الموجودة بداخل هذا التّابع عند حذف كائن باستعمال الدّالة <span style="font-family:courier new,courier,monospace;">del</span> وهي دالة تُستعمل لإنجاز ما يُسمى بعمليّة جمع القُمامة Garbage Collecting والهدف الرئيسي من هذه العمليّة هو تحرير الذاكرة، ولحذف كائن يكفي أن تقوم باستدعاء الدّالة <span style="font-family:courier new,courier,monospace;">del</span> مع تمرير الكائن كمُعامل:
	</p>
</div>

<div id="wmd-preview-section-77">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_105">
<span class="pln">class Math:
    x = 1
    y = 2

numbers = Math()
numbers.x # ==&gt; 1
numbers.y # ==&gt; 2
# حذف الكائن
del(numbers)

# خطأ
numbers.x # ==&gt; NameError: name 'numbers' is not defined</span></pre>

	<p>
		بعد أن حذفنا الكائن <span style="font-family:courier new,courier,monospace;">numbers</span> لم يعد بإمكاننا الوصول إلى قيمة المُتغيّر <span style="font-family:courier new,courier,monospace;">x</span>، وأسفر الأمر عن خطأ من نوع <span style="font-family:courier new,courier,monospace;">NameError</span>. 
	</p>

	<p>
		يُستدعى التابع <span style="font-family:courier new,courier,monospace;">del</span> مُباشرة بعد حذف الكائن، ما يعني بأنّنا نستطيع أن نطبع جملة تُفيد بأنّ الكائن قد حُذف:
	</p>
</div>

<div id="wmd-preview-section-78">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_107">
<span class="pln">class Math:
    x = 1
    y = 2
    def __del__(self):
        print 'Object deleted!'

numbers = Math()
numbers.x # ==&gt; 1
del(numbers)</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-79">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_109">
<span class="pln">Object deleted!</span></pre>

	<p>
		تُنفَّذ شيفرة<span style="font-family:courier new,courier,monospace;"> __del__ </span>كذلك عند استدعاء الدالة <span style="font-family:courier new,courier,monospace;">exit</span> للخروج من البرنامج:
	</p>
</div>

<div id="wmd-preview-section-80">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_111">
<span class="pln">class Math:
    x = 1
    y = 2
    def exit_program(self):
        exit()

    def __del__(self):
        print 'Object deleted!'

numbers = Math()
numbers.exit_program()</span></pre>

	<p>
		مُخرَج البرنامج أعلاه سيكون نفس الشيء رغم عدم حذف الكائن. والسبب راجع لاستخدام الدّالة <span style="font-family:courier new,courier,monospace;">exit</span> داخل التّابع <span style="font-family:courier new,courier,monospace;">exit_program</span>.
	</p>
</div>

<div id="wmd-preview-section-81">
	<h2 id="تمارين">
		تمارين
	</h2>
</div>

<div id="wmd-preview-section-82">
	<h3 id="تمرين-1">
		تمرين 1
	</h3>

	<p>
		عد إلى الدّروس السّابقة وحاول تحويل برنامج تسجيل الدّخول إلى برنامج سهل القراءة والاستخدام باستعمال البرمجة كائنية التوجه، فمثلا يُمكن أن يستعمل من قبل مُبرمجين آخرين بالطّريقة التّالية:
	</p>
</div>

<div id="wmd-preview-section-83">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8250_113">
<span class="pln">user = User()
user.signup('username', 'password', 'password_confirmation')
user.login('username', 'password')
user.say_hello()
user.logout()</span></pre>

	<h3>
		تمرين 2
	</h3>
</div>

<div id="wmd-preview-section-84">
	<p>
		أنشئ برنامجا يطبع جميع التوابع والمُتغيّرات الموجودة داخل الصّنف الذي أنشأته كحل للتّمرين الأول.
	</p>
</div>
]]></description><guid isPermaLink="false">313</guid><pubDate>Sun, 17 Apr 2016 09:13:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x643;&#x627;&#x626;&#x646;&#x64A;&#x629; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x647; (Object Oriented Programming) &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646; - &#x627;&#x644;&#x62C;&#x632;&#x621; &#x627;&#x644;&#x623;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-programming-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r309/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/python-object-oriented-programming.png.1737cad2f76ae41816abb4def14b1a10.png" /></p>

<div id="wmd-preview-section-78">
	<p id="البرمجة-كائنية-التوجه-في-بايثون">
		تعرّفنا فيما سبق من دروس <a href="https://academy.hsoub.com/search/?tags=python+101" rel="">هذه السلسلة</a> على أساسيات لغة بايثون، من <a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9%D9%87%D8%A7-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r221/" rel="">مُتغيّرات</a> و<a href="https://academy.hsoub.com/programming/python/%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-loops-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r291/" rel="">حلقات تكرار</a> إلى <a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-functions-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r292/" rel="">الدوال</a>، وقد حان الوقتُ للدخول إلى أساسيات البرمجة كائنية التوجّه Object Oriented Programming وهي ببساطة طريقة أخرى للبرمجة بحيث تكون أجزاء الشّيفرة مجموعة داخل دوال تُسمّى التوابع methods والدوال تكون داخل صنف معيّن Class. عند إنشاء كائن object من هذا الصنف فإنّنا نستطيع أن نُنفّذ عليه مُختلف العمليات الموجودة داخل التوابع والتي بدورها توجد داخل الصنف.
	</p>

	<p style="text-align: center;">
		<img alt="python-object-oriented-programming.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14886" data-unique="f2a8ob9r9" src="https://academy.hsoub.com/uploads/monthly_2016_04/python-object-oriented-programming.png.a009afd9c3f59c9be49b8761e68ddb92.png"></p>

	<p>
		هناك تسميّات عربية أخرى لهذا النّوع من البرمجة، لذا لا تقلق إذا صادَفتَ أحد هذه التّسميات في أماكن أخرى، فكلّها تُشير إلى نفس المعنى: 
	</p>

	<ul>
<li>
			برمجة غرضيّة التوجه 
		</li>
		<li>
			برمجة شيئية المنحى 
		</li>
		<li>
			برمجة كائنيّة المنحى
		</li>
	</ul>
</div>

<div id="wmd-preview-section-80">
	<h2 id="بنية-الصنف-class">
		بنية الصنف Class
	</h2>

	<p>
		الصنف ببساطة يحتوي على أجزاء مُختلفة من الشيفرة تماما مثل الدالة، الفرق هنا هو أنّ الصنف يحتوي على دوال كذلك، وهذه الدوال تُسمى التّوابع، ويحتوي كذلك على مُتغيّرات وتنقسم هذه الأخيرة إلى نوعين، مُتغيّر الصنف، والمُتغيّر العادي، الفرق بينهما هو أنّك تستطيع الوصول إلى مُتغيّر الصنف في أي مكان داخل الصنف (سواء داخل التوابع أو خارجها).
	</p>
</div>

<div id="wmd-preview-section-81">
	<h2 id="إنشاء-صنف">
		إنشاء صنف
	</h2>

	<p>
		لإنشاء صنف في لغة بايثون كلّ ما عليك فعله هو كتابة كلمة <span style="font-family:courier new,courier,monospace;">class</span> وبعدها اسم الصنف ثمّ إلحاق نقطتين، بعدها اكتب الشيفرة بإزاحة أربع مسافات:
	</p>
</div>

<div id="wmd-preview-section-82">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_7">
<span class="pln">&gt;&gt;&gt; class My_class:
...     pass</span></pre>

	<p>
		أنشأنا أعلاه صنفًا بسيطا باسم <span style="font-family:courier new,courier,monospace;">My_class</span> وهو لا يفعل أي شيء يُذكر (كلمة <span style="font-family:courier new,courier,monospace;">pass</span> تُخبر بايثون بالمرور دون تنفيذ أي شيء). 
	</p>

	<p>
		إذا كتبت اسم الصنف على مفسّر بايثون فستجد مُخرجا كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-83">
	<pre class="ipsCode" id="ips_uid_3577_9">
&gt;&gt;&gt; My_class
&lt;class __main__.My_class at 0x7fd0efc41460&gt;</pre>

	<p>
		لاحظ بأنّ الكلمة الأولى من المُخرج هي <span style="font-family:courier new,courier,monospace;">class</span> أي أنّنا أصبحنا نمتلك صنفًا جديدًا، ما يتبع at هو المكان في الذاكرة الذي وُضع فيه الصنف ويتغيّر بين الحين والآخر.
	</p>
</div>

<div id="wmd-preview-section-84">
	<h2 id="إنشاء-كائن-من-صنف">
		إنشاء كائن من صنف
	</h2>

	<p>
		بعد أن أنشأنا الصنف سنتمكّن الآن من إنشاء كائن من هذا الصنف، والكائن مُجرّد اسم تماما كالمُتغيّر:
	</p>
</div>

<div id="wmd-preview-section-85">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_17">
<span class="pln">my_object = My_class()</span></pre>

	<p>
		الآن الكائن <span style="font-family:courier new,courier,monospace;">my_object</span> هو من صنف<span style="font-family:courier new,courier,monospace;"> My_class</span>.
	</p>
</div>

<div id="wmd-preview-section-86">
	<h2 id="تعريف-المتغيرات-داخل-صنف">
		تعريف المتغيرات داخل صنف
	</h2>

	<p>
		يُمكننا أن نُعرّف مُتغيّرات في الصنف تماما كما نُعرّف المُتغيّرات بشكل عادي.
	</p>
</div>

<div id="wmd-preview-section-87">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_19">
<span class="pln">class My_class:
    my_variable = 'This is my variable'</span></pre>

	<p>
		للوصول إلى المُتغيّر ننشئ أولا كائنا من الصنف وبعدها نكتب اسم الكائن ثمّ نقطة ثمّ اسم المُتغيّر:
	</p>
</div>

<div id="wmd-preview-section-88">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_21">
<span class="pln">my_object = My_class()
print my_object.my_variable</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-89">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_23">
<span class="pln">This is my variable</span></pre>

	<p>
		يُمكن كذلك الحصول على النّتيجة ذاتها في سطر واحد:
	</p>
</div>

<div id="wmd-preview-section-90">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_25">
<span class="pln">print My_class().my_variable</span></pre>

	<h2>
		إنشاء التوابع
	</h2>
</div>

<div id="wmd-preview-section-91">
	<p>
		التوابع هي دوال خاصّة بالصنف، ويُمكننا إنشاء التابع بنفس الطّريقة التي نُنشئ بها الدالة، الإختلاف هنا هو أنّ جميع التوابع يجب أن تُعرّف مع مُعامل باسم <span style="font-family:courier new,courier,monospace;">self</span> وذلك للإشارة إلى أنّ الدالة/التابع تابع للصنف، لننشئ تابعا داخل صنف الآن.
	</p>
</div>

<div id="wmd-preview-section-92">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_27">
<span class="pln">class My_class:
    my_variable = 'This is my variable'
    def my_method(self):
        print 'This is my method'</span></pre>

	<p>
		الآن إذا أنشأنا كائنا فإنّنا سنتمكّن من الوصول إلى التابع، وتذكّر بأنّ التابع تلحقه الأقواس:
	</p>
</div>

<div id="wmd-preview-section-93">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_29">
<span class="pln">my_object = My_class()

my_object.my_method()</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-94">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_31">
<span class="pln">This is my method</span></pre>

	<p>
		يُمكن كذلك الحصول على النّتيجة ذاتها في سطر واحد:
	</p>
</div>

<div id="wmd-preview-section-95">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_33">
<span class="pln">My_class().my_method()</span></pre>

	<p>
		كما تُلاحظ فقد نُفّذت الشيفرة الموجودة داخل التّابع <span style="font-family:courier new,courier,monospace;">my_method </span>ويُمكننا كذلك أن نجعل التّابع يقبل المُعاملات، لكن تذكّر الحفاظ على الكلمة <span style="font-family:courier new,courier,monospace;">self</span> كمُتغيّر أول.
	</p>
</div>

<div id="wmd-preview-section-96">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_35">
<span class="pln">class My_class:
    my_variable = 'This is my variable'
    def my_method(self, my_parameter):
        print 'This is my method ; {} is my parameter'.format(my_parameter)</span></pre>

	<p>
		يُمكنك استدعاء التّابع كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-97">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_37">
<span class="pln">my_object = My_class()

my_object.my_method('Parameter1')

my_object.my_method('Parameter2')</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-98">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_39">
<span class="pln">This is my method ; Parameter1 is my parameter

This is my method ; Parameter2 is my parameter</span></pre>

	<p>
		في البرنامج السّابق، أنشأنا أولا صنفًا باسم <span style="font-family:courier new,courier,monospace;">My_class </span>وقُمنا بتعريف مُتغيّر، ثمّ بتعريف تابع باسم<span style="font-family:courier new,courier,monospace;"> my_method</span> يقبل مُعاملين <span style="font-family:courier new,courier,monospace;">self</span> و <span style="font-family:courier new,courier,monospace;">my_parameter</span>، بالنّسبة لاستدعاء التّابع، فنحتاج فقط إلى تمرير المُعاملات الموجودة بعد المُعامل selfولا نحتاج إلى تعيين قيمة لهذا المُعامل.
	</p>

	<p>
		<strong>مُلاحظة</strong>: يُمكنك إعادة تسميّة المُعامل الأول كما تشاء، أي أنّ البرنامج التّالي سيعمل دون مشاكل.
	</p>
</div>

<div id="wmd-preview-section-99">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_41">
<span class="pln">class My_class:
    def my_method(this, my_parameter):
        print '{} is my parameter'.format(my_parameter)</span></pre>

	<p>
		ولكن رغم ذلك فالمُتعارف عليه بين مُبرمجي لغة بايثون هو استعمال self، وفي كثير من اللغات الأخرى تُستعمل <span style="font-family:courier new,courier,monospace;">this</span> عوضا عن <span style="font-family:courier new,courier,monospace;">self</span>، أما في برامِجك فمن المُفضّل الإبقاء على هذه التّسميّة المُتعارف عنها، وذلك لتكون شيفراته سهلة القراءة.
	</p>
</div>

<div id="wmd-preview-section-100">
	<h2 id="الوصول-إلى-متغيرات-الصنف-داخل-التوابع">
		الوصول إلى متغيرات الصنف داخل التوابع
	</h2>

	<p>
		تأمّل الصنف التّالي:
	</p>
</div>

<div id="wmd-preview-section-101">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_43">
<span class="pln">class Person:
    lastname = 'Dyouri'
    job = 'Writer, Developer'
    def say_hello(self):
        name = 'Abdelhadi'
        print 'Hello, My name is {}'.format(name)</span></pre>

	<p>
		البرنامج أعلاه بسيط جدا، أولا نعرّف صنف باسم <span style="font-family:courier new,courier,monospace;">Person</span> وبعدها نقوم بتعيين قيمتين للمُتغيّرين <span style="font-family:courier new,courier,monospace;">name</span> و <span style="font-family:courier new,courier,monospace;">lastname</span>، وبعدها عرّفنا تابعا باسم<span style="font-family:courier new,courier,monospace;"> say_hello</span> يطبع جملة Hello, My name is Abdelhadi. <br>
		كلّ شيء جيد، لكن ماذا لو أردنا أن نصل إلى المُتغيّرات الأخرى الموجودة خارج التّابع، فلا يُمكننا مثلا أن نقوم بالأمر كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-102">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_45">
<span class="pln">class Person:
    lastname = 'Dyouri'
    job = 'Writer, Developer'
    def say_hello(self):
        name = 'Abdelhadi'
        print 'Hello, My name is {}'.format(name)
        print lastname
        print job</span></pre>

	<p>
		ستحصل على الخطأ التّالي:
	</p>
</div>

<div id="wmd-preview-section-103">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_47">
<span class="pln">global name 'lastname' is not defined</span></pre>

	<p>
		لتفادي هذا الخطأ سنستعمل كلمة <span style="font-family:courier new,courier,monospace;">self</span> قبل المُتغيّر.
	</p>
</div>

<div id="wmd-preview-section-104">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_49">
<span class="pln">class Person:
    lastname = 'Dyouri'
    job = 'Writer, Developer'
    def say_hello(self):
        name = 'Abdelhadi'
        print 'Hello, My name is {}'.format(name)
        print 'My Last name is {} '.format(self.lastname)
        print 'I am a {}'.format(self.job)</span></pre>

	<p>
		استدعاء التّابع:
	</p>
</div>

<div id="wmd-preview-section-105">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_51">
<span class="pln">me = Person()

me.say_hello()</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-106">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_53">
<span class="pln">Hello, My name is Abdelhadi
My Last name is Dyouri 
I am a Writer, Developer</span></pre>

	<p>
		لاحظ بأنّنا قُمنا بالوصول إلى مُتغيّر <span style="font-family:courier new,courier,monospace;">lastname</span> عن طريق استدعائه بـ <span style="font-family:courier new,courier,monospace;">self.lastname </span>وكذا الحال مع المُتغيّر <span style="font-family:courier new,courier,monospace;">job</span>، وهذه الطّريقة مُشابهة لاستخدام كلمة <span style="font-family:courier new,courier,monospace;">global</span> الفرق هنا أنّ هذه الأخيرة تُمكن من الوصول إلى المُتغيّر في كامل البرنامج، أمّا كلمة <span style="font-family:courier new,courier,monospace;">self</span> فتُشير إلى المُتغيّر المُعرّف في الصنف الحاليّة فقط.
	</p>

	<p>
		لتفهم أكثر كيفيّة عمل الكلمة <span style="font-family:courier new,courier,monospace;">self</span> فقط تخيّل بأنّها تحمل نفس اسم الصنف، مثلا:
	</p>
</div>

<div id="wmd-preview-section-107">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_55">
<span class="pln">class Person:
    lastname = 'Dyouri'
    job = 'Writer, Developer'
    def say_hello(self):
        name = 'Abdelhadi'
        print 'Hello, My name is {}'.format(name)
        print 'My Last name is {} '.format(Abd.lastname)
        print 'I am a {}'.format(Abd.job)</span></pre>

	<p>
		لاحظ بأنّنا غيّرنا كلمة <span style="font-family:courier new,courier,monospace;">self</span> إلى اسم الصنف واستمرّ عمل البرنامج دون مشاكل.
	</p>

	<p>
		وبنفس الطّريقة يُمكنك أن تستدعي تابعا داخل تابع آخر في نفس الصنف:
	</p>
</div>

<div id="wmd-preview-section-108">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_13">
<span class="pln">class Person:
    def say_name(self):
        print 'Abdelhadi'
    def say_hello(self):
        print 'Hello My name is:'
        self.say_name()</span></pre>

	<p>
		المُخرج:
	</p>
</div>

<div id="wmd-preview-section-109">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_15">
<span class="pln">Hello My name is:
Abdelhadi</span></pre>

	<p>
		ما حدث هو أنّ التّابع <span style="font-family:courier new,courier,monospace;">say_hello</span> قام بطباعة جملة :Hello My name is ثمّ قام باستدعاء التّابع <span style="font-family:courier new,courier,monospace;">say_name </span>الذي قام بدوره بطباعة الاسم Abdelhadi.
	</p>
</div>

<div id="wmd-preview-section-110">
	<h2 id="لماذا-تستعمل-البرمجة-الكائنية-ومتى-يجب-علي-استخدامها">
		لماذا تستعمل البرمجة الكائنية، ومتى يجب علي استخدامها
	</h2>

	<p>
		قد تُلاحظ بأنّ ما يُمكنك فعله بالبرمجة الكائنيّة يُمكن القيام به بالدوال والمُتغيّرات فقط. هذا صحيح، وهو أمر واضح، البرمجة الكائنيّة تُستعمل أساسا إذا كان البرنامج الذي تبنيه مُعقّدا مع العديد من الوظائف المُتعلّقة ببعضها (كمكتبة برمجيّة)، مثلا لنقل بأنّك تُطوّر برنامجا مسؤولا عن جلب بيانات من موقع مُعيّن، وبعدها التّعديل عليها، ثمّ إخراج مستند PDF يحتوي على هذه البيانات بشكل يُسهّل قراءتها، هنا ستحتاج إلى صنف لجلب البيانات والتّعديل عليها، وصنف أخرى لتحويل البيانات إلى نصّ مقروء واضح ثمّ إلى ملفّ PDF. 
	</p>

	<p>
		إذا نشرت برنامجك مع صديقك وأراد أن يعمل على الجزء الثاني لإضافة وظيفة تُمكن المُستخدم من طباعة المُستند فلا يُعقل أن يضطر للمرور على كل ما يتعلّق بجلب البيانات فقط لأنّه يريد أن يضيف خاصيّة لا علاقة لها بجلب البيانات. استعمال البرمجة الكائنيّة في هذا المشروع سيسمح لك بالتّركيز على الجزء الأول، وسيسمح لصديقك بالتّركيز على تطوير الجزء الثاني.
	</p>

	<p>
		خلاصة الأمر هي أنّك لست مضطرا لاستعمال البرمجة الكائنيّة إلا إذا كان برنامجك طويلا يحتوي على وظائف تتعلّق ببعضها البعض (وظائف من نفس الصنف)، ونسبة استخدام الآخرين لشيفرتك عالية.
	</p>
</div>

<div id="wmd-preview-section-111">
	<h2 id="تمارين">
		تمارين
	</h2>
</div>

<div id="wmd-preview-section-112">
	<h3 id="التمرين-1">
		التمرين 1
	</h3>

	<p>
		أنشئ صنفًا باسمك، وقم بتعريف مُتغيّرين <span style="font-family:courier new,courier,monospace;">lastname</span> (الاسم العائلي) و <span style="font-family:courier new,courier,monospace;">age</span> (العمر)، ثم أنشئ كائنا باسم <span style="font-family:courier new,courier,monospace;">me</span> (أنا) وقم بطباعة اسمك العائلي وعمرك.
	</p>
</div>

<div id="wmd-preview-section-113">
	<h3 id="التمرين-2">
		التمرين 2
	</h3>

	<p>
		أنشئ صنفًا باسم <span style="font-family:courier new,courier,monospace;">Car</span> (سيارة) وقم بتعريف مُتغيّرات لصفات السّيارة، مثلا <span style="font-family:courier new,courier,monospace;">brand</span> لاسم الشّركة،<span style="font-family:courier new,courier,monospace;"> release_date</span> لتاريخ الإعلان عن السّيارة.
	</p>
</div>

<div id="wmd-preview-section-114">
	<h3 id="التمرين-3">
		التمرين 3
	</h3>

	<p>
		أضف توابع إلى الصنف <span style="font-family:courier new,courier,monospace;">Car</span> التي أنشأتها في التّمرين الثّاني، يُمكن أن تكون التوابع عبارة عن عمليّات تقوم بها السّيارة مثلا <span style="font-family:courier new,courier,monospace;">move</span> للحركة، <span style="font-family:courier new,courier,monospace;">stop</span> للتوقّف، <span style="font-family:courier new,courier,monospace;">slow_down</span> لتخفيض السّرعة، وقم بطباعة جمل تفيد بأنّ العمليّة قد نجحت. المفروض أن يتمكّن الآخرون من إنشاء كائنات خاصّة بهم بحيث تُستخدم بهذه الطّريقة:
	</p>
</div>

<div id="wmd-preview-section-115">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3577_11">
<span class="pln">bmw = Car()
bmw.move()

bmw.slow_down()

bmw.stop()</span></pre>

	<h2>
		خاتمة
	</h2>
</div>

<div id="wmd-preview-section-116">
	<p>
		تعرّفنا في هذا الدّرس على بعض من أهم أساسيات البرمجة الكائنيّة التوجه في لغة بايثون وهذا الموضوع أطول من أن أشرحه في درس واحد لذلك سيكون الدّرس التّالي تكملة لما تعلّمناه في هذا الدّرس حول <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">تعلم بايثون</a> وسيغطي مفاهيم أخرى حول البرمجة كائنية التوجّه.
	</p>
</div>
]]></description><guid isPermaLink="false">309</guid><pubDate>Sun, 10 Apr 2016 11:22:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r306/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/python-files-io.png.fa832359ce8507a434dd489794b14e5f.png" /></p>

<div id="wmd-preview-section-20">
	<p id="التعامل-مع-الملفات-النصية-في-بايثون">
		تعلمنا إلى الآن مُعظم <a href="https://academy.hsoub.com/search/?tags=python+101" rel="">أساسيات لغة بايثون</a>، تعلمنا كيفية التعامل مع أنواع البيانات المُختلفة، الحصول على مُدخلات من المُستخدم، <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%A5%D8%B2%D8%A7%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D9%8A%D8%B6%D8%A7%D8%A1-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r285/" rel="">التعابير الشرطية</a>، <a href="https://academy.hsoub.com/programming/python/%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-loops-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r291/" rel="">حلقات التكرار</a> واستعمال <a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-functions-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r292/" rel="">الدوال</a> في برنامجنا لمرونة أكثر. وسنتعلم اليوم كيفيّة التعامل مع الملفات النّصية في لغة بايثون، كيفية الكتابة على ملف، وكيفية قراءة مُحتويات ملف مُعيّن.
	</p>

	<p style="text-align: center;">
		<img alt="python-files-io.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14765" data-unique="ybxvns8n3" src="https://academy.hsoub.com/uploads/monthly_2016_03/python-files-io.png.79b0629d4e8cf52463aefe5a48b61699.png"></p>
</div>

<div id="wmd-preview-section-22">
	<h2 id="ما-معنى-files-io">
		ما معنى Files I/O؟
	</h2>

	<p>
		ترجمة File هي "ملف" أما I/O فهو اختصار لـكلمتي Input و Output اللتان تعنيان المُدخل والمُخرج على التوالي. تعرفنا إلى الآن على دالتين للقيام بهاتين العمليتين الأولى هي الدالة <span style="font-family:courier new,courier,monospace;">print</span> للإخراج والدالة <span style="font-family:courier new,courier,monospace;">raw_input</span> للإدخال. لكنّ هذه الدوال لا تعمل إلا أثناء تشغيل البرنامج، فبعد انتهاء تنفيذه سيعود كل شيء إلى طبيعته وستفقد البيانات التي طبعتها أو التي حصلت عليها من المُستخدم. ماذا لو أردت أن تحتفظ بالبيانات في ملف ما؟ هذا بالضبط ما سنتعلمه اليوم. وإليك مُخطّطا لهذا الدرس:
	</p>

	<ul>
<li>
			فتح ملف في لغة بايثون.
		</li>
		<li>
			أنماط الوصول Access modes.
		</li>
		<li>
			الكتابة على الملف.
		</li>
		<li>
			قراءة الملف.
		</li>
		<li>
			الدوال المُساعدة عند فتح ملف.
		</li>
		<li>
			إغلاق الملف.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-23">
	<h2 id="الجملة-format">
		الجملة format
	</h2>

	<p>
		سأستعمل في هذا الدّرس جملة جديدة لم يسبق لنا أن تحدّثنا عنها في الدروس السابقة وهي جملة <span style="font-family:courier new,courier,monospace;">format</span> التي تُعتبر بمثابة مُحوّل لأنواع القيم المُختلفة إلى قيمة نصيّة، وتُساعد على دمج أي نوع داخل سلسلة نصّية دون الحاجة إلى تحويله بالدالة <span style="font-family:courier new,courier,monospace;">str</span>. انظر المثال التالي:
	</p>
</div>

<div id="wmd-preview-section-24">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_7">
<span class="pln">&gt;&gt;&gt; '{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'</span></pre>

	<p>
		يُمكن تبسيط الشيفرة أعلاه لتكون كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-25">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_9">
<span class="pln">&gt;&gt;&gt; '{}, {}, {}'.format('a', 'b', 'c')</span></pre>

	<p>
		إليك مثالا لطريقة الاستفادة منها في الواقع:
	</p>
</div>

<div id="wmd-preview-section-26">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_11">
<span class="pln">&gt;&gt;&gt; print 'Hello {} : {} : {} : {}'.format('Abdelhadi', 4, 22.4, True)

Hello Abdelhadi : 4 : 22.4 : True</span></pre>

	<p>
		لاحظ أنّ المُعاملات المُمرّرة للدالة قد أخذت مكان العلامات {} رغم أنّ كلّ قيمة ذات نوع مُختلف عن الأخرى. الطّريقة أعلاه أفضل بكثير من الطّريقة التّقليدية:
	</p>
</div>

<div id="wmd-preview-section-27">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_15">
<span class="pln">&gt;&gt;&gt; print 'Hello', 'Abdelhadi', ':', str(4), ':', str(22.4), ':', str(True)

Hello Abdelhadi : 4 : 22.4 : True</span></pre>

	<p>
		ويُمكنك أيضا أن تؤدي أغراضا أخرى بهذه الجملة، مثلا يُمكنك أن توزع سلسلة نصيّة على أماكن مُعيّنة في السّلسلة كالتالي:
	</p>
</div>

<div id="wmd-preview-section-28">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_17">
<span class="pln">&gt;&gt;&gt; '{0}, {1}, {2}'.format(*'abc')
'a, b, c'</span></pre>

	<p>
		تستطيع تغيير ترتيب العناصر ببساطة:
	</p>
</div>

<div id="wmd-preview-section-29">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_19">
<span class="pln">&gt;&gt;&gt; '{2}, {1}, {0}'.format(*'abc')
'c, b, a'</span></pre>

	<p>
		ويُمكنك أيضا أن تدمج عناصر القواميس في السلاسل النّصيّة بسهولة وذلك بالطّريقة التالية:
	</p>
</div>

<div id="wmd-preview-section-30">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_21">
<span class="pln">&gt;&gt;&gt; table = {'Abdelhadi': 1929, 'Ahmed': 1222, 'Omar': 1320}
&gt;&gt;&gt; print 'Ahmed: {Ahmed:d}; Abdelhadi: {Abdelhadi:d}; Omar: {Omar:d}'.format(**table)
Ahmed: 1222; Abdelhadi: 1929; Omar: 1320</span></pre>

	<p>
		لاحظ النّجمتين ** قبل الاسم <span style="font-family:courier new,courier,monospace;">table</span>.
	</p>
</div>

<div id="wmd-preview-section-31">
	<h2 id="فتح-ملف-في-لغة-بايثون">
		فتح ملف في لغة بايثون
	</h2>

	<p>
		قبل أن نتعامل مع أي ملف يجب علينا أولا أن نفتحه، تماما كما تفتح أي ملف نصي للتعديل عليه بمُحرّر النّصوص. لكننا في هذا الدرس سنستعمل لغة بايثون للقيام بذلك. وتوفر لغة بايثون دالة <span style="font-family:courier new,courier,monospace;">open</span> لفتح الملفات، والتي يُمكنك أن تستخدمها بالشكل التالي:
	</p>
</div>

<div id="wmd-preview-section-32">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_23">
<span class="pln">open('filename.txt', 'Access mode')</span></pre>

	<h3>
		المعامل الأول
	</h3>
</div>

<div id="wmd-preview-section-33">
	<p>
		المُعامل الأول هو اسم الملف، لاحظ أنّك تستطيع استبدال <span style="font-family:courier new,courier,monospace;">filename</span> بأي اسم تريده ويُمكنك حتى أن تستبدل الامتداد، فمثلا يُمكنك أن تستعمل امتداد ملفات بايثون py بحيث تُصبح الدالة كالتالي:
	</p>
</div>

<div id="wmd-preview-section-34">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_25">
<span class="pln">open('python_file.py', 'Access mode')</span></pre>

	<p>
		الملف يجب أن يكون في مُجلّد العمل، إذا كنت تستعمل نظام GNU/Linux أو نظام Mac وفتحت مُفسر بايثون أو نفّذت ملفا بامتداد py فالملف يجب أن يكون في المجلد الذي قمت بالعملية منه (في الغالب يكون مجلّد المنزل home). أما إذا كنت تستخدم مُفسر لغة بايثون على نظام Windows فسيكون الملف داخل مجلّد تنصيب حزمة Python والذي غالبا ما يكون في القرص C ومجلد باسم PythonNN مع استبدال NN برقم الإصدار الخاص بلغة بايثون، فمثلا لو قمت بتنصيب الإصدار 2.7 فسيكون مسار المُجلد التالي:
	</p>
</div>

<div id="wmd-preview-section-35">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_27">
<span class="pln">C:\Python27</span></pre>

	<p>
		إذا واجهت مشاكل في إيجاد مجلّد العمل يُمكنك تنفيذ الشيفرة التالية للحصول على مسار المُجلّد:
	</p>
</div>

<div id="wmd-preview-section-36">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_29">
<span class="pln">&gt;&gt;&gt; import os
&gt;&gt;&gt; os.getcwd()</span></pre>

	<p>
		المُخرجات ستكون كالتالي (حسب نظام التّشغيل واسم المُستخدم لديك):
	</p>
</div>

<div id="wmd-preview-section-37">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_31">
<span class="pln">'/home/dyouri'</span></pre>

	<p>
		يُمكنك حفظ المُخرج في مُتغير إذا أردت ذلك. ولا تقلق إذا لم تفهم الأسطر السابقة، إذ سنتحدّث عنها في درس لاحق.
	</p>
</div>

<div id="wmd-preview-section-38">
	<h3 id="المعامل-الثاني">
		المعامل الثاني
	</h3>

	<p>
		بالنّسبة للمعامل الثاني (Access mode ) فهو نمط الوصول الذي ترغب بفتح الملف به وهو إما للكتابة أو للقراءة أو كليهما. انظر الفقرة التالية.
	</p>
</div>

<div id="wmd-preview-section-39">
	<h2 id="أنماط-الوصول-access-modes">
		أنماط الوصول Access modes
	</h2>

	<p>
		عند فتح ملف في لغة بايثون، تكون مطالبا بتوفير معاملين للدالة <span style="font-family:courier new,courier,monospace;">open</span> المُعامل الأول هو اسم الملف، والمعامل الثاني هو نمط الوصول، أي السبب الذي فتحت الملف من أجله، وهناك العديد من الخيارات لذلك، وإليك أهم الخيارات التي يجب عليك أخذها بعين الاعتبار حسب هدفك من فتح الملف:
	</p>

	<h3>
		فتح الملف للقراءة
	</h3>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">r</span>: هذا هو النمط الافتراضي إذا لم تحدد المُعامل الثاني في دالة <span style="font-family:courier new,courier,monospace;">open</span> ويُمكنك من قراءة ملف بأحد الدوال المُتاحة لذلك (انظر فصل قراءة الملف). 
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-40">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_7">
<span class="pln">open('file.txt', 'r')</span></pre>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">r+</span>: يُفتح الملف في هذا النمط للقراءة والكتابة معا، مع وضع مؤشّر الفأرة في بداية الملف. 
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-41">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_9">
<span class="pln">open('file.txt', 'r+')</span></pre>

	<h3>
		فتح الملف للكتابة
	</h3>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">w</span>: يُفتح الملف فقط للكتابة، إذا كان الملف موجودا فإنّه يكتب عليه (Overwrite) أي أنّك ستفقد البيانات الأصلية. إذا لم يكن الملف موجودا فإنّ الدالة تنشئ ملفا جديدا للكتابة. 
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-42">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_11">
<span class="pln">open('file.txt', 'w')</span></pre>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">w+</span>: فتح الملف لكل من الكتابة والقراءة، إذا كان الملف موجودا فستتم الكتابة عليه (Overwrite). إذا لم يكن الملف موجودا فإنّ الدالة تنشئ ملفا جديدا للكتابة والقراءة. 
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-43">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_13">
<span class="pln">open('file.txt', 'w+')</span></pre>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">a</span>: إذا كان الملف موجودا أصلا، فسيُفتح للإلحاق Appending، أي أنّ مُكونات الملف تبقى كما هي، إذا أضفت أي نصّ فسيُضاف في آخر الملف. إذا لم يكن الملف موجودا فسيتم إنشاء ملف جديد. 
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-44">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_15">
<span class="pln">open('file.txt', 'a')</span></pre>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">a+</span>: إذا كان الملف موجودا فإنّه يُفتح لكل من الإلحاق والقراءة، إذا لم يكن موجودا فسيتم إنشاء ملف جديد.
		</li>
	</ul>
<p>
		مثال:
	</p>
</div>

<div id="wmd-preview-section-45">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_96">
<span class="pln">open('file.txt', 'a+')</span></pre>

	<h2>
		الكتابة على الملف
	</h2>
</div>

<div id="wmd-preview-section-46">
	<p>
		بعد فتح الملف سواء أكان موجودا من قبل أو أنّك أنشأته بالدالة نفسها، ستستطيع الكتابة على الملف وإضافة نصوصك الخاصّة، وذلك بالدالة <span style="font-family:courier new,courier,monospace;">write</span> مع مُعامل عبارة عن سلسلة نصية، انظر المثال التالي:
	</p>
</div>

<div id="wmd-preview-section-47">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_94">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'w') # فتح الملف وإسناده إلى مُتغير
&gt;&gt;&gt; file.write('Hello World!') # الكتابة بالملف
&gt;&gt;&gt; file.close() # إغلاق الملف</span></pre>

	<p>
		<strong>ملاحظة</strong>: إذا كنت تستعمل المُفسّر، فلحفظ التعديلات عليك الخروج من المفسّر أو إغلاق الملف والذي يُمكنك القيام به بالدالة <span style="font-family:courier new,courier,monospace;">close</span>، مع ملاحظة أنّك لن تتمكن من تعديل الملف بعد إغلاقه، أي أنّك ستحتاج إلى فتحه من جديد بالدالة <span style="font-family:courier new,courier,monospace;">open</span>.
	</p>
</div>

<div id="wmd-preview-section-48">
	<p>
		لن تُلاحظ أي مُخرجات عند تنفيذك لأي أمر أعلاه، ولكن رغم ذلك فإنّك إذا فتحت الملف <span style="font-family:courier new,courier,monospace;">file.txt</span> بأي مُحرّر للنّصوص (Notepad مثلا)، فإنّك ستُلاحظ الجملة !Hello World في بداية الملف.
	</p>

	<p>
		لاحظ بأنّنا فتحنا الملف بنمط الكتابة فقط (w)، إذا فتحت الملف بنفس النّمط مُجدّدا فإنّ التغييرات التي ستكتبها ستُغطّي محتويات الملف. أي أنّك إذا نفّذت الأوامر التاليّة فإنّ مُحتويات الملف ستُصبح الجملة !Hello Python عوضا عن جملة !Hello World
	</p>
</div>

<div id="wmd-preview-section-49">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_92">
<span class="pln"># -*- coding: utf-8 -*-
&gt;&gt;&gt; file = open('file.txt', 'w') # فتح الملف وإسناده إلى مُتغير
&gt;&gt;&gt; file.write('Hello Python!') # الكتابة بالملف
&gt;&gt;&gt; file.close() # إغلاق الملف</span></pre>

	<p>
		يُمكنك إضافة أكثر من مُدخل في كلّ مرّة، المهم أن تكتب على الملف قبل إغلاقه:
	</p>
</div>

<div id="wmd-preview-section-50">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_90">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'w')
&gt;&gt;&gt; file.write('Abdelhadi Dyouri!')
&gt;&gt;&gt; file.write('Hsoub Academy!')
&gt;&gt;&gt; file.close()</span></pre>

	<p>
		بعد تنفيذ الشيفرة أعلاه، ستكون مُحتويات الملف كالتالي:
	</p>
</div>

<div id="wmd-preview-section-51">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_88">
<span class="pln">Abdelhadi Dyouri!Hsoub Academy!</span></pre>

	<p>
		لاحظ بأنّ لغة بايثون لا يعود إلى سطر جديد في كل مرة، ولكي تحلّ هذه المسألة فيُمكنك ببساطة إضافة الرّمز <span style="font-family:courier new,courier,monospace;">n\</span> بين كل سطر، انظر المثال التّالي:
	</p>
</div>

<div id="wmd-preview-section-52">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_86">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'w')
&gt;&gt;&gt; file.write('Abdelhadi Dyouri!\nHsoub Academy!')
&gt;&gt;&gt; file.close()</span></pre>

	<p>
		مُحتويات الملفّ بعد تقسيم الأسطر بالرّمز <span style="font-family:courier new,courier,monospace;">n\</span> هي كالتالي:
	</p>
</div>

<div id="wmd-preview-section-53">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_84">
<span class="pln">Abdelhadi Dyouri!
Hsoub Academy!</span></pre>

	<p>
		لاحظ بأنّ الشيفرة أعلاه لها نفس تأثير ما يلي:
	</p>
</div>

<div id="wmd-preview-section-54">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_82">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'w')
&gt;&gt;&gt; file.write('Abdelhadi Dyouri!\n')
&gt;&gt;&gt; file.write('Hsoub Academy!')
&gt;&gt;&gt; file.close()</span></pre>

	<p>
		كلّ ما تعلمناه إلى الآن هو كيفية إعادة كتابة الملف، ولكن ماذا لو أردت أن تُبقي على محتويات الملف وترغب بإضافة نصوص له؟ يُمكنك ذلك عن طريق تغيير نمط الوصول إلى نمط الإلحاق عوضا عن نمط الكتابة، لنضف المزيد من النّصوص إلى الملف السابق، إلى الآن مُحتوياته هي كالتالي:
	</p>
</div>

<div id="wmd-preview-section-55">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_80">
<span class="pln">Abdelhadi Dyouri!
Hsoub Academy!</span></pre>

	<p>
		لنضف أقسام الأكاديمية إلى آخر الملف، انظر المثال التالي:
	</p>
</div>

<div id="wmd-preview-section-56">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_78">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'a')
&gt;&gt;&gt; file.write('\nFreelance\nEntrepreneurship\nDesign\nApps\nCertificates\nDevops\nMarketing')
&gt;&gt;&gt; file.close()</span></pre>

	<p>
		لاحظ تغيير المُعامل الثاني في دالة <span style="font-family:courier new,courier,monospace;">open</span> من <span style="font-family:courier new,courier,monospace;">w</span> إلى <span style="font-family:courier new,courier,monospace;">a</span>. 
	</p>

	<p>
		بعد تنفيذ الشيفرة أعلاه ستكون مُحتويات الملفّ كالتالي:
	</p>
</div>

<div id="wmd-preview-section-57">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_76">
<span class="pln">Abdelhadi Dyouri!
Hsoub Academy!
Freelance
Entrepreneurship
Design
Apps
Certificates
Devops
Marketing</span></pre>

	<p>
		لنُطبّق ما تعلمناه في الدّروس السابقة ولنضع لكلّ قسم عنوان Url الخاص به: 
	</p>

	<p>
		افتح ملفا باسم <span style="font-family:courier new,courier,monospace;">links.py</span> وضع فيه ما يلي:
	</p>
</div>

<div id="wmd-preview-section-58">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_74">
<span class="pln">links = []
list = '\nFreelance\nEntrepreneurship\nDesign\nApps\nCertificates\nDevops\nMarketing'

list = list.lower().split('\n')

for item in list:
    list = item.replace(item , 'https://academy.hsoub.com/{}'.format(item))
    links.append(list)

file = open('file.txt', 'w')
file.write('Academy: {}'.format(links[0]))
file.write('\nFreelance: {}'.format(links[1]))
file.write('\nEntrepreneurship: {}'.format(links[2]))
file.write('\nDesign: {}'.format(links[3]))
file.write('\nApps: {}'.format(links[4]))
file.write('\nCertificates: {}'.format(links[5]))
file.write('\nDevops: {}'.format(links[6]))
file.write('\nMarketing: {}'.format(links[7]))
file.close()</span></pre>

	<p>
		أولا عرّفنا قائمة روابط فارغة باسم links بعدها أسندنا الأقسام إلى مُتغيّر باسم <span style="font-family:courier new,courier,monospace;">list</span> ثمّ حولنا الأحرف إلى أحرف صغيرة و قسّمنا السّلسلة النّصية، بعدها استعملنا الحلقة <span style="font-family:courier new,courier,monospace;">for</span> للدوران على عناصر القائمة، وفي كلّ مرّة نستبدل قيمة القسم برابطه ونُلحق العنصر النّاتج إلى القائمة <span style="font-family:courier new,courier,monospace;">links</span> وبعدها فتحنا الملف ووضعنا لكل قسم رابطه الخاص وأخيرا أغلقنا الملف.
	</p>

	<p>
		بعد تنفيذ الشيفرة أعلاه ستكون مُحتويات الملف <span style="font-family:courier new,courier,monospace;">file.txt </span>كالتالي:
	</p>
</div>

<div id="wmd-preview-section-59">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_72">
<span class="pln">Academy: https://academy.hsoub.com/
Freelance: https://academy.hsoub.com/freelance
Entrepreneurship: https://academy.hsoub.com/entrepreneurship
Design: https://academy.hsoub.com/design
Apps: https://academy.hsoub.com/apps
Certificates: https://academy.hsoub.com/certificates
Devops: https://academy.hsoub.com/devops
Marketing: https://academy.hsoub.com/marketing</span></pre>

	<p>
		يُمكنك أن تجعل البرنامج أكثر ذكاء وذلك باستبدال قائمة الأقسام بمُدخل من المُستخدم وتُضيف رابط القسم إلى الملف، على سبيل المثال سيعمل البرنامج كالتالي:
	</p>
</div>

<div id="wmd-preview-section-60">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_70">
<span class="pln">Enter the name of the category: </span></pre>

	<p>
		مثلا لنُدخل programming للحصول على رابط قسم البرمجة، يجب أن تكون المُخرجات شيئا كالتالي:
	</p>
</div>

<div id="wmd-preview-section-61">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_68">
<span class="pln">Enter the name of the category: programming

Ok! Added https://academy.hsoub.com/programming to file.txt</span></pre>

	<p>
		هل رأيت حلاوة البرمجة؟ تذكّر بأنّ خيالك هو حدود ما تستطيع القيام به.
	</p>
</div>

<div id="wmd-preview-section-62">
	<h2 id="قراءة-الملف">
		قراءة الملف
	</h2>
</div>

<div id="wmd-preview-section-63">
	<h3 id="الدالة-read">
		الدالة read
	</h3>

	<p>
		بعد الكتابة على الملف سيتوجّب علينا قراءته، كما الكتابة تُوفّر لنا لغة بايثون دالة خاصة بالقراءة وهي الدالة <span style="font-family:courier new,courier,monospace;">read</span> التي يُمكننا أن نستعملها كالتالي:
	</p>
</div>

<div id="wmd-preview-section-64">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_66">
<span class="pln">file = open('file.txt', 'r')
file.read()</span></pre>

	<p>
		لاحظ أنّنا غيّرنا المُعامل الثاني من<span style="font-family:courier new,courier,monospace;"> w </span>إلى <span style="font-family:courier new,courier,monospace;">r</span> وذلك لأنّنا نرغب بفتح الملفّ للقراءة. 
	</p>

	<p>
		بعد تنفيذ الشيفرة أعلاه ستكون المُخرجات كالتالي:
	</p>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_17">
<span class="pln">'Academy: https://academy.hsoub.com/\nFreelance: https://academy.hsoub.com/freelance\nEntrepreneurship: https://academy.hsoub.com/entrepreneurship\nDesign: https://academy.hsoub.com/design\nApps: https://academy.hsoub.com/apps\nCertificates: https://academy.hsoub.com/certificates\nDevops: https://academy.hsoub.com/devops\nMarketing: https://academy.hsoub.com/marketing\n'</span></pre>

	<p>
		إذا عاودت تنفيذ الدالة <span style="font-family:courier new,courier,monospace;">read</span> من جديد فإنّ المُخرج سيكون سلسلة نصيّة فارغة'' وهذا يدلّ على أنّنا وصلنا إلى نهاية الملفّ، ولكي تعود إلى بداية الملف من جديد فعليك فتحه مُجدّدا بالدالة <span style="font-family:courier new,courier,monospace;">open</span>.
	</p>
</div>

<div id="wmd-preview-section-65">
	<p>
		كما تُلاحظ فإنّ المُخرجات لا تبدو جميلة أبدا، يُمكنك أن تقرأ أسطر الملف باستخدام جملة <span style="font-family:courier new,courier,monospace;">for</span> عوضا عن الدالة <span style="font-family:courier new,courier,monospace;">read</span> وستكون المُخرجات نظيفة هذه المرّة.
	</p>
</div>

<div id="wmd-preview-section-66">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_63">
<span class="pln">file = open('file.txt', 'r')

for line in file:
    print line</span></pre>

	<p>
		ستكون المُخرجات كالتالي:
	</p>
</div>

<div id="wmd-preview-section-67">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_61">
<span class="pln">Academy: https://academy.hsoub.com/

Freelance: https://academy.hsoub.com/freelance

Entrepreneurship: https://academy.hsoub.com/entrepreneurship

Design: https://academy.hsoub.com/design

Apps: https://academy.hsoub.com/apps

Certificates: https://academy.hsoub.com/certificates

Devops: https://academy.hsoub.com/devops

Marketing: https://academy.hsoub.com/marketing</span></pre>

	<p>
		يُمكنك أيضا تحديد كم من بايت Byte ترغب بقراءته من بداية الملف. فمثلا إذا كنت ترغب بقراءة أول 8 بايت من مُحتويات الملف، فيُمكنك تمرير العدد 8 إلى الدالة <span style="font-family:courier new,courier,monospace;">read</span> كمُعامل:
	</p>
</div>

<div id="wmd-preview-section-68">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_59">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'r')
&gt;&gt;&gt; file.read(8)
'Academy:'
&gt;&gt;&gt; file.close()</span></pre>

	<p>
		المُخرجات ستكون كالتالي (أول 8 أحرف من الملف):
	</p>
</div>

<div id="wmd-preview-section-69">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_20">
<span class="pln">'Academy:'</span></pre>

	<p>
		لاحظ بأنّ البايت الواحد لا يعني دائما الحرف الواحد إذ أنّ هناك استثناءات عديدة، فمثلا في اللغة العربية الحرف الواحد يشغل حوالي 2 بايت أما الأحرف الصينية فتشغل حوالي 3 بايت. في الأحرف الإنجليزية عادة ما يُساوي الحرف الواحد 1 بايت فقط.
	</p>
</div>

<div id="wmd-preview-section-70">
	<h3 id="الدالة-readline">
		الدالة readline
	</h3>

	<p>
		يُمكنك أن تقرأ سطرا واحدا من الملف في كلّ مرّة، وذلك بالاعتماد على جُملة <span style="font-family:courier new,courier,monospace;">readline</span> عوضا عن جملة <span style="font-family:courier new,courier,monospace;">read</span>.
	</p>
</div>

<div id="wmd-preview-section-71">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_57">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'r')
&gt;&gt;&gt; file.readline()

'Academy: https://academy.hsoub.com/\n'

&gt;&gt;&gt; file.readline()

'Freelance: https://academy.hsoub.com/freelance\n'

&gt;&gt;&gt; file.readline()

'Entrepreneurship: https://academy.hsoub.com/entrepreneurship\n'</span></pre>

	<p>
		لاحظ بأنّ المُخرج يكون مُختلفا في كلّ مرّة تُستَدعَى فيها الدالة <span style="font-family:courier new,courier,monospace;">readline</span> إذ أنّ المُخرج يكون سطرا واحدا في كل مرة، وفي المرّة التالية تكون النّتيجة السّطر التالي إلى نهاية الملفّ. في النّهاية سيكون المخرج سلسلة نصيّة فارغة:
	</p>
</div>

<div id="wmd-preview-section-72">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_55">
<span class="pln">&gt;&gt;&gt; file.readline()

'Marketing: https://academy.hsoub.com/marketing\n'

&gt;&gt;&gt; file.readline()

''</span></pre>

	<p>
		إذا أردت العودة إلى بداية الملفّ من جديد فيُمكنك ذلك إما بإغلاق الملف وفتحه من جديد أو باستعمال الدالةّ <span style="font-family:courier new,courier,monospace;">seek</span> مع تمرير عدد البايتات الذي ترغب بتخطّيه، (أي صفرا للعودة إلى بداية الملف).
	</p>
</div>

<div id="wmd-preview-section-73">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_53">
<span class="pln">&gt;&gt;&gt; file.readline()

''

&gt;&gt;&gt; file.seek(0)
&gt;&gt;&gt; file.readline()

'Academy: https://academy.hsoub.com/\n'</span></pre>

	<p>
		يُمكن مثلا العودة إلى أول 8 بايت من الملف بالطّريقة التالية:
	</p>
</div>

<div id="wmd-preview-section-74">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_51">
<span class="pln">&gt;&gt;&gt; file.seek(8)
&gt;&gt;&gt; file.readline()

' https://academy.hsoub.com/\n'</span></pre>

	<p>
		يُمكنك أن تعتمد على الدالة tell لتعرف مركز القراءة الحالي.
	</p>
</div>

<div id="wmd-preview-section-75">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_49">
<span class="pln">&gt;&gt;&gt; file.seek(66)
&gt;&gt;&gt; file.tell()
66</span></pre>

	<p>
		تقبل الدّالة <span style="font-family:courier new,courier,monospace;">readline</span> مُعاملا لتحديد عدد البايتات المرغوب قراءتها (تماما مثل شقيقتها <span style="font-family:courier new,courier,monospace;">read</span>).
	</p>
</div>

<div id="wmd-preview-section-76">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_47">
<span class="pln">&gt;&gt;&gt; file.seek(0) # للعودة إلى بداية الملف
&gt;&gt;&gt; file.readline(8)
'Academy:'</span></pre>

	<h3>
		الدالة readlines
	</h3>
</div>

<div id="wmd-preview-section-77">
	<p>
		تُعتبر الدالة <span style="font-family:courier new,courier,monospace;">readlines</span> طريقة أخرى لقراءة الملف، وتُرجع قائمة بجميع الأسطر التي يحتويها الملف:
	</p>
</div>

<div id="wmd-preview-section-78">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_22">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'r')
&gt;&gt;&gt; file.readlines()</span></pre>

	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_24">
<span class="pln">['Academy: https://academy.hsoub.com/\n', 'Freelance: https://academy.hsoub.com/freelance\n', 'Entrepreneurship: https://academy.hsoub.com/entrepreneurship\n', 'Design: https://academy.hsoub.com/design\n', 'Apps: https://academy.hsoub.com/apps\n', 'Certificates: https://academy.hsoub.com/certificates\n', 'Devops: https://academy.hsoub.com/devops\n', 'Marketing: https://academy.hsoub.com/marketing']</span></pre>

	<p>
		يُمكنك مثلا حساب عدد أسطر ملفّ ما بحساب عدد عناصر القائمة بالدالة <span style="font-family:courier new,courier,monospace;">len</span>:
	</p>
</div>

<div id="wmd-preview-section-79">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_45">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'r')
&gt;&gt;&gt; len(file.readlines())
8</span></pre>

	<h2>
		إغلاق الملف
	</h2>
</div>

<div id="wmd-preview-section-80">
	<p>
		رغم أنّ عمليّة إغلاق الملف ليست ضرورية لحفظ التّغييرات، إلّا أنّ القيام بالأمر منصوح به بشدّة، لذلك يجب عليك أن تتأكّد من أنّ الملفّ قد أُغلق بعد انتهائك من إجراء العمليّات على الملف. لقد تعرّفنا من قبل على كيفيّة إغلاق الملف:
	</p>
</div>

<div id="wmd-preview-section-81">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_177_26">
<span class="pln">&gt;&gt;&gt; file = open('file.txt')
&gt;&gt;&gt; file.close()</span></pre>

	<p>
		للتحقق من أنّ الملف مُغلق يُمكن أن تستعين بالجملة <span style="font-family:courier new,courier,monospace;">closed</span> والتي تُرجع قيمة منطقية (إما True أو False). إذا كان الملف مُغلقا فسترجع الجملة True أما إذا لم يكن مغلقا فستُرجع الجملة False.
	</p>
</div>

<div id="wmd-preview-section-82">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_41">
<span class="pln">&gt;&gt;&gt; file = open('file.txt') # فتح الملف
&gt;&gt;&gt; file.closed   # التحقق من أنّ الملف مُغلق
False
&gt;&gt;&gt; file.close()  # إغلاق الملف
&gt;&gt;&gt; file.closed   # التحقق من جديد
True</span></pre>

	<p>
		يُمكن كذلك الاستعانة بالجملة <span style="font-family:courier new,courier,monospace;">with as </span>لفتح ملف والقيام بعمليات ثم إغلاقه آليا.
	</p>
</div>

<div id="wmd-preview-section-83">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_43">
<span class="pln">with open('file.txt', 'r') as file:
    file.read()</span></pre>

	<p>
		الملف يُغلق ذاتيا بعد انتهاء الجزء المُزاحِ (ذو الإزاحة) من الشيفرة، ويُمكنك التأكّد من الأمر بالجملة <span style="font-family:courier new,courier,monospace;">closed</span>.
	</p>
</div>

<div id="wmd-preview-section-84">
	<h2 id="الدوال-المساعدة">
		الدوال المساعدة
	</h2>

	<p>
		بعد فتح الملف يُمكنك الحصول على معلومات حول الملف ببعض الدوال المبنية مُسبقا Built-in functions وهي كالتالي:
	</p>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">closed</span>: التحقق من ما إذا كان الملف مُغلقا أو لا (انظر الفصل السابق).
		</li>
		<li>
			<span style="font-family:courier new,courier,monospace;">name</span>: الحصول على اسم الملفّ.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-85">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_39">
<span class="pln">&gt;&gt;&gt; file = open('file.txt')
&gt;&gt;&gt; file.name
'file.txt'</span></pre>

	<ul>
<li>
			<span style="font-family:courier new,courier,monospace;">mode</span>: الحصول على نمط الوصول.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-86">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_37">
<span class="pln">&gt;&gt;&gt; file = open('file.txt', 'w+')
&gt;&gt;&gt; file.mode
'w+'</span></pre>

	<h2>
		تمارين
	</h2>
</div>

<div id="wmd-preview-section-88">
	<h3 id="تمرين-1">
		تمرين 1
	</h3>

	<p>
		اكتب برنامجا للحصول على قيم من المُستخدم وأدخلها إلى ملف نصي.
	</p>
</div>

<div id="wmd-preview-section-89">
	<h3 id="تمرين-2">
		تمرين 2
	</h3>

	<p>
		صحّح الخطأ في ما يلي:
	</p>
</div>

<div id="wmd-preview-section-90">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_35">
<span class="pln">file = open('file.txt', 'r')
file.write('Hello World!')</span></pre>

	<h3>
		تمرين 3
	</h3>
</div>

<div id="wmd-preview-section-91">
	<p>
		صحّح الخطأ في ما يلي:
	</p>
</div>

<div id="wmd-preview-section-92">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1014_33">
<span class="pln">file = open('file.txt', 'w')
file.write('Hello World!')
file.close()
file.write('Hello!')</span></pre>

	<h3>
		تمرين 4
	</h3>
</div>

<div id="wmd-preview-section-93">
	<p>
		اكتب برنامج تسجيل الدخول في الدروس السابقة ليقبل ملفّا كقاعدة بيانات. (احفظ اسم المُستخدم وكلمة المرور في الملف عوضا عن الذاكرة.)
	</p>

	<h2>
		المصادر المعتمدة
	</h2>

	<ul>
<li>
			<a href="https://docs.python.org/3/library/functions.html#open" rel="external nofollow">التوثيق الرّسمي للغة بايثون، فصل الدوال المبنية مُسبقا، الدالة open</a> 
		</li>
		<li>
			كتاب <a href="http://anandology.com/python-practice-book/index.html" rel="external nofollow">Python Practice Book</a> لكاتبه Anand Chitipothu
		</li>
		<li>
			<a href="https://docs.python.org/2/library/string.html" rel="external nofollow">التوثيق الرّسمي للغة بايثون، فصل السلاسل النّصيّة</a>
		</li>
	</ul>
</div>
]]></description><guid isPermaLink="false">306</guid><pubDate>Thu, 31 Mar 2016 22:33:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x632;&#x62E;&#x631;&#x641;&#x627;&#x62A; (Decorators) &#x641;&#x64A; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B2%D8%AE%D8%B1%D9%81%D8%A7%D8%AA-decorators-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r303/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/python-decorators.png.871f94804123d8d6c63aad9bcf3aa120.png" /></p>
<div id="wmd-preview-section-17">
	<p id="المزخرفات-decorators">
		المُزخرفات من أعظم <a href="https://academy.hsoub.com/programming/python/%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86/" rel="">مميزات لغة بايثون</a>، إذ تساعدك على بناء برنامجك باحترافية أكثر موفرة طريقة بسيطة لإضافة خاصيات جديدة للدالة. وهي ببساطة دوال تستطيع أن تعدل على دوال أخرى.
	</p>

	<p style="text-align: center;">
		<img alt="python-decorators.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14523" data-unique="x75dsiqka" src="https://academy.hsoub.com/uploads/monthly_2016_03/python-decorators.png.be1d164287518cfedc722d6a20ec1109.png">
	</p>
</div>

<div id="wmd-preview-section-19">
	<h2 id="تذكير-ببعض-المفاهيم-الأساسية">
		تذكير ببعض المفاهيم الأساسية
	</h2>

	<p>
		إذا لم تكن تعرف شيئا عن الدوال في لغة <a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">بايثون </a>فيجب عليك العودة للدرس السابق <a href="https://academy.hsoub.com/programming/python/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-functions-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r292/" rel="">الدوال في بايثون</a> قبل أن تكمل قراءة هذا الدرس. 
	</p>

	<p>
		تُعتبر الدوال في لغة بايثون كائنات من نوع الفئة الأولى أو First class objects. ما يعني أنّنا نستطيع القيام بالعديد من العمليات، وهي كالتالي:
	</p>

	<ul>
		<li>
			يُمكنك تعريف دالة داخل دالة أخرى
		</li>
		<li>
			يُمكنك أن تستدعي دالة داخل أخرى
		</li>
		<li>
			يُمكنك أن تقوم بتمرير دالة كمُعامل لدالة أخرى
		</li>
		<li>
			يُمكنك أن تُسند دالة لمُتغير
		</li>
		<li>
			يُمكنك إرجاع دالة داخل دالة أخرى
		</li>
	</ul>

	<p>
		بما أنّ المُزخرفات مُجرّد دوال فعلينا أن نبدأ من الأساس، لاحظ الدالة التالية:
	</p>
</div>

<div id="wmd-preview-section-20">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_8"><span class="pln">def say_hello():
    print 'Hello!'</span></pre>

	<p>
		عند استدعاء الدالة ستُطبع القيمة Hello على الشاشة، هذا ليس بالأمر المُعقد، الآن ماذا لو أردنا أن نعدل الدالة في جزء آخر من البرنامج لكي تطبع أشياء أخرى وتؤدي أغراضا أخرى قبل استدعاء الدالة أو بعد ذلك؟ يُمكن أن نعدّل الدالة مُباشرة، لكن هذا الأمر سيغير من طريقة سير البرنامج، إذ نريد أن نعدل الدالة في منطقة واحدة فقط من البرنامج وليس في كامل البرنامج، هذه المسألة تُحل بالمُزخرفات، وكما يدل اسمها فهي دوال تُزيّن وتُزخرف الدالة الأصلية، أي تُضيف عليها مهاما أخرى.
	</p>

	<p>
		سننشئ لهذه الدالة الآن مُزخرفا Decorator يقوم بطباعة Before قبل تنفيذ الدالة و After بعد تنفيذ الدالة، وذلك دون تعديل الدالة مُباشرة. انظر المثال التالي:
	</p>
</div>

<div id="wmd-preview-section-21">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_10"><span class="pln">def decorator(function):
    def function_decorator():
        print 'Before'
        function()
        print 'After'
    return function_decorator</span></pre>

	<p>
		الشيفرة أعلاه عبارة عن دالة تقبل دالة أخرى (الدالة التي نرغب بزَخرَفَتِها أو تزيينها) كمُعامل وبعدها نقوم بإنشاء دالة داخل هذه الدالة لطباعة القيمة Before ثم استدعاء الدالة الأصلية (المُعامل) بعدها طباعة After وأخيرا إرجاع الدالة الجديدة (وهي نُسخة مزخرفة من الدالة الأصلية). بعدها يُمكننا أن نستخدم هذا المُزخرف لزخرفة أي دالة مهما كانت، انظر المثال التالي:
	</p>
</div>

<div id="wmd-preview-section-22">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_12"><span class="pln"> # -*- coding: utf-8 -*-  
def decorator(function):      # إنشاء الدالة المسؤولة عن الزخرفة
    def function_decorator():    # إنشاء الدالة التي ستكون نسخة مزخرفة من الدالة المُمرّرة في كمُعامل
        print 'Before' # طباعة جملة قبل تنفيذ الدالة
        function()     # استدعاء الدالة
        print 'After'
    return function_decorator # إرجاع الدالة مُزَخْرَفَةً
def say_hello(): # إنشاء دالة عادية
    print 'Hello!'
say_hello = decorator(say_hello) # زخرفة الدالة
say_hello() # استدعاء النُسخة المُزخرفة من الدالة</span></pre>

	<p>
		توفر لنا لغة بايثون طريقة أكثر مرونة لزخرفة الدوال، وهي بوضع اسم المُزخرف مسبوقا بالحرف @ قبل تعريف الدالة. أي أنّ السّطر التالي:
	</p>
</div>

<div id="wmd-preview-section-23">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_14"><span class="pln">def say_hello(): 
    print 'Hello!'
say_hello = decorator(say_hello) # زخرفة الدالة</span></pre>

	<p>
		يُمكن أن يكون كالتالي:
	</p>
</div>

<div id="wmd-preview-section-24">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_16"><span class="pln">@decorator
def say_hello(): # إنشاء دالة عادية
    print 'Hello!'</span></pre>

	<p>
		وبالتالي سنتمكن من زخرفة أي دالة نرغب بزخرفتها كالتالي:
	</p>
</div>

<div id="wmd-preview-section-25">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_18"><span class="pln">@decorator
def say_hello(): 
    print 'Hello!'
@decorator
def say_hi(): 
    print 'Hi!'
@decorator
def say_name(): 
    print 'Abdelhadi!'
say_hello()
say_hi()
say_name()</span></pre>

	<p>
		عند تنفيذ الشيفرة أعلاه ستكون المخرجات كالتالي:
	</p>
</div>

<div id="wmd-preview-section-26">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_20"><span class="pln">Before
Hello!
After

Before
Hi!
After

Before
Abdelhadi!
After</span></pre>

	<p>
		<strong>مُلاحظة</strong>: إذا كانت للدالة معاملات فما عليك إلا استخدام args* التي سبق وتحدثنا عنها في الدرس السابق.
	</p>
</div>

<div id="wmd-preview-section-28">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_26"><span class="pln"> # -*- coding: utf-8 -*-  
def decorator(function):      # إنشاء الدالة المسؤولة عن الزخرفة
    def function_decorator(*args):  # إنشاء الدالة التي ستكون نسخة مزخرفة من الدالة المُمرّرة كمُعامل
        print 'Before' # طباعة جملة قبل تنفيذ الدالة
        function(*args)     # استدعاء الدالة
        print 'After'
    return function_decorator # إرجاع الدالة مُزَخْرَفَةً</span></pre>

	<p>
		لاحظ الدالتين <span style="font-family:courier new,courier,monospace;">function_decorator</span> و <span style="font-family:courier new,courier,monospace;">function</span>.
	</p>
</div>

<div id="wmd-preview-section-29">
	<h2 id="أمثلة-على-المزخرفات-في-لغة-بايثون">
		أمثلة على المزخرفات في لغة بايثون
	</h2>

	<p>
		إذا فهمت مبدأ المزخرفات فستستطيع أن تتعامل مع الدوال بمرونة عالية، وإليك بعض الأمثلة لاستخدام المُزخرفات لتأدية بعض المهام البسيطة:
	</p>
</div>

<div id="wmd-preview-section-30">
	<h3 id="حساب-مدة-تنفيذ-دالة">
		حساب مدة تنفيذ دالة
	</h3>

	<p>
		إذا فهمت جيدا مبدأ المُزخرفات فستلاحظ بأنّك تستطيع تنفيذ مهام قبل تنفيذ الدالة ومهام بعد تنفيذها، ومما سبق نستنتج بأنّنا نستطيع أن نقوم بحفظ الوقت الحالي في مُتغير ثم تنفيذ الدالة وبعدها نقوم بحساب الفرق بين الوقت السابق والوقت الحالي، ما سيُرجع المُدة المُستغرقة لتنفيذ الدالة. البرنامج التالي مثال على مُزخرف لحساب مُدة دالة تطبع الجملة !Hello World مليون مرّة.
	</p>
</div>

<div id="wmd-preview-section-31">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_28"><span class="pln"># -*- coding: utf-8 -*-
import time # جلب مكتبة الوقت لاستعمال دوال الوقت
def function_time(function):
    def function_decorator(*args):
        start_time = time.time() # الحصول على وقت البداية
        function(*args)
        end_time = time.time() # الحصول على الوقت بعد نهاية التنفيذ
		# طباعة اسم الدالة والفرق بين وقت البداية ووقت النهاية 
        print '%s function took %0.3f s' % (function.func_name, (end_time - start_time)) 

    return function_decorator # إرجاع الدالة مُزَخْرَفَةً
# زخرفة الدالة المسؤولة عن الطباعة مليون مرة
@function_time
def print_million_times():
    for i in range(0, 1000000):
        print 'Hello World! 1,000,000 times!'

print_million_times()</span></pre>

	<p>
		البرنامج أعلاه سيطبع الجملة مليون مرة ثم يعرض الوقت المُستغرق لإنجاز العملية. الجملة الأخيرة ستكون شيئا كالتّالي:
	</p>
</div>

<div id="wmd-preview-section-32">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_30"><span class="pln">print_million_times function took 69.584 s</span></pre>

	<p>
		<strong>ملاحظات:</strong>
	</p>
</div>

<div id="wmd-preview-section-33">
	<ul>
		<li>
			نستعمل التابع <span style="font-family:courier new,courier,monospace;">func_name</span> للحصول على اسم الدالة المُمررة كمعامل، ويكون على شكل سلسلة نصية. 
		</li>
		<li>
			نستعمل الجملة <span style="font-family:courier new,courier,monospace;">time.time</span> للحصول على الوقت بالثواني، عدد الثواني الذي تنتجه الجملة هو عدد الثواني الذي مرّ منذ سنة 1970. 
		</li>
		<li>
			يُمكنك استعمال هذا المُزخرف مع أي دالة تريد فقط اكتب اسم المُزخرف مسبوقا بالحرف @ ثم عرف الدالة بعده، وستحصل على الوقت المُستغرق لتنفيذ الدالة.
		</li>
	</ul>
</div>

<div id="wmd-preview-section-34">
	<h3 id="حساب-عدد-مرات-استدعاء-دالة">
		حساب عدد مرات استدعاء دالة
	</h3>

	<p>
		يُمكننا أن نستخدم المُزخرفات للحصول على عدد المرات التي استدعيت فيها دالة ما في برنامج مُعيّن، بحيث يحمل متغير قيمة العدد صفر، وفي كل مرة تستدعى فيها الدالة، فإن المُتغير يحمل القيمة مع زيادة بالعدد واحد، انظر المثال التالي.
	</p>
</div>

<div id="wmd-preview-section-35">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_32"><span class="pln"># -*- coding: utf-8 -*-
# متغير العد
n = 0
# المُزخرف
def call_times(function):
    def decorated():
        function() # استدعاء الدالة
        global n   # جعل مُتغير العدّ عالميا
        n += 1     # زيادة قيمة المُتغير
        print 'Function was called', n, 'times' # طباعة قيمة المُتغير
    return decorated

@call_times # زخرفة الدالة
def func(): # إنشاء الدالة
    print 'Hello!'
# استدعاء الدالة
func()
func()
func()
func()</span></pre>

	<p>
		مُخرجات البرنامج أعلاه ستكون كالتالي:
	</p>
</div>

<div id="wmd-preview-section-36">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_34"><span class="pln">Hello!
Function was called 1 times
Hello!
Function was called 2 times
Hello!
Function was called 3 times
Hello!
Function was called 4 times</span></pre>

	<p>
		يُمكنك إصلاح الجمل من الناحية اللغوية بإضافة بعض العبارات الشرطية للبرنامج.
	</p>
</div>

<div id="wmd-preview-section-37">
	<h3 id="إنشاء-مزخرف-لتنفيذ-دالة-عند-تحقق-شرط-معين-فقط">
		إنشاء مزخرف لتنفيذ دالة عند تحقق شرط معين فقط
	</h3>

	<p>
		يُمكنك أن تستعمل دالة تسجيل الدخول التي قُمنا بإنشائها كمُزخرف للدوال التي تحتاج لأن يكون المُستخدم مُسجلا دخوله. مثلا لنقل بأنّنا نريد أن نعرض على المُستخدم عدة خيارات بعضها يحتاج إلى تسجيل دخول المُستخدم وبعضها لا. 
	</p>

	<p>
		الخيارات كالتّالي: 
	</p>

	<ol>
		<li>
			تسجيل مُستخدم جديد (تسجيل الدخول غير مطلوب) 
		</li>
		<li>
			طباعة جملة عشر مرات ( تسجيل الدخول غير مطلوب) 
		</li>
		<li>
			الحصول على الوقت الحالي ( تسجيل الدخول غير مطلوب) 
		</li>
		<li>
			طباعة اسم المُستخدم (تسجيل الدخول مطلوب) 
		</li>
		<li>
			رؤية معلومات الحساب (تسجيل الدخول مطلوب) 
		</li>
		<li>
			تعديل كلمة المرور (تسجيل الدخول مطلوب)
		</li>
	</ol>

	<p>
		مبدأ عمل البرنامج سيكون كالتالي: 
	</p>

	<ol>
		<li>
			إنشاء الدوال المسؤولة عن الخيارات 
		</li>
		<li>
			عرض الخيارات على المُستخدم 
		</li>
		<li>
			زخرفة الدوال التي تطلب تسجيل المُستخدم بمُزخرف تسجيل الدخول 
		</li>
		<li>
			المُزخرف سيتحقق من أنّ المُستخدم قد سجل دخوله، إذا كان الأمر كذلك، تنفّذ الدالة وإذا لم يتحقق الشرط فلا تنفذ.
		</li>
	</ol>

	<p>
		لنقل بأنّ اسم مُزخرف التحقق من تسجيل الدخول هو <span style="font-family:courier new,courier,monospace;">is_user_logged_in</span>، ستكون الدوال التي تطلب تسجيل الدخول مُزَخْرَفَةً كالتالي:
	</p>
</div>

<div id="wmd-preview-section-38">
	<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3941_36"><span class="pln">@if_user_logged_in
def account_info():
    print 'Username:', username, 'Password:', password</span></pre>

	<h2>
		تمارين
	</h2>
</div>

<div id="wmd-preview-section-40">
	<h3 id="تمرين-1">
		تمرين 1
	</h3>

	<p>
		أنشئ دالة للجمع بين عددين، وبعدها أنشئ مُزخرفا يقوم بمُضاعفة النتيجة.
	</p>
</div>

<div id="wmd-preview-section-41">
	<h3 id="تمرين-2">
		تمرين 2
	</h3>

	<p>
		أنشئ دالة للحصول على قيم من المُستخدم وقم بزخرفة لطباعة جملة ترحيب قبل استدعاء الدالة وجملة توديع بعد استدعاءها.
	</p>
</div>

<div id="wmd-preview-section-42">
	<h3 id="تمرين-3">
		تمرين 3
	</h3>

	<p>
		أكمل البرنامج الخاص بالمثال الثالث (إنشاء مُزخرف لتنفيذ دالة عند تحقق شرط مُعين فقط). تفاصيل التمرين موجودة بالمثال.
	</p>
</div>
]]></description><guid isPermaLink="false">303</guid><pubDate>Mon, 28 Mar 2016 22:10:00 +0000</pubDate></item></channel></rss>
