دورة في أساسيات لغة البرمجة python بايثون [للمكفوفين]

دورة في أساسيات لغة البرمجة بايثون python
حياكم الله زوار موقعنا

في هذه الصفحة تُتابِعون الدورة الخاصة بأساسيات لغة البرمجة بايثون python التي قدمها لكم الأستاذ صلاح البرعصي من عدة سنوات، ولكن بعد التعديل والإضافات الصغيرة لجعلها متوافقة مع الإصدار 3 من اللغة.
يُمكنُكم التنقل بين الدروس بالرقم 2
والتنقُل بين ملحقات الدروس بالرقم 3
أو التنقُل على جميع العناوين بحرف h.

المقدمة:


لغة بايثون هيإحدَى لُغات البرمجة الكائنية مفتوحة المصدر, تم إطلاقها بشكل رسمي عام 1991 مصمِّمُها الهولندي جوايد فان روسم المولود سنة 1960 والمتحصل على شهادة الماجستير من جامعة أمستردام عام 1982, 
كُتِبَتْ نواة هذه اللغة بلغة c وهي متأثرة جداً للغة جافا, أطلقَ عليها مصممها اسم بايثون مستوحياً الاسم من اسم فرقة كوميدية انكليزية تُدعى مونتي بايثون. 
استخداماتها:
تُستخدم بايثون على نطاق واسع في جوجل وناسا، كما أنها قد استخدمت في برمجة أحد المشاريع العملاقة هو مشروع زوب Zope، كما تستخدم في العديد من المشاريع والتطبيقات المنتشرة عالمياً مثل مشروع بلندر blender وهو 
أحد برامج التصميم ثلاثية الأبعاد الشهيرة.
لقد أُدمِجَت بايثون بنجاح كلغة برمجة في العديد من التطبيقات والحزمات، وهي تستخدم بكثرة في تطبيقات التصميم ثلاثي الأبعاد مثل مايا Maya، سوفت اميدج إكس إس آي Softimage|XSI، وبالطبع بليندر Blender.
كما أنها تُستخدم في أنظمة التشغيل المختلفة مثل أغلب توزيعات لينكس ونظام ماك أو إس إكس, كلغة برمجة نصية Scripting Language
•برنامج Maya لعمل التصاميم ثلاثية الأبعاد.
•برنامج Blender لعمل التصاميم ثلاثية الأبعاد.
•Softimage XSI لعمل التصاميم ثلاثية الأبعاد.
•Civilization IV اللعبة الإستراتيجية المعروفة.
•Stackless Python عمل سكربتات لأشهر الألعاب الإلكترونية المعروفة مثل EVE Online, Civilization IV, Second Life.
•ArcGIS برنامج لعمل الخرائط الجغرافية.
•OpenOffice.org حزمة برامج مكتبية مفتوحة المصدر.
•PyMol عمل تصاميم ثلاثية الأبعاد لأغراض علمية.
•GIMP برنامج رسوميات مفتوح المصدر.
نلاحظ إخوتي الفرق الكبير بين سكربتات الجوز ولغة بايثون فعند تعلمك للغة بايثون فأنت أمام آفاق رحبة من حيث إمكانية تعلم لغات أخرى بكل سهولة مثل الجافا وكذلك يسعك الاكتفاء بهذه اللغة وتصمم برامجك كما تشاء, 
فهذه اللغة يمكن استخدامها في إنشاء تطبيقات سطح المكتب أي التطبيقات العادية مثل برامج الميديا والألعاب ومنظومات المؤسسات والشركات, كما أنها تُستَخدم في تطبيقات الويب وصفحاته وَتُستَعمَل في برمجة الشبكات باختصار هي مستخدمة في كل مناحي البرمجة ولا ننسى برمجة الموبايل أيضاً, فهناك مكتبة خاصة بتطبيقات إندرويد.
في الدرس القادم سنبدأ الجانب العملي من الدراسة ولا نحتاج لتثبيت لغة بايثون أو أي محرر, كل ما نحتاجه في الوقت الحاضر نسخة من برنامج NVDA مثبّتَة أو محمولة لا فرق.انتظرونا لنلجَ هذا العالم الممتع في أول درس.
لا تنسَ ذِكرَ الله.

	

الدرس الأول: أمر الطباعة print


أمر الطباعة print
بسم الله الرحمن الرحيم.
في البداية دعونا نتفق على المكان الذي سنكتُب فيه أكوادِنا، ولأننا ما زلنا في البداية أُفَضِل أن نعتمد على بوابة nvda لسهولة العمل فيها وقراءة النتائج وما إلى ذلك، وسنتحدث لاحقا عن تثبيت اللغة على أجهزتنا والتعامل معها من خلال المحرِرات الأخرى.
وقبل البدء في هذا الدرس علينا معرفة وضبط بعض الأُمور.
1 لفتح بوابة nvda نضغط الاختصار التالي: nvda+control+z, أو نصل لها عن طريق فتح محاورة nvda بالضغط على مفتاح الإدراج إنسرت مع حرف n ثم ننزل إلى أدوات ونختارها من هناك.
2 علينا عمل وضع خاص بnvda ونقوم فيه بتفعيل قِراءة جميع علامات الترقيم، وهذا عن طريق فتح الأوضاع ونحن داخل البوابة بضغط الاختصار التالي: nvda+control+p ثم نتحرك تاب حتى نصل إلى جديد ونفتحها ونتحرك تاب سنجد مجموعة أزرار نتحرك بالسهم السفلي حتى نسمع التطبيق المستخدم حاليا نضغط إنتر ستختفي هذه المحاورة بعدها نضغط nvda+p يعني إنسرت مع حرف ح حتى يقول "مستوى قراءة الرموز كل"، وهذا لنتمكن من سماع كل ما نكتبه بشكلٍ أوضح.
3 تفعيل خاصية الصفير عند الحروف الكبيرة ويتم هذا من محاورة إعدادات الصوت التي نفتحها بnvda+control+v، وهذا لأن هذه اللغة حساسة جدا لحالة الحروف ولو أننا كتبنا حرف كبير بدل صغير سيظهر لنا أخطاء. 
4 تعوَد إذا بدأت في قِراءة سطر برمجي أن تقرأه حرفا حرفا وتستوعبه جيدا ثم تقوم بتطبيقه حتى لو شعرت بأنه سهلا، عليك تطبيقه قبل الانتقال إلى غيره.
في درسِنا هذا سنتعلم شيئا سهلا وبسيطا وهو أمر الطباعة print، وهذا الأمر نستخدمه فقط لإظهار بعض النتائج على الشاشة أثناء إعداد البرامج لكنه لا يظهر للمستخدِم العادي بعد تنفيذ البرنامج.
الآن لنتعرف عليه أكثر كيف يعمل وماذا يطبع بالضبط:
print، ويجب أن يكون هكذا بحروف صغيرة علينا أيضا أن لا نترك مسافات قبله إطلاقا ثم نترك مسافة واحدة بعده وهذه للتنظيم فقط يمكننا عدم تركِها لن تظهر أخطاء، ثم نفتح قوس هكذا ( ونكتبه باستخدام شفت مع رقم 9 ثم نكتب علامة التنصيص باستخدام شفت مع حرف الطاء ونكتُب أي نص نريده ثم نغلق التنصيص بنفس الاختصار الذي فتحناه به ونغلق القوس بشفت ورقم 0 هكذا ) 
ونحرِص على أن تكون لغة لوحة المفاتيح على الإنجليزية دائما حتى إذا كتبنا نص بالعربية نرجعها إلى الإنجليزية مباشرةً.
ولمعرفة نتيجة ما كتبناه نضغط مفتاح f6  وللرجوع إلى مكان الكتابة مرة أخرى نضغط نفس المفتاح f6.
هكذا انتهى الدرس لنرى بعض الأمثلة:
print ("السلام عليكم")
يعني طلبنا طباعة السلام عليكم على الشاشة لنرى النتيجة بالضغط على f6:
>>> print ("السلام عليكم")
هذه العلامات >>> تعني أنه تم كتابة الكود ولا تعني أنهُ صحيحا أو أنهُ تم تنفيذه.
لننزل إلى السطر الموالي سنجد
السلام عليكم
أي أنهُ تم تنفيذ الكود وهو طباعة جملة السلام عليكم.
مثال آخر:
print ("very good")
النتيجة:
>>> print ("very good")
very good
هكذا انتهى الأمر، عزيزي القارئ حاول طباعة كلمات وجمل عربية وإنجليزية حتى تتعود الأمر، وإلى لقاءٍ آخر بإذن الله.
لا تنسَ ذِكْرَ الله.

الدرس الثاني: أنواع البيانات


ما المقصود بأنواع البيانات؟
إخوتي الكرام لاحِظُوا أن أيَّ لغة في العالم أقصد اللغات المحكية وليس البرمجية أي لغة تحوي مفردات وهذه المفردات ليستْ نوعاً واحداً فهناك في اللغة العربية تقسيم معروف للمفردات يقول صاحب الألفية:
كَلامُنَا لَفْظٌ مفيدٌ كَاسْتَقِمْ ***اسمٌ وفعلٌ ثُمَّ حرفٌ الكَلِم.
إذاً الكلام العربي ينقسم إلى اسم وفعل وحرف فإلى كم قسم تنقسم البيانات في بايثون؟
الحقيقة إنه لا حصر لها فهي لغة مفتوحة يمكن لأي شخص أن يضيف نوع جديد من البيانات لكننا سندرس أهم تلك البيانات وسنبدأ بالسلسلة النصية.
السلسلة النصية: string
تعارَفَ العرب على تسميتها بِعدة أسماء فمنهم مَن يسميها سلسلة حرفية أو محارف أو نص أو سلسلة نصية فما شكلها ؟
أي نص نجده بين علامَتَيْ تنصيص كالكلمات التي قمنا بطباعتها في الدرس الماضي، وإليكم مثالا آخر:
"jaws, NVDA, vergo, windowEyes, suberNova"
المثال السابق كان عبارة عن سلسلة حرفية تتضمن أسماء لقارئات شاشة معروفة, والآن لِنَطْبَعْ هذه السلسلة، فما هو أمر الطباعة؟ 
نعم إجابتكم صحيحة print
print("jaws, NVDA, vergo, windowEyes, suberNova")
اقرأ الكود جيدا ثم قم بتطبيقه على البوابة، طبقه كما هو أولا ثم حاول تطبيق أشياء مُشابِهة.
النتيجة:
>>> print "jaws, NVDA, vergo, windowEyes, suberNova"
jaws, NVDA, vergo, windowEyes, suberNova
تأمّلُوا معي النتيجة نجد في السطر الأول الكود وتحته نتيجة أمر الطباعة 
لنتأملّها بدقة أكثر, ماذا تلاحظ؟
نلاحظ أسماء قارئات الشاشة ولكن بدون علامات تنصيص، نعم الإجابة صحيحة, علامات التنصيص يجب كتابتُها في الكود ولا تخرج في النتيجة.
كما أنهُ يمكنُنا كتابة السلاسل النصية بين علامتَيْ '' أي حرف الطاء واللوحة إنجليزية بدون الشفت.
وهذه الطريقة تمكننا من طباعة سلسلة نصية مكونة من سطر واحد فقط أما إذا كانت مكونة من عدة أسطُر فنكتب ثلاث علامات تنصيص قبل النص وبعده أو ثلاث علامات ' أيضا قبل النص وبعده.
print ("""كيف حالَكُم يا قوم؟
الحمدُ لله إننا بخير""")
النتيجة:
>>> print ("""كيف حالَكُم يا قوم؟
... الحمدُ لله إننا بخير""")
كيف حالَكُم يا قوم؟
الحمدُ لله إننا بخير
وبالطبع نضغط مفتاح الإدخال إنتر بين كل سطر والثاني فهذه هي الطريقة نفسها إذا كان سطرين أو أكثر.
إضافةً إلى ذلك فإن السلسلة النصية قد تحتوي على أرقام أو رموز أو أي شيء شريطة أن تكون بين التنصيص.
مثال آخر:
print ("1234")
الآن نتعرف على نوع مختلف من البيانات وهو:
السلسلة العددية الصحيحة: integer.
وهذه سهلة جدا وتعني أي عدد بدون علامات قبله ولا بعده مثل:
2
4
46
234
ويمكنُنا طباعتها هكذا:
print(36)
أما النوع الثالث من البيانات الذي سنتعرف عليه في هذا الدرس هو:
السلسلة العددية العائمة: float.
وهذه أيضا تُشبِه السلسلة العددية مع إضافة العلامة العشرية مثل:
1.4
3.5
print(2.4)
ويمكننا الجمع بين طباعة نوعين من البيانات بالفصل بينهما بفاصلة هكذا:
print ("درسنا بعض أنواع البيانات عددها:", 3)
ننتبه لكتابة الفاصلة الإنجليزية التي تُكتَب بحرف واو واللوحة إنجليزية ولا نترك مسافة قبلها بل بعدها فقط.
print ("تخرجتُ في الجامعة عام", 2014)
علينا تحويل لغة الكتابة إلى الإنجليزية مباشرةً بعد كتابة أي نص عربي حتى نتمكن من كتابة علامات الترقيم بالإنجليزية.
print ("ثلاثة ونصف=", 3.5)
الواجب
1 اطبع سلسلة نصية مكونة من ثلاثة أسطُر بأمر طباعة واحد.
2 اكتبثلاث  أوامر طباعة كل منهم يطبع نوع مختلف من البيانات
3 قم بطباعة ثلاثة أنواع من البيانات بأمر طباعة واحد.

وإلى لقاءٍ آخر بمشيئةِ الرحمن.
لا تنسَوْا ذِكْرَ الله.

إجابة الأسئلة:
الأول:
print("""بسم الله الرحمن الرحيم.
هذا أمر طباعة مُكَوَن من عدة أسطُر،
نكتُب فيه ما نريد ونضغط إنتر بين كل سطر وآخر""")
بسم الله الرحمن الرحيم.
هذا أمر طباعة مُكَوَن من عدة أسطُر،
نكتُب فيه ما نريد ونضغط إنتر بين كل سطر وآخر

الثاني:
print ("هذه سلسلة نصية")
هذه سلسلة نصية
print (45)
45
طباعة العدد الصحيح
print (32.5)
32.5
طباعة لسلسلة عددية عائمة.

الثالث:
print (4, "sound ", 22.4)
4 sound  22.4
وإلى لقاءٍ آخر بإذن الله.

الدرس الثالث: العمليات الحسابية


أسعد الله أوقاتكم بذِكْرِ الله.
في هذا الدرس سنتعلم العمليات الحسابية الجمع والطرح والضرب والقسمة.
لنتعرف أماكنهم على لوحة المفاتيح:
الزائد: علامة يساوي مع الشفت.
الناقص: الزر الذي يلي رقم صفر مباشرةً في صف الأرقام ويقول عنه القارئ شَرطة.
علامة الضرب: رقم 8 مع الشفت.
علامة القسمة: حرف الظاء واللوحة إنجليزي أو شفت مع حرف الميم واللوحة عربية.
الآن لنتعامل مع السلاسل العددية الصحيحة والعائمة فنحن درسنا أنواع البيانات ونعرف الفرق بينهم جيدا.
الجمع:
جربوا هذه العمليات على البوابة:
2+3
1.5+4
النتائج ستظهر لنا النتيجة مباشرةً حتى إن استخدمنا أمر الطباعة هكذا:
print (4+4)
8
2-2
3.1- 2
الضرب:
2*3
3.8*1
القسمة:
8/2
98.23/2
وإذا أردنا معرفة الجذر التربيعي لرقم ما نعرفه هكذا:
36**0.5
النتيجة:
36**0.5
6.0
64**0.5
وهذا هو الجزء المتعلق بالسلاسل العددية الصحيحة والعائمة، هل للسلاسل النصية نصيب من العمليات أيضا؟
نعم لها نصيب من الجمع والضرب، لنرى معاً:
print ("صوت "+"الأقصى")
print ("صوت الأقصى"*10
ولا يجوز هنا استخدام العمليات إلا بالطباعة أو أُمور أخرى لم نتحدث عنها بعد، لكن لا يمكن كتابة السلاسل النصية هكذا مثل الأعداد.
وبعد تجربتك لطباعة السطرين السابقين ماذا تُلاحِظ عزيزي القارئ؟
بعد تجربتك أكمِل القِراءة لتعرف ما استنتجته صحيح أَم خطأ،
نعم إن علامة الزائد قد جمعت أو ضمت النصين إلى بعض وجعلتهم نصا واحدا.
أما علامة الضرب فقد طبعت النص بعدد مرات الضرب.
جميل إليكم بعض الأمثلة الأخرى على سبيل التدريب:
اضرب عمركَ في 365 ستحصُل على عمرك تقريباً بالأيام.
print ("عمري بالأيام",34*365)
اطبع اسمك بعدد أحرُف اسمك.
السؤال: هل يمكننا جمع نوعين مختلفين من البيانات يعني سلسلة نصية وأخرى عددية؟
لنُجَرِب:
print ("good"+11)
النتيجة:
print ("good"+11)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: cannot concatenate 'str' and 'int' objects
يقول إنهُ لا يمكن جمع نص إلى عدد،
ولكن إذا حولنا هذا الرقم إلى نص ستتم العملية بنجاح هكذا:
print ("good"+"11")
وإلى لقاءٍ آخر.
اللهم علِمنا ما ينفعنا وانفعنا بما علمتنا وزدنا عِلما.

الدرس الرابع: المتغيرات


درس اليوم خاص بالمتغيرات, فما هي المتغيرات؟
تخيّل عندك زجاجة فارغة لونها أخضر, ثم ملَأتَها زيتاً, وهذا الزيت زيت ذُرَا.
عندكَ زجاجة أخرى لونها أزرق هذه الزجاجة أيضاً فارغة عبَّأتَها حليباً.
زجاجة ثالثة لونها أحمر هي فارغة ثم عمدْتَ إليها وملأتها عصير برتقال.
هل ثمة مانع شرعي أو عقلي يمنعك من تفريغ الزجاجة الأولى ذات اللون الأخضر ثم ملْئِها بالماء؟
طبعاً لا, سؤال آخر هل محتوى الزجاجة الخضراء وهو الزيت ثابت لا يمكن تغييره؟
الإجابة لا بل يمكن تغييره بزيت آخر مثلاً زيت الزيتون أو سائل يختلف عن الزيت تماماً مثل الماء.
والمعلوم أن كل زجاجة من الزجاجات الثلاث تخضع لنفس الفكرة وهي قابلية تغيير المحتوى, إذَاً كل زجاجة تحمل قيمة قابلة للتغيير, طيب رأس الإنسان يحوي دماغاً هل يمكن استبدال الدماغ بشيء مخالف دماغ إنسان آخر أو دماغ حيوان أو قطعة خشب؟
الإجابة بالتأكيد لا, وإلا سيموت هذا الإنسان, إذاً الرأس ثابت من الثوابت والزجاجة متغيرة .
لغة بايثون بها متغيرات ولا توجد فيها ثوابت من حيث الأصل بعكس لغات كثيرة لكن باعتبارها لغة مفتوحة المصدر فيمكن لأي مبرمج إضافة ثوابت فيها بإضافة مكتبات خاصة.
ما هو المتغير في بايثون؟
المتغير في بايثون عبارة عن زجاجة فارغة يمكنك أن تملَأها بأي شيء زيت, حليب, عصير....إلى آخره.
طبعاً كلمة زجاجة كلمة مجازية وليست على سبيل الحقيقة ذكرتُها لتقريب الفكرة وتوضيحها، الآن نضرب أمثلة برمجية.
هل تذكرونَ الزجاجة الخضراء وما نوع السائل الموجود بها؟ نعم أصبتم زيت الذرا, لنَكْتُبْ هذا بالأكواد.
green = "زيت ذُرا"
print (green)
النتيجة:
زيت ذُرا
فمما يتألف المتغير؟ يتألف المتغير من اسم وقيمة , الاسم هنا green والقيمة التي أدخلناها في المتغير هي "زيت الذُّرا"
عندما تطبع اسم المتغير فإنك لا تطبع المتغير من الخارج green بل تطبع محتويات المتغير "زيت الذُّرَا" ,
العملية الأولى والتي تتألّف من green وعلامة يساوي والسلسلة النصية نسمّيها عملية إسناد قيمة للمتغير, والقيمة هي السلسلة النصية "زيت الذرا" نحفظ شكل عملية الإسناد ونقيس عليها.
اسم المتغير = القيمة 
فما هي القيمة؟
القيمة هي أي نوع من أنواع البيانات سواء التي درسْناها أو التي لم ندْرُسها بَعد، قد تكون سلسلة نصية أو سلسلة عددية صحيحة, أو سلسلة عددية عائمة، أو أي نوع آخر من أنواع البيانات.
اسم المتغير في مثالنا السابق green وقيمته سلسلة نصية وبينهما علامة يساوي وهي التي تدْخل الزيت في الزجاجة الخضراء فيقْبَعُ ذاك الزيت في تلك الزجاجة ما شاء الله أن يقبع, ولكنه قابل للتغيير فقد تجري عملية إسناد أخرى تضع بدل الزيت ماء مثال ذلك:
green = "ماء"
الآن لِنطْبَع المتغير.
print (green)
حسَنَاً, ما هي النتيجة, لنذهبْ إلى نافذة المخْرجات بضغط f6.
ماء
أين الزيت؟ 
يبدو أنه تبَخّر. هاهاهاها 
ماذا يفيد هذا الأمر؟، لنرى مثالا عمليا آخر:
إذا كان عندي برنامج يطلب من المستخدِم إدخال اسمه طبعا كل مستخدِم سيكون له اسم مختلِف بالتالي إذا قلنا اسم المتغير name ستتغير قيمته في كل مرة هكذا:
name="mona"
name="noor"
وطبعا في كل عملية إسناد تنتهي الأولى وتبقى القيمة الجديدة فقط، بعد ذلك يمكننا استخدام قيمة هذا المتغير في شيءٍ كهذا:
print ("أهلا بك يا "+ name)
النتيجة:
أهلا بك يا noor
نلاحظ من ذلك أن المتغير مجرد إشارة إلى قيمته نستخدمه في عمليات أخرى.

ولكن، أعيروني أسماعكم وعقولكم.
لا شرط في قِيمة المتغير أي نوع من البيانات يصلح أن يكون متغيراً ولكن ثمة شروط في اسم المتغير هي متعددة نذكر منها:
أولا: أن لا يكون الاسم رقماً أو مبدوء برقم مثال ذلك من الأخطاء 
23
1book 
3book
طيب أنا عندي مجموعة من أصناف الكتب أريد جعل كل صنف متغير مستقل وأحتاج إلى الأرقام فماذا عليّ أن أفعل؟ لا يجوز لي أن أسبقه برقم فما الجواب؟ هذا سؤال الأذكياء وعليه نقطة يا أبطال فمن له؟
يمنع علينا أن نكتبَ اسم المتغير هكذا 
1book
2book
3book
4book
أسماء المتغيرات الخاصة بالكتب كلها book وأريد التفريق بينها بالأرقام فكيف يكون الحل؟
ثانيا: أن لا يكونمحتوياً على مسافة: من الخطأ أن تكتب اسم المتغير هكذا:
user name 
والصواب إما هكذا:
user_name
أو هكذا:
userName
شغّلوا التعرف على الحروف الكبيرة.
ثالثا: أن لا نستخدم كلمات محجوزة من قبَل البايثون في تسمية متغيراتنا مثال الكلمات المحجوزة:
class in if else elif 
وعند استخدامِها سيظهر لنا خطأ كهذا: SyntaxError.
وأيضا عدم استخدام الدوال الجاهزة مثل: print, input, len وغيرهم.
أنتم لم تعرفوا من هذه الكلمات إلا print نحن نعرف أن هذه الكلمة عبارة عن دالة في بايثون فلو كتبتها كمتغير كيف سيعرف بايثون هل تقصد أمر الطباعة أو تقصد كتابة المتغير لذلك يُفَضل عدم استخدام تلك الكلمات كمتغيرات.
رابعا: أن لا يتضمن اسم المتغير أي علامات رمزية مثل - = + ؟ ! @ # 	 % ^ ويُستثنى من ذلك الخط السفلي under line _ أمثلة خاطئة وفقاً لهذا الشرط 
z?z = "yes"
z#z = "ok"
مثال صحيح وفقاً لهذا الشرط 
zz = "yes"
z_z = "ok"
تفطّنوا للآتي سنكتب مثالاً نحترم فيه الشروط السابقة بالنسبة لاسم المتغير ثم نكتب علامة يساوي ثم نكتب قيمة من أنواع البيانات المعروفة وهذه المرة لن تكون سلسلة نصية بل عددية صحيحة.
x = 33
y = 67
print (x + y)
100
print (x * y)
2211
لاحِظوا لم يجمع البايثون y و x وإنما جَمَعَ القِيمة الموجودة داخل y إلى القيمة الموجودة داخل xوكذا الضرب.
ملاحظة: هل يُمكنُنا كتابة متغيرات باللغة العربية؟
نعم يمكنُنا ذلك، مع العِلم أن هذا لم يكن متاحا في الإصدارات السابقة.
لِنُجرب نكتب متغير باللغة العربية لِنرى هل سيقبل أَم سيظهر خطأ:
الاسم = "صوت الأقصى"
ل=4

الواجب:
1 إليكَ متغيرَين اثنين نريد ملْأهما بسوائل مختلفة ثم طبع الجملة بوضع توطِئة مناسبة هكذا.
red = "الحليب"
blue = "اللبَن الحامض"
print ("أحِبُّ " +blue+" و"+red)
2 اطْرَحْ من السنة التي دخلتَ فيها المدرسة لأول مرة رقمَ السنة التي وُلِدْتَ فيها هكذا:
x =1978
y = 1984
print y-x
الآن اطْرَح من السنة التي حصلتَ فيها على الشهادة الإبتدائية رقْمَ سنة مواليدك ماذا سنغير باعتبارها متغيرات نعم سنغير y ولن نغير x هكذا 
y = 1990
print y-x
بهذا السؤال ستعرف عمُرَكَ يوم دخلتَ المدرسة وعمُرَكَ يوم تحصّلتَ على الشهادة الابتدائية.
تقبّلُوا من أخيكم صلاح اعطير أعذَب التحيات والسلام ختام الكلام.
هكذا انتهى الدرس، وفيما يلي حل الأسئلة لا تقرأ الإجابة إلا بعد محاولة حلِها بنفسك أولا.

لاستخدام الكلمات الخاصة ببايثون في متغيرات يمكنك كتابتها بحروف كبيرة أو كتابة بعض حروفها كبير والبعض صغير.
للتغلب على مشكلة الأرقام يمكنك كتابة الرقم بالحروف أو كتابة الرقم بعد المتغير هكذا:
oneBook
twoBook
book4

1 إليكَ متغيرَين اثنين نريد ملْأهما بسوائل مختلفة ثم طبع الجملة بوضع توطِئة مناسبة هكذا.
red = "الحليب"
blue = "اللبَن الحامض"
print ("أحِبُّ " +blue+" و"+red)
الإجابة:
red="عصير البرتقال"
blue="عصير القصب"
print ("أحب "+red+" و"+ blue)
أحب عصير البرتقال وعصير القصب
وننتبِه هنا إلى الخطأ الذي كان موجود في السؤال وهو وضع المسافة بعد الواو وليس قبلها.

2 اطْرَحْ من السنة التي دخلتَ فيها المدرسة لأول مرة رقمَ السنة التي وُلِدْتَ فيها هكذا:
x =1978
y = 1984
print y-x
الآن اطْرَح من السنة التي حصلتَ فيها على الشهادة الإبتدائية رقْمَ سنة مواليدك ماذا سنغير باعتبارها متغيرات نعم سنغير y ولن نغير x هكذا 
y = 1990
print y-x
بهذا السؤال ستعرف عمُرَكَ يوم دخلتَ المدرسة وعمُرَكَ يوم تحصّلتَ على الشهادة الابتدائية.
الإجابة:
x=1992
y=1998
y-x
6
y=2003
y-x
11
لا تنسوا ذِكْرَ الله.

الدرس الخامس: القوائم


• القائمة, list :
تسميها بعض لغات البرمجة المصفوفة، فما هي القائمة؟
باختصار القائمة هي هذه [] شكراً لمتابعتكم الدرس. إلى اللقاء في الدرس القادم...
لا انتظروا قليلاً, لِنَسْنِدَ هذه القائمة إلى متغير, نعم سنفعل ذلك مع أن الدرس انتهى لأن القائمة عبارة عن قوسين مربعين فحسب وهما قوس مربع للفتح وقوس مربع للإغلاق, فالذي للفتح يقابله حرف الجيم في لوحة المفاتيح ما دامت لغة إدخالها انكليزية وقوس الإغلاق حرف الدال وهو ما يلي الجيم. ألمْ أَقُلْ لكَم إن الدرس قد انتهى؟ أثمة شيء أبسط من هذا؟
عملية إسناد قائمة إلى متغير:
القائمة هي النوع الرابع من أنواع البيانات بَعد النصوص والأرقام الصحيحة والأرقام العشرية. وتتم عملية اسناد القوائم بنفس الطريقة تماماً:
اسم المتغير = قيمة المتغير
قيمة المتغير هي أي نوع من أنواع البيانات وهنا ستكون قائمة.
x= []
مثال آخر:
books = []
يمكننا طبعا تسمية المتغير أي اسم ما دمنا نلتزم بالشروط التي تم ذكرها في الدرس السابق.
مع أن الدرس كادَ أن ينتهي إلا أننا سنعطي ملاحظة بسيطة للغاية وهي أن القائمة التي وضعناها في الأمثلة السابقة هي قائمة فارغة فكيف يتم تعبِئَتها وبأي شيء تكون التعبئة؟
نعم تتم تعبئتها بأي نوع من أنواع البيانات الأخرى بنصوص أو أرقام صحيحة أو عائمة أو قوائم أخرى. نأخذ مثال سريع.
friends = ['alhashimi', 'abu obaida', 'alshami', 'nedal', 'salem', 'sarhan', 'fayz']
الناتج:
friends = ['alhashimi', 'abu obaida', 'alshami', 'nedal', 'salem', 'sarhan', 'fayz']
print (friends)
['alhashimi', 'abu obaida', 'alshami', 'nedal', 'salem', 'sarhan', 'fayz']
نلاحظ أننا أمام متغير قيمته قائمة وهذا يعني أنَّ نوعَ البيان الذي يقبَعُ داخلَه قائمة، ثم إنّ هذه القائمة تتألف من عدة عناصر كل عنصر مفصول عن العنصر الآخر بفاصلة.
طبعاً في المثال السابق كانت كل عناصر قائمة friends من نوع السلاسل النصية وهم أصدقائي أو بعض أصدقائي في المنتدى.
أستطيع أن أكتب قاءمة عناصرها كلها رقمية صحيحة أو رقمية عشرية, مثال آخر:
my_list = [1, 2, 5, 34, 156]
الناتج:
my_list = [1, 2, 5, 34, 156]
print (my_list)
[1, 2, 5, 34, 156]
هكذا انتهى الدرس يا عزيزي نِضَال, لا, انتَظِرْ بُرْهة. هناك أمر بسيط هي ملاحظة خفيفة ظريفة مثل النار في الليفة.
الملاحظة هي: يمكنك أن تَكتُب قائمة محتوية على عناصر من انواع مختلفة من البيانات مثال سريع.
my_list2 = [1,'yes','no',44,'ok',1.5]
الناتج:
my_list2 = [1,'yes','no',44,'ok',1.5]
print (my_list2)
[1, 'yes', 'no', 44, 'ok', 1.5]
نلاحظ إن القائمة احتوت عناصر من نوع السلاسل النصية وأخرى رقمية فالنصية هي: "ok" "yes" "no" والبقية بين رقمية صحيحة وأخرى عائمة وفهمكم كفاية.
الآن نريد أن نستدعي أحد عناصر القائمة وليس القائمة بأكملِها تابِعوا هذا المِثال:
إخوَتِي = ['حُسام', 'محمود', 'أحمد']
print (إخوَتِي[0])
الناتج:
print (إخوَتِي[0])
حُسام
هل رأيتم كيف تم طباعة العنصر الأول, على فكرة يبدأ العد من الصفر وليس الواحد فأول عنصر وهو حسام رقمه صفر وثاني عنصر رقمه 1 وثالث عنصر رقمه 2, باختصار أول رقم في القائمة صفر، وآخر عنصر رقمه -1.
print (إِخوَتي[-1])
أحمد
الآن انتهى الدرس حقَّاً.
الواجب:
أريد قائمة ضع فيها من البيانات ما تشاء واسندها إلى متغير ثم اطبع بعض عناصرها أريد طباعة العنصر الثالث ثم الثاني ثم الأول وفي سطر واحد.
سؤال الأذكياء:
my-cousin = ['kaled','ahmed','anas',tarq','hamed']
هناك خطأ ظاهر وآخر مخفي في الكود السابق فمن لي به؟
وإلى لقاءٍ آخر بمشيئةِ الرحمن.
إجابة الواجب:
المنشِدون = ["أبو عبد الملِك", "أبو علي", "أبو زياد", "أبو حذيفة", "عبد الفتاح عوينات", "عبد الله المهداوي", "ناصر السعيد"]
print (المنشدون)
['أبو عبد الملِك', 'أبو علي', 'أبو زياد', 'أبو حذيفة', 'عبد الفتاح عوينات', 'عبد الله المهداوي', 'ناصر السعيد']
print (المنشِدون[2], المنشِدون[1], المنشِدون[0])
أبو زياد أبو علي أبو عبد الملِك
أي استخدمنا أمر طباعة واحد ووضعنا الفاصلة بين كل أمر والثاني يمكننا بهذه الطريقة طباعة أمور من قوائم مختلفة هكذا:
الأناشيد = ["حكاية بيعة", "يا رسول الله وقدوتَنا", "بارودتي والروح", "بالعزمِ والثبات"]
print (المنشِدون[3], الأناشيد[2], المنشِدون[-1], الأناشيد[-1])
أبو حذيفة بارودتي والروح ناصر السعيد بالعزمِ والثبات

السؤال الثاني:
my-cousin = ['kaled','ahmed','anas',tarq','hamed']
الخطأ الأول: وضع الشَرطة في اسم المتغير.
الثاني: عدم وضع علامة ' قبل اسم طارق.
والسلام عليكم ورحمة الله وبركاته.
لا تنسَ ذِكْرَ الله.

ملحق بالدرس الخامس: دوال متعلِقة بالقوائم والسلاسل النصية


إخوتي عندي مشكلة وأفكّر في حل لها فهل ساعدتموني؟ 
المشكلة تخص السلاسل النصية, عندي نص وأريد معرفة عدد الحروف بداخله النص هو.
'مصارع الرجال تحت بروق الطمع'
طبعاً ستقولوا لي يا صلاح الحل سهل اعمِدْ إلى أول السلسلة وابدأ العد حتى تصل إلى آخر حرف, أقول نعم حل جميل بل أكثر من رائع لكن ماذا لو أن السلسلة غير موجودة عندي فأنا مثلاً عندما أصمِّم منظومة لِمَصْرِف من المصارف تخص حسابات العملاء وكل ما يتعلق بها والحافظات الاسثمارية وغيرها,سيكون فيها مربع إدخال يتم من خلاله تسجيل أسماء لعملاء جُدد فكيف سأعرف عدد حروف تلك السلسلة التي لم تتم كتابتها بَعد بل قد تُكتَب بعد سنة أو أكثر أو أقل.
مثلاً:
x = 'مصارع الرجال تحت بروق الطمع'
فكم حرفاً تتألف منه السلسلة القابعة في أحشاء المتغير x
لنجرب هذا:
len(x)
النتيجة:
x = 'مصارع الرجال تحت بروق الطمع'
len(x)
27
جرّبْ أن تغيّر محتوى x بسلسلة نصية مخالفة لهذه السلسلة وسترى النتائج، على فكرة أول حرف في السلسلة النصية رقمه صفر وآخر حرف في هذه السلسلة رقمه 26 لكن عناصر السلسلة عددها 27 كما بيّنتْه لنا دالة len()
هذه الدالة رقمية النوع, يعني integer وتقبَلْ سلاسل نصية وبعض البيانات الأخرى غير السلاسل.
طيب أريد طباعة أول حرف في المتغير x, العملية جِدّ سهلة, تعلمناها مع القوائم البارحة.
print (x [0])
print (x [0])
م
قد يسأل أحدكم لكننا لم نتعرّف على قِيمةِ المتغير, أقول هي قِيمة المتغير الذي أسندناه منذ قليل, فما دمتَ لم تغلِقْ برنامج nvda يظل المتغير موجود في الذاكرة العشوائية, ram. 
إذا أسندتَ قيمة أخرى للمتغير x فسيتم مسح القيمة السابقة تماماً من الذاكرة واستبدالها بالجديدة.
وإذا أردنا استدعاء العنصر بدون طباعته يكون الأمر هكذا:
x[0]
'م'
الآن نريد طباعة العنصر الأخير:
فكر واطبع النتيجة بنفسِك قبل قِراءتها في السطر التالي:
print (x [-1])
ع
نريد طباعة جزء من السلسلة مثلا من الحرف الثالث إلى العاشر، كما نعلم أن أول حرف قيمته 0 إذن سنطبع من 2 إلى 9 هكذا:
print (x [2:9])
ارع الرج
لِنطبع من أول الحرف الرابع إلى نهاية السلسلة:
print (x [4:])
ع الرجال تحت بروق الطمع
أخيرا نريد طباعة السلسلة من أولها إلى سابع حرف:
print (x [:7])
مصارع ا
جميل الآن نريد إجراء بعض العمليات الأخرى غير اقتطاع جزء من السلسلة.

upper: لتحويل السلسلة النصية من حروف صغيرة لكبيرة.
مثال ذلك:
نكتب متغير ونسند له سلسلة نصية
name = 'new sound'
name =name.upper()
print (name)

NEW SOUND
سنجد أن السلسلة تحولت كلها إلى حروف كبيرة.

lower: لتحويل السلسلة النصية من كبيرة لصغيرة.
وهذه عكس السابقة.
مثال:
x = 'ALAQSA VOICE'
x = x.lower()
print (x)
alaqsa voice

find: للبحث عن كلمة.
تُستخدم للبحث عن كلمة في نص للوصول إليها سريعا إن كان هذا النص طويلا وتكون كالتالي:
النص المراد البحث فيه ثم نقطة واسم الدالة أي find وبعدها قوسين بينهم النص المراد البحث عنه.
مثال:
m = 'اللهم اجعلنا من المتقين'
النتيجة:
print (m.find('اجعل'))
6
أي أنكلمة اجعل موجودة  وأول حرف منها هو العنصر السادس.
أما إذا كانت الإجابة بلا أي لا يوجد ما نبحث عنه ستُرجِع الدالة -1.

count: لمعرفة عدد التكرار.
نعرف منها عدد تكرار العنصر في النص سواء كلمة أو حرف أو رقم هكذا:
print (m.count('م'))
3
وهو عدد حرف الميم موجود ثلاث مرات ويمكننا كتابة كلمة إذا كان النص طويلا ستأتينا بعدد تكرارها.

replace: لاستبدال نص بنص آخر.
ويكون هكذا:
الدالة replace وبين الأقواس النص الأصلي والنص الذي سيتم التغيير له ونفصل بينهما بفاصلة.
مثال:
y = m.replace('party','room')
print (y)
اللهم اجعلنا من المخلَصين
rfind: هذه تُستخدم للبحث أيضا ولكنها تأتي بآخر نتيجة في النص.
m = u'أنا أحب الفارولة والتوت والبطيخ والعسل'
print (m.rfind('ا'))
النتيجة: 33
أي أن الألف الأخير في النص رقمه 33.

index و rindex مثل find و rfind.
مع اختلاف بسيط وهو أنك عندما تبحث عن كلمة غير موجودة في النص واستخدمت find أو rfind فإن النتيجة ستكون -1، أما عند استخدام index أو rindex فإنهُ سيظهر خطأ، لذا يُفَضَل استخدام find.

isdigit(): للتأكُد من نص ما هل هو أعداد أَم لا، كما يمكن التأكُد من النص بأكمله أو عنصر معين منه هكذا:
m="هذا نص يحتوي على أرقام مثل 3 و5 و4 و1234"
m.isdigit()
هنا نقول هل السلسلة m مكونة كلها من أرقام إذا كانت الإجابة نعم ستعطينا الدالة True أما إذا كان غير ذلك ستُرجع لنا False
النتيجة:
False
m[20].isdigit()
هل العنصر 20 يساوي رقم؟، لنرى
False
m[30].isdigit()
هل العنصر 30 يساوي رقم؟
True
نعم يقول أنه رقم.

split: لتحويل السلسلة النصية إلى قائمة.
إذا كان المتغير نص ونريد تحويله إلى قائمة نستخدم الدالة split, ولكن هنا نضع بين قوسين الشيء الذي سيتم التقسيم من خلاله يعني فاصلة أو مسافة مثل:
y = 'i love nvda and new sound'
y = y.split(' ')
أي سيتم التقسيم من عند المسافة، يمكننا وضع فاصلة مثلا أو أي علامة أخرى تناسب النص.
print( y)
['i', 'love', 'nvda', 'and', 'new', 'sound']
يمكننا أيضا استخدام list، ستجعل كل حرف من السلسلة النصية عنصر من عناصر القائمة:
y = 'i love nvda and new sound'
x=list(y)
print(x)
['i', ' ', 'l', 'o', 'v', 'e', ' ', 'n', 'v', 'd', 'a', ' ', 'a', 'n', 'd', ' ', 'n', 'e', 'w', ' ', 's', 'o', 'u', 'n', 'd']

الآن نعيدها كما كانت باستخدام الدالة التالية
join: لتحويل القائمة إلى سلسلة نصية.
وهنا يختلف الأمر قليلا في كتابة الدالة فنكتبها هكذا:
y = ' '.join(y)
print (y)
i love nvda and new sound
أي العلامة التي سيتم وضعها بين عناصر القائمة عند تحويلِها إلى نص والمسافة حتى لا يلتصق الكلام ببعضه وبين القوسين نكتب اسم السلسلة النصية المراد تحويلها.

ونكتفي بهذا القدر من الدوال في هذا الدرس على أمل أن نلتقي في الدرس التالي مع دوال القوائم.
اللهم علِمنا ما ينفعنا وانفعنا بما علَمْتَنا وزِدنا عِلْما.


ملحق بالدرس الخامس: التعامل مع النص بدون تجزئة


قَبْل أن نختم الكلام عن المحارف وننتقل إلى الدرس القادم سأعطيكم شرحاً للتعامل مع النص بدون تجزئة أرجو التركيز أعيروني عقولَكم قبْلَ أسماعِكم.
لقد أشرنا إليه في درس سابق ولكنْ كانت الإشارة سريعة.
str = 'محمد الهاشمي من التلاميذ النجباء'
الآن نريد أنْ نطبع الحرف الأول دون تجزئة أو قوائم، الحرف الأول وهو الميم رقمه كعنصر في السلسلة صفر.
print (str[0])
م
الآن نحاوِل طبْعَ الحرف الثاني وهو الحاء ولا ننسى أنه العنصر رقم 1 في السلسلة النصية str.
print (str[1])
ح
الآن فلْنطْبَع أول حرف من كلمة الهاشمي وفقاً للمتغير str> الحرف الأول ا لكنْ كم رقمه؟
print (str[5])
ا
الآن نريد طباعة الحرف الأخير لكنّه بعيد هل سأعد من الصفر حتى أصلَ إليه الحرف هو آخر حرف من السلسلة str وهو الحرف الأخير من كلمة النجباء أي الهمزة.
print (str[-1])
ء
طيب الحرف ما قبْلَ الأخير في السلسلة str
print (str[-2])
ا
الآن نطبع كلمة الهاشمي كلها، لكنْ وفقاً للمتغير str:
print (str[5:11])
الهاشم
هاهاها لقد ضاعتْ الياء لماذا يا عصامية لماذا يا هاشمي؟ أليستْ الياء هي العنصر رقم 11 من عناصر str؟
print (str[5:12])
الهاشمي
ماذا نستنتج؟
الحرف الذي بعد النقطتين لا يتم طباعته لأنك قلتَ لبايثون اطْبَعْ من العنصر الخامس إلى العنصر الحادي عشر ولم تقُل له اطبع حتى الحادي عشر, 
وهذا فرق كبير قد تقول ذهبتُ من البيت إلى المدرسة وهذا لا يعني أنك دخلتَ المدرسة فكم من ولدٍ شقِي يقول لأهله ذهبتُ إلى المدرسة وهو فعلاً ذهبَ إليها ووقف عند سورها لكنه لم يدخل, وهذا تكَلُّف في اللغة فلقد تعودَ الناس على أنه من ذهب إلى مكان دخل فيه. 
تقول ذهبتُ إلى السوق وذهبتُ إلى الجامعة. لكنّ بايثون دقيق في عبارته.
ماذا سنكتب لو أردنا طباعة محمد حرف الدال ترتيبه الثالث لا تنسَ ما دمتَ تريد طباعة عنصر مع مجموعة عناصر وكان هذا العنصر الأخير, فلا تكتب رقم هذا العنصر بل الذي بَعده, هذه قاعدة ذهبية أرجو أن لا تنسوها. 
لنجَرّب هذا بشكل عملي, اذهبوا إلى البوابة وادخلوها هاهاها وجربوا.

الآن أريد كتابة متغيرات أخرى أضيفها في عملي لكنها مأخوذة من المتغير str في قيمتها طبعاً لا اسمها.
x = str[:12]
print (x)
محمد الهاشمي
y = str[-7:]
print (y)
النجباء
هل رأيتم كيفَ طبعنا النجباء؟
نعدّ العناصر من الخلف إلى الأمام نجد أول حرف في النجباء رقمه -7 القاعدة متى بدأ العد من الخلف إلى الأمام يكون العد بالسالب أي علامة ناقص قبْل الرقم.
نلاحظ أننا لم نكتب -1 نعم لأن هذا يجعل الاستيراد متوقفاً عند الحرف قبل الأخير لذا نترك خانة العنصر بعد النقطتين الرأسيتين فارغة.
أرجوكم دقِّقوا في هذا.
o = str[-7:-1]
print (o)
النجبا
هذا ما لا نريد, الملاحظة إذا تركتَ الخانة قبل النقطتين الفوقيتين فارغة فهذا يعني أن العد سيشمل كل شيء من البداية وإذا تركتَ الخانة بعد النقطتين الفوقيتين فارغة فهذا يعني أن العد سيتم إلى النهاية بما فيها العنصر الأخير.
الآن نستفيد من المتغيرين الجدِيدَين في تجاربنا.
سنتعلم شيء جديد وهو ضروري ومُهِم للغاية، 
الله الله في هذه الفقرة لا تتركُوها, فهي قوام العمل المحترف في البرمجة.

print ('إخوتي عندي صديق عزيز على قلبي وأحبه جداً هو من المغرب اسمه %s وهذا الصديق العزيز أعُدُّه من أفاضل التلاميذ %s لأنه يمتاز بسرعة البديهة وَمَقْدِرة على الصبر ولا أُزَكِّيه على الله تعالى' % (x, y))
إخوتي عندي صديق عزيز على قلبي وأحبه جداً هو من المغرب اسمه محمد الهاشمي وهذا الصديق العزيز أعُدُّه من أفاضل التلاميذ النجباء لأنه يمتاز بسرعة البديهة وَمَقْدِرة على الصبر ولا أُزَكِّيه على الله تعالى

شرْحٌ للكود السابق:
قد ترونه صعباً وهو بعكس ما يظهر أسهل من السهولة نفسها, 
لا شيء جديد غير %s وهذا رمز أن هنا متغير آخر سيقبع في هذا المكان لأنك لو وضعتَ المتغير x بين علامَتَين التنصيص فإنه سيُطْبَعُ حرف x ولنْ تتم طباعة قيمته; لذا نضع هذا الرمز للدلالة على أن هذا المكان حجزناه لمتغير 
فإن كان هذا المتغير نصِّي وضعنا بعد علامة بالمائة حرف s وإن كان رقَمِيَّاً وضعنا بعد علامة بالمائة حرف d 
في هذه التجربة استخدمنا المتغير النصي فقط وكان عدد المتغيرات النصية 2 بعد نهاية السلسلة النصية اكتب مسافة ثم علامة بالمائة وهي شفت ورقم خمسة % ثم مسافة أخرى ثم افتحْ القوس الهلالي واكتب المتغير ثم فاصلة تفصل بين المتغيرات إذا كانت متعددة واكتب المتغير الآخر ثم اغلق القوس الهلالي واستمتع كما تشاء.
ويُمكننا استخدام طريقة أخرى أيضا ربما تكون أسهل ولكنها لم تكن موجودة سابقا قبل بايثون 3.6
print (f'إخوتي عندي صديق عزيز على قلبي وأحبه جداً هو من المغرب اسمه {x} وهذا الصديق العزيز أعُدُّه من أفاضل التلاميذ {y} لأنه يمتاز بسرعة البديهة وَمَقْدِرة على الصبر ولا أُزَكِّيه على الله تعالى')
ماذا فعلنا هنا؟
وضعنا حرف f قبل التنصيص ننتبه هو قبل التنصيص وليس قبل الأقواس، وهذا يعني أن هذا النص قد يحتوي على متغيرات ثم في المكان الذي نريد وضع المتغيِر فيه نكتبه بين أقواس مزخرفة وهي التي نكتبها بشفت مع حرف الجيم وشفت وحرف الدال إذا كانت اللوحة إنجليزية، أو شفت مع حرف c وشفت مع v إذا كانت اللوحة عربية أي همزة على الواو وراء.
مثال آخر لكن باللغة الانكليزية مَن تعذر عليه الفهم بالانكليزي وضعنا له مثلاً عربياً لكنْ عودوا أنفسكم على الانكليزية وتعلمها لأن بايثون مكتوب بالانكليزي.
name = 'salah ali'
age = 34
sons = 1
son_name = 'ahmad'
print (f"hi my friends, i'm {name} , and i'm {age} years old, i have {sons} son, his name is {son_name }")
hi my friends, i'm salah ali , and i'm 34 years old, i have 1 son, his name is ahmad
أو على الطريقة الأولى نضع علامة % ثم المتغيرات بين القوسين ونفصل بينهما بفاصلة.

أخيراً الواجب: 
نريد أمثلة تكون بكتابة متغير طويل نأخذ من هذا المتغير الطويل كلمات هذه الكلامات باعتبارها سلاسل نصية نسندها إلى متغيرات جديدة ثم نطبع جمل تستخدم هذه المتغيرات بطريقة %s و %d 
بالتوفيق للجميع

لا تنسَ ذِكرَ الله

ملحق بالدرس الخامس: بعض الأُمور المتعلِقة بالنصوص وتحويل الأنواع

بعض التفاصيل عن find و rfind:
تحدثنا عن find وقلنا أنها تأتي بالنتيجة الأولى في النص، حسناً انظروا هذا المثال:
م="السلام عليكم إليكم بكم لكم أنتم كنتم"
م.find('م', 2)
أي ابحث عن حرف م لكن بدءً من العنصر الثالث
5
م.find('م', 6)
11
م.find('م', 6, 11)
-1
أي ابحث عن م من أول العنصر السابع الذي رقمه 6 إلى العنصر العاشر طبعا لأنه 11 لم يدخل معنا في البحث، والنتيجة ناقص 1 لأنهُ لا يوجد.
م.rfind('م', 6, 20)
17
أي البحث عن م بين 6 و20 ولكن هنا يبحث من النهاية إلى البداية.
تأملوا هذا أيضا:
ل = م.find('م',0)
print (ل)
5
ل = م.find('م', ل+1)
print (ل)
11
ل = م.find('م', ل+1)
print (ل)
17
ل = م.find('م', ل+1)
print (ل)
21
أي أننا في كل مرة نزيد قيمة ل 1فيتم البحث في الموضع التالي.

الآن نقطة جديدة:
أرجو من الجميع الانتباه, يمكن تحويل أي نوع من أنواع البيانات إلى نوع من الأنواع المعروفةبطريقة بسيطة:
# نريد تحويل رقم إلى نص
x = 3
#طيّب ما نوع x نعم إنه رقم صحيح قيمته 3 ودليل ذلك أن نستخدم الدالة التي ترينا أنواع البيانات.
print x+x
6
print x*4
12
# الآن عرفنا بالدليل القاطع أن x ما هو إلا سلسلة رقمية, ويمكن أن نعرف ذلك عن طريق دالة type()
#هذه الدالة تقبل وسيط بين القوسين الهلاليين الذين يلحقانها, يمكن أن تضع أي نوع من البيانات ها هنا وهو سيحدد لك مهية هذا النوع.
print (type(x))


# نعم إذا قال لك int فهو رقم صحيح لأن هذه الكلمة اختصار الكلمة integer
# والآن لنحوّل هذا الرقم إلى سلسلة نصية 
x = str(x)
# نطْبَعُ الآن المتغير.
print (x)
3
# نحاول جمع المتغير مع نفسه
print (x+x)
33
print (x*4)
3333
# هل هذا يكفي حتى تتأكد أنه تحوَل إلى نص
# إن لم تكن متأكداً فاستخدم الدالة type()
print type(x)

# نعم str رمز السلاسل النصية string فهي الحروف الأولى منه.
# هل الأمور الآن واضحات؟

إضافة تستحق الذكر
هل يمكنني كتابة سلسلة نصية من عشرة أسطر ولكن بعلامتين تنصيص فقط إحداهما في الأول والثانية في الأخير؟
نعم يمكن ذلك قلنا أنك لمّا تكتب %s و %d فإنها لا تمثل نفسها بقدر ما تمثل متغير سيكون معروفا عند نهاية السلسلة أي بعد العلامة أقصد علامة التنصيص كما وضحنا في المشاركة السابقة طيب هل توجد رموز أخرى بنفس هذه الفكرة؟ نعم خذوا هذين الرمزين بالقبول.
\n و \t 
الأمثلة:
x = 'السلام عليكم أيها الأصدقاء النجباء.\n في البداية أتقدم لكم بالشكر الجزيل على متابعتكم لهذه الدروس \n وأرجو من الله تعالى أن يوفقكم لكل خير وثانياً اعلموا أن طرق الكتابة الحديثة وتنسيق النصوص تقتضي منكم كتابة علام تاب هكذا \t في كل فقرة جديدة.'
print (x)
السلام عليكم أيها الأصدقاء النجباء.
 في البداية أتقدم لكم بالشكر الجزيل على متابعتكم لهذه الدروس 
 وأرجو من الله تعالى أن يوفقكم لكل خير وثانياً اعلموا أن طرق الكتابة الحديثة وتنسيق النصوص تقتضي منكم كتابة علام تاب هكذا 	 في كل فقرة جديدة.
انتهتْ السلسلة النصية ونتائج طبعها.
اللهم علِمنا ما ينفعنا وانفعنا بما علمتنا.

لا تنسَ ذِكرَ الله

ملحق بالدرس الخامس: دوال القوائم


السلام عليكم ورحمة الله وبركاته.
في هذا الدرس سنتحدث عن الدوال التي نستخدمها مع القوائم.
قبل أن نبدأ مع الدوال نريد أن نُشير إلى أنهُ بإمكانِنا عمل قائمة تتكوَن من قوائم أخرى على سبيل المثال نريد أن نضع مع كل عنصر رقم أو شيء آخر نربط بينه وبين العنصر الثاني فيكون الأمر هكذا:
سنستخدم مربعات الأرقام كمثال:
x=[[2, 4], [3,9], [4, 16], [5, 25]]
فكل عنصر داخل القائمة هو عبار عن قائمة أخرى صغيرة.
ويمكنُنا استدعاء كل واحدة بطريقة استدعاء العناصر ثم استدعاء عنصر منها.

الآن مع الدوال:
len(): لمعرفة عدد عناصر القائمة.
len(l)
4
الدالة len() تختلف عن بعض الدوال، نجد بعدها قوسين هلاليين نضع بينهما الوسيط أو المعامل, وهما كلمتين بمعنى واحد, أي الضحية الذي يتم وضعه بين فَكَّي الدالة len, وفكَّي الوحش len هما القوسين الهلاليين وليسَ القوسين المربعين.
أما باقية الدوال غالبا ما نضع اسم القائمة قبلها ونتبعُها بنقطة، وبعدها قوسين أيضا لكن نضع بينهم أشياء مختلفة.

count(): لمعرفة عدد تكرار عنصر ما، نضعه بين القوسين.
l.count("سبحان الله")
1

endex(): لمعرفة رقم عنصر ما.
l.index('الله أكبر')
3

append(): لإضافة عنصر في نهاية القائمة.
l.append("لا حولَ ولا قوةَ إلا بالله")
print(l)
['سبحان الله', 'الحمد لله', 'الله أكبر', 'لا إله إلا الله', 'لا حولَ ولا قوةَ إلا بالله']

extend(): لإضافة أكثر من عنصر في نهاية القائمة.
l.extend([])
وبين الأقواس المربعة نضع العناصر التي نريد إضافتها.

insert(): لإضافة عنصر في مكان محدد.
l.insert(2, "حسبِيَ الله")
أي نضيف هذا العنصر في الموضع 2 سيتم إضافته بعد العنصر رقم 1 يعني سيكون العنصر الثالث في القائمة.

clear(): لحذف جميع عناصر القائمة.
l.clear()

reverse(): لعكس الترتيب وجعلها تبدأ من آخر عنصر لأول عنصر.
l.reverse()

remove(): لحذف عنصر.
l.remove("الحمد لله")

pop(): لحذف عنصر ما لكن باستخدام رقمه.
l.pop(4)
كما أنهُ يمكننا استخدام remove أيضا بهذه الطريقة:
l.remove(l[2])

sort(): لإعادة ترتيب القائمة تصاعديا من الأصغر إلى الأكبر.

وإلى لقاءٍ آخر إن شاء الله.

الدرس السادس: المكتبات


• المكتبة, LIBRARY:
تُسَمَى المكتبة وتُسمَى أيضاً الوِحدة البرمجية اسمها الشائع بالعربي مكتبات
واسمها الشائع بالانكليزي modules.
هي عبارة عن ملف من ملفات البايثون وملحق الملف من ملحقات ملفات البايثون المعروفة, تحوي مجموعة من الدوال, يتم استيرادها أولاً عن طريق كلمة import استيراد أو استدعاء، وهي على نوعين:
الأولى مدمجة مع البايثون أي تجيء مع البايثون المثبت على جهازك والثانية يتم تحميلها من النت أو الإتيان بها من مكان آخر وإضافتها إلى البايثون فما فائدة هذا التفصيل وهذا التقسيم؟
القسم الأول المكتبات القياسية القادمة مع بايثون يتم استدعاؤها بكل سهولة ولا تحتاج منك تثبيت ولمّا تستدعيها لا تخرج لك رسالة خطأ لأنها موجودة بالفعل، وليس لك فضل في وجودها فهي مثبتة مع تثبيت البايثون.
القسم الثاني مكتبات غير قياسية متى استدعيتها مباشرة ستظهر رسالة خطأ بأنها غير معروفة لأنها غير مثبتة على جهازك تحتاج الإتيان بها من النت ثم تثبيتها ثم استدعاؤها.
مثال على النوع الأول :
مكتبة: webbrowser
افتح بوابة بايثون واكتب 
import webbrowser 
لا تخطئ في كتابة هذه المكتبة لنتعَرَّفْ عليها عن قرب, اسمها يوحي بأن لها علاقة بالإنترنت web browser فصلْتُها عن بعض كي تعرفوها 
تعمل هذه المكتبة بعض المهام أهمها فتح أي رابط من خلال متصفحك الافتراضي, مثال حي:
import webbrowser
طبعاً هذه مكتبة تحوي دوال نكتب اسم المكتبة ثم نقطة ثم الدالة التي نريد على النحو التالي:
webbrowser.open('www.google.com')
لاحِظوا معي أن دالة open ومعناها بالعربي فتح قد فتحت صفحة google بمتصفحك الافتراضي. والنتيجة هذه المرة عملية وليس مجرد طباعة كلمات على وجه الشاشة.
الحذر ثم الحذر ثم الحذر من أن تنسى كتابة رابط الصفحة التي تريد بين قوسين وعلامتي تنصيص لأن الرابط سلسلة نصية فيجب كتابته بين علامتَي تنصيص ولأن هذه السلسلة النصية تحت تصرف open فإننا وضعناها بين قوسين هلاليين بعد open مباشرة.
الناتج:
import webbrowser
webbrowser.open('www.google.com')
True
ما معنى True? معناها حقيقي أي عكس مزيف, فيها كلام كثير سنفصله عند دراسة التعبيرات المنطقية لاحقا بإذن الله تعالى. 
الواجب:
تعامل مع مكتبة webbrowser ودالتها open على النحو المبين سابقاً ولكنْ أرجوك غيّر رابط الصفحة بِرابط آخر أنتظركُم بمنتهى الشغف.
لكن توقفوا نحن قلنا هناك مكتبات قياسية وأخرى غير قياسية فنريد مثال على غير القياسية.
نعم غير القياسية تحتاج تحميل أي أعطيكم رابط وأعلّمكم كيف تركبونها, على فكرة مكتبات بايثون غير القياسية كثيرة فهناك ما هو مختص بعلم الجبر وأخرى بالعلوم الهندسية والأحياء والجغرافية والخرائط والرسوم المتحركة وألعاب الفيديو ثلاثية الأبعاد وتشغيل الميديا وإرسال رسائل من بريد جوجل واتصال الشبكات وتصميم المواقع والتعامل مع الموبايل وإنشاء قرافِك للبرامج التي تنشئها, وهناك ما هو سري وخاص مثل مكتبات ناسا وكالة الطيران والفضاء الأمريكية، ومكتبات جوجل. 
كما أنهُ توجد مكتبات افتراضيا مع nvda وليست قياسية في الحقيقة أي نجدُها تعمل في البوابة ولكن عند استخدامِها بشكلٍ آخر مع اللغة المثبتة فلن نجدُها،
أيضا فإن هناك مكتبات تأتي مع nvda وهي خاصة به لا تعمل مع غيره أي لا يمكنُنا استخدامِها إلا داخله فقط، وهاكم هذا المِثال:
اسم المكتبة tones هل تعرفون معناها?, نعم تختص بصوت البيب بييييب لنجرب أولاً نستدعي:
import tones
الدالة التي سنشغلها من دوال هذه المكتبة دالة beep هيا يا أصدقاء
tones.beep(1000,1000)
الناتج:
import tones
tones.beep(1000,1000)
طيب لا يوجد ما يدل على نجاح العملية.
نعم نجاحها يكون حينَ تسمع صوت بييب وإلا ستظهر رسالة الخطأ.
تدربوا عليها فهي مفيدة نوعاً ما ويمكن اللعب بقيمة ما بين الأقواس لكن بشيء من الحذر والصبر فهناك سقف أدنى وأعلى أحد الرقمين هو زمن الصوت والثاني حدة الصوت.
سؤال عام للجميع وليس عليه نقاط ما نوع البيانات ما بين القوسين في دالة بيييب؟

لا تنسَ ذكر الله

إجابة الأسئلة:
import webbrowser
webbrowser.open("www.AlaqsaVoice.ps")
True
طبعا True هنا لا تعني أن الرابط صحيح بل صحة الكود وأنهُ جاري تنفيذ العملية.
إجابة السؤال الثاني:
import tones
tones.beep(1500, 500)
نلاحِظ أن أي مكتبة عند استخدامِها نكتُب اسمِها أولا ثُم نتبعُها باسم الدالة المُراد استخدامِها.
نوع البيب هنا: أعداد صحيحة.
اللهم علِمنا ما ينفعنا وانفعنا بما علَمْتَنا وزِدْنا عِلْما.

الدرس السابع: التعبيرات المنطقية وأسلوب الشرط


درس اليوم وهو من قسمين:
الأول التعبيرات المنطقية:

إخوتي الكرام العاقلُ يعلم تمامَ العِلْم أنَّ الجَبَلَ أكبر من الفأر, وأن اليد اليمنى تساوي اليد اليسرَى, وأن البئر أصغر من البحر. عندما يفقد الإنسان هذه القدرة على فهم المنطق يُسَمَى مجنوناً.
هذه الأمور تُسمى التعبيرات المنطقية:
انتبِه عزيزي القارِئ ولا تقلق الأمر يسير
أيهما أكبر 1000 أم 5
أيهما أصغر 2 أو 32
هل ناتج 3+3 يساوي ناتج 2ضرب 3
هذه هي التعبيرات المنطقية يا أصدقاء لنُطَبِّقْها سَوِيَّاً.
اكتبْ:
w = 2+2
w == 4
الناتج:
w = 2+2
w == 4
True
الشرح:
أنشأنا متغير أسميناه w وأنت حُرّ في اختيار الاسم بشرط احتِرَام الشروط الأربعة المتفق عليها بيننا, ثم أدخلنا فيه قيمة هذه القيمة قيمة عددية صحيحة وهي ناتج 2+2 يعني بايثون ذكي جمع 2+2 فحصَل على 4 وما حصَل عليه أدخله في أحشاء w
هكذا انتهتْ عملية الإسناد ثم قمنا بالمقارنة هل المتغير w يساوي 4 وهذا رقم وضعناه بكامل الحرّية, أنت ضع ما تشاء حين التجارب.
أخذ بايثون الرقم 4 وقارنه مع محتوى w وهو 4 فوجد أن 4 الموجودة في w مساوية للرقم 4 الذي كتبناه, وهكذا أعطانا النتيجة وهي نجاح المقارنة True 
طيب ما رأيكم أنْ نُجَرِّب تغيير الكفَّةِ الثانية من الميزان وهي ما بعد عَلَامَتَي اليساوي. على فكرة اليساوي في الإسناد نكتبه مرة واحدة وفي التعبيرات المنطقية مرتين فاليساوي في الإسناد يدخل قيمة داخل متغير لكنه في التعبيرات المنطقية يقارن تشابه كَفَّتَي الميزان اليُسرَى واليُمىى. 
w == 5
النتيجة:
w == 5
False
كلمة False تعني مزيف لكننا نفهمها هنا بمعنى آخر وهو عدم تحقق الأمر وهنا في مثالِنا التساوي بين قيمة w وهي 4 مع الرقم 5 لأن الرقم خمسة لا يساوي w بل هو أكبر من w.
هذا بالنسبة للتساوي فماذا عن الأصغر من والأكبر من سأكتب وأنتم تجربون.
w < 5
w>5
w<1
w>1
الناتج:
w < 5
True
w>5
False
w<1
False
w>1
True
جرّبُوا بأنفسكم ولا تكْتَفُوا بمجرد القراءة.
أتمنى منكم أن تكون البوابة مفتوحة قبل أن تفتحوا الدرس, ثم تقرؤوا حتى إذا وصلتم في القراءة إلى كود كتبتُه لكم, تأخذونه لا بالنسخ واللصق بل بالفكر والتأمُّل,ثم تجربوه في البوابة.
شيء آخر قبل نهاية هذا القسم, ليس الأرقام وحدها مَن يخضع للتعابير المنطقية بل حتى النصوص لنجرب.
'man' == 'boy'
False
إذ أنّ كلمة man لا تُشْبِه كلمة boy في الحروف طبعاً.
المقارنة تتم بين السلسلتين النصيتين هل هما متطابقتين أَم لا. 
تُستخدم هذه العملية في كل لغات البرمجة للبحث عن كلمة ما, أنت مثلاً في ميكرو سوفت وورد تفتح محاورة بحث وتكتب كلمة ثم تضغط انتر ما سيتم هو مقارنة كل كلمة في المستند بالكلمة التي أدخلْتَها ويتم ذلك بهذه الطريقة التي شرحتُها لكم.
'man' == 'man'
True
قلْنا أن كلمة True معناها أن الأمر متحقق وكلمة False أنه غير متحقق.
أما إذا كانت الكلمات غير متطابقة فإن أكبر من أو أصغر من سيعتمد على ترتيب الحروف الهجائية العربية، والأبجدية الإنجليزية لِنُجَرِب:
"man">"boy"
True
صحيح لأن حرف m يأتي في الترتيب بعد b لذلك هو أكبر.
"boy"<"girl"
True
b يسبق g في الترتيب لذلك هو أصغر.
"good"<"bad"
False
لِنُجَرِب على اللغة العربية:
"كلمة">"جملة"
True
لأن حرف الكاف بعد الجيم في الترتيب.
"حرف"<"صفحة"
True
صحيح لأن حرف الحاء يسبق الصاد فهو أصغر منه.
"سطر"<"حرف"
False
وهذه الطريقة يتم بها ترتيب العناصر في القوائم باستخدام دالة sort التي درسناها سابقا.
والأعداد كلها أصغر من الحروف، والحروف الإنجليزية أصغر من الحروف العربية.
انتهى القسم الأول.

القسم الثاني: أسلوب الشرط
إذا درَسْتَ نجحتَ, وإذا لم تدرسْ فلن تنجحَ.
يقول تعالى:{وإن أحدٌ من المشرِكينَ استَجَارَكَ فأَجِرْه حتى يسمعَ كلام الله ثم أبْلِغْه مَأمَنَهُ}.
إن توفَّرَ الشرط وهو الدراسة سيتحقق جزاؤه, وهو النجاح. وإن لم يتوفر الشرط لن يتحقق الجزاء.
إذا نجحتَ أعطيتكَ هدِية.
إذا آمنتَ وعمِلْتَ صالحاً يدْخلْكَ اللهُ جنات النعيم.
في اللغة العربية ينقسم أسلوب الشرط إلى أداة الشرط وفعله وجوابه.
في لغة بايثون نكتب أداة الشرط وفعله في سطر وفي السطر الثاني نكتب الجواب. 
ما هي أداة الشرط في بايثون؟
هي في الأساس أداة واحدة "if" ومعناها إذا.
نضعها في أول السطر ثم نضع تعبير منطقي ونفصل بين if والتعبير المنطقي وهو فعل الشرط بمسافة ثم قبل أن نغادر السطر الأول نختمه بنقطتين فوقيتين هكذا :
نأتي إلى السطر الثاني أول شيء نعمله نضغط تاب ضروووووووري أو أربع مسافات هذا يُسَمَّى التثليم أي أنهُ كل تاب واحدة تساوي 4 مسافات،
ثم تكتب جواب الشرط الذي قد يكون أي أمر مثلاً الأمر print أو tones.beep وذلك بعد استدعائها.
الأمثلة التوضيحية:

if 4<6:
	print("نعم هي أصغر")

النتيجة:
نعم هي أصغر
ملاحظة مهمَّة للغاية:
بعد فراغكَ من كتابة جملة الشرط بجميع أركانها يجب عليك ضغط انتر مرتين الأولى للانتقال إلى السطر التالي والثانية حتى يتم تنفيذ الشرط.
طيب مثال سلسلة نصية:
if 'man' == 'man':
	print (' نعم هما متساويانِ حقَّاً')

نعم هما متساويانِ حقَّاً
طيب نضيف شيء جديد ماذا لو لم يكونا متساويان. سنضيف في السطر الثالث من الشرط كلمة جديدة هي else ومعناها وإلا نفهم هذا بالعربي ثم بالبايثوني.
إذا ذهبتَ إلى بلاد الكفار فلا تأكُلَنَّ اللحم وإلا فَكُلْ ما شئتَ.
والمعنى: لو ذهبت إلى بلاد النصارى وغيرهم من الديانات الباطلة فلا تأكُل عندهم أي نوع من اللحوم إذ هم لا يُذَكُّونَ ذبائحَهم, أو يذبحونها لغير الله تعالى, ومقابل هذا المعنى وإلا فكُل ما شئتَ يعني 
وإذا لم تذهبْ فكل ما تشاء; لأنك في بلادك, بلاد الإسلام.
إذا كانت خمسة أصغر من أربعة فاطْبَع نعم وإلا اطْبَع (لا) وَتَعْنِي وإلا أي إذا لم تكن الخمسة كذلك، 
وتشمل أن تكون مساوية لها أو أكبر منها.
نأخذ مثالاً حيّاً:
w = 11
if w <3:
	print ('yes')
else:
	print ('no')

لا تنسَ ضغط الانتر مرتين بعد فراغك من آخر سطر في جملة الشرط التي تتكون من if وجوابها وelse وجوابها.يعني بعد آخر حرف في هذه الجملة تضغط انتر مرتين وليس قبله.
النتيجة:
no
ملاحظة انتبه لها جيدا وهو عدم كتابة التثليم أي التاب أو المسافات قبل else فهي تساوي if; لأنه إذا وضعنا قبلها تثليم أصبحت else في جواب if وليست شرطا آخر.

آخر كلمة نأخذها في أسلوب الشرط كلمة
 elif وهي كلمة منحوتة نحتاً من كلمتين هما if و else ومعناها أَمّا إذا مثال عربي:
إذا ذهبتَ إلى البحر:
فاستمتع بالسباحة
أمّا إذا ذهبتَ إلى حديقة الحيوان:
فاستمتع بمشاهدة الحيوانات 
أما إذا ذهبْتَ إلى الغابة :
فاستمتع بالصيد
طبعاً هذا أسلوب ركيك من حيث العربية لكنّ بايثون يستخدم هذا الأسلوب بل معظم لغات البرمجة.
if w==12:
	print ("يساويها")
elif w<12:
	print ("أصغر منها")
elif w>12:
	print("أكبر منها")
لنضغط إنتر مرتين ونرى النتيجة

أصغر منها

الواجب:
أَخرِجْ ثلاث أخطاء برمجية من الكود التالي:
import webbrowser
if 'nvda' = 'nvda'
webBrowser.open[www.google.com']
أَخرِج خطَأ واحد من الكود التالي:
my friend = 'abu obaida'
السؤال الأخير أريد جُمل شرطية تستخدم الأدوات الثلاث بشرط أن يكون هناك إبداع حقيقي يقنعني بأنه لا نسخ ولا لصق. 
بالتوفيق للجميع.
لا تَنسى ذِكر الله 

إجابة الأسئلة:
في الكود الأول: 
if 'nvda' = 'nvda'
تمت كتابة علامة يساوي مرة واحدة والصحيح كتابتها مرتين، 
والثاني لم يتم كتابة نقطتين في نهاية الشرط
webBrowser.open[www.google.com']
كُتِبَت الb الثانية بحرف كبير، وكُتِبَت أقواس الدالة بأقواس مربعة وهذا خطأ الصحيح كتابتها بأقواس هلالية،
الثالث: كتابة تنصيص بعد السلسلة النصية وعدم كتابته قبلها.
my friend = 'abu obaida'
الخطأ هنا ترك مسافة في اسم المتغيِر.
الآن لِنَكتُب مِثالا على أسلوب الشرط:
import webbrowser
import tones
if 5*5==20:
	webbrowser.open("www.google.com")
elif 5*5> 25:
	tones.beep(1000, 500)
else:
	print (5*5, "هي الإجابة الصحيحة")

الآن انتهينا من كتابة الشرط، نلاحِظ أن الشرط وجوابه كأنهم كود واحد لا نعرف نتيجتهم إلا بعد الانتهاء من كتابة الكود كاملا.
وهنا نقول إذا كانت 5 في 5 تساوي 20 افتح لنا موقع جوجل 
أما إذا كانت 5 في 5 أكبر من 25 فأصدر صوت بيب 
ولو كانت غير ذلك يعني لا 20 ولا أكبر من 25 أي شيء آخر اطبعلي النتيجة وقول أن هذه هي الإجابة الصحيحة، لنرى النتيجة:
25 هي الإجابة الصحيحة

لا تَنسى ذِكر الله

ملحق بالدرس السابع


نريد متغيرين من نوع السلاسل النصّية:
الأول:
x = 'salah'
والثاني:
y = 'alhashimi'
جميل جداً الآن سنشتغل عليهما, التركيز التركيز يا أحباب بايثون.
if 'h' in x:
	print ('ok')

ok
قلْنا للعزيز بايثون إذا كان حرف h موجوداً في المتغير x فاطْبَعْ ok الأمر واضح.
if 's' in x and 's' in y:
	print ('موجودٌ في كل من المتغيرين')

موجودٌ في كل من المتغيرين
قلْنا لبايثون هل حرف s مشترك بين صلاح والهاشمي فأجاب بما أمرناه أن يجيب عليه إن كانت الإجابة صحيحة وهي أن يطبع جملة بعينها.
مثال آخر نستخدم فيه التخيير وليس مطلق الجمع، فالواو تفيد مطلق الجمع وأما أو فتفيد التخيير أو الشكّ محمد قد يكون في البيت أو في الجامعة.
if 'm' in x or 'm' in y:
	print ('حرف m موجود في واحد من المتغيرين وليسَ كلاهما')

حرف m موجود في واحد من المتغيرين وليسَ كلاهما
الكلام واضح قلْنا له إذا كان حرف m في صلاح أو في الهاشمي فاطبعْ النص من فضلك يا بايثون العزيز.
الآن أمر مختلف هل تذكرون is are am وكيف كنا ننفيها نعم باستخدام not ستضع هذا المعامل قبل أي دالة تريد أن تنفيها.
if 'm' not in x:
	print ('حرف m غير موجود في المتغير x, والذي قِيمَته %s وهو طبعاً من نوع string' % (x))

حرف m غير موجود في المتغير x, والذي قِيمَته salah وهو طبعاً من نوع string

الآن نأخذ دالة جديدة من دوال المحارف string وهي islower() وعلينا أن نتفطّن أنها لا تأخذ أي وسيط بين أقواسها الهلالية وليست هي نفس الدالة lower فدالة lower()تحوّل النص المكتوب بحروف كبيرة إلى نص مكتوب بحروف صغيرة وأما islower فهي ذات طبيعة خاصة وهي نوع مختلف من البيانات. إنها من نوع bool وهذا النوع من البيانات يعني باختصار الكائنات المنطقية.
الكائنات المنطقية bool أو التعابير المنطقية تعرّضنا لها في مقدمة هذا الدرس من زاوية مختلفة, كتمهيد للجمل الشرطية ولكن الآن أريدك أن تدْرُسَها باعتبارها نوع من أنواع البيانات تضيفها إلى السلاسل النصية string والأعداد الصحيحة integer والأعداد العشرية float والقوائم list. والآن الكائنات المنطقية أو التعابير المنطقية.
اعلَمْ عزيزي الهاشمي أنّ البيان bool اختصار ل Boolean أي منطقي يعني إما صواب وإما خطأ، وهو قيمتان: 
True الصواب وهي تُكافئ الواحد
False الخطأ وهي تكافئ الصفر
لاحظ أن True و False تكتب بأحرف أولى كبيرة. 
5<1
False
2<4
True
True or False
True
True and False
False
True==False
False
True!=False
True
True==1
True
False==0
True
علامة المساواة المزدوجة هي عملية فحص المساواة وليست عملية إسناد assignment وناتجها منطقي أي إما صواب وإما خطأ. إذا استعملت عملية الإسناد أو ما يُسمّى بالنقل والإحلال في سياق شرطي ستحصل على خطأ. 
لكن عند التحويل إلى bool ثمَّة الكثير من الأشياء تتحول إلى True أو إلى False مثلا أي عدد غير الصفر يُعدُّ صواباً True 
bool(5)
True
العدم وما أدراكَ ما العدَم, سبحان الله الخالق
العدمُ None
وهو كائن يمثل عدم وجود قيمة denoting lack of value 
None==False
False
bool(None)==False
True
الآن نعود إلى الدالة islower ونوعها كائن منطقي بعكس lower() والتي عرفتم أن نوعها string.
x.islower()
True
if x.islower():
	print ('small')

small
وماذا عن isupper() هل تروني مضطراً لأنْ أشرحها لا أعتقد عندما أقول لكم هي نفس أختها islower() فهذا يكفي.
لنضرِبْ مثالاً عن isupper()
if not x.isupper():
	print ('نعم هو غير مكتوب بحروف كبيرة')

نعم هو غير مكتوب بحروف كبيرة
هناك دالة أخرى هي title يتم استخدامها على النحو التالي:
print (x.title())
وظيفة هذه الدالة تحويل أول حرف في كل كلمة من الكلمات الموجودة داخل السلسلة النصية إلى حرف كبير كعادة كتابة الانكليز للعناوين.
سؤال ما نوع الدالة title؟ هيا يا أبطال

لا تَنسَ ذكر الله 

الدرس الثامن: الحلقات التكرارية


الحلقات التكرارية: هي طريقة نستخدمها لتكرار فعل ما بدل كتابة الكود عشر مرات أو حتى مائة مرة أو ما لا يُحصَى,الأفضل والأجدى نستغني بهذه الحلقات عن كل هذه المتاعب الجَمَّة.
عندنا في بايثون نوعين من الحلقات التكرارية هما:
for و while وهما الاثنين بمعنى واحد تقريباً يمكن ترجمة كلمة for بمعنى إلى مسافة معينة, هذا أن استعنَّ بالقاموس للترجمة, لكنّي أُفضِّل شخصياً ترجمتها بمعنى ما دامَ، أو طالما 
وكذا while بنفس المعنى تقريباً فما الخلاف بينهما, سيتبين هذا الفرق عند الشرح.
نكتب متغير نصّي كمثالوهو كالعادة اسم معلمكُم فهل عندكم مانع؟
name = 'salah ali atair'
حتى اطبعَ كل حرف من اسمي أحتاج إلى print بعدد الحروف هكذا :
print (name[0])
s
print (name[1])
a
print (name[2])
l
> print (name[3])
a
print (name[4])
h
 for لنختصر الكثير من الوقت والجهد وحجم البرنامج الذي نكتُبُه أيضاً, قد تجد برنامجين يؤديان نفس الغرض أحدهما حجمه 12 ميجا والآخر حجمه 3 ميجا ولا فرق حقيقي بينهما أيهما تفضل؟ المبرمج الذي يُصمم برنامجاً يُصمّمه غيره بحجم أقل هو مبرمج أقلُّ ما يقال فيه أنه فاشلٌ بامتياز مع مرْتبَة الشرف.
تأملوا الآن معي بآذان وعقول واعية.
for i in name:
	print (i)

النتيجة:
s
a
l
a
h

a
l
i

a
t
a
i
r

هل رأيتم الفرق؟ هذه الحروف التي تم طباعتُها هي مخرجات وليستْ مدخلات لا يأتِنِي أحدُ الناسِ ويقول لي أن أسطر الحلقة زادت عن الخمسة عشر سطْرَاً فالحلقة تنتهي في سطرين فقط هما:
for i in name:
	print (i)
وكَفَى. سيتم طبْعُ كل الحروف بمنتهى الدقة والأناقة. نريد شرح لهذين السطرين البسيطين.
كتبنا في الأول for وهي قوام الأمر كله وأساسه ومعناها ما دامَ ثم مسافة ثم حرف i هذا متغير يتعرف عليه بايثون تلقائياً ولا يحتاج منك لعملية إحلال أي إسناد. لكَ أن تكتب أي كلمة أو حرفاً بشرط أن تخضع للشروط الأربعة المعروفة عند تسمية المتغيرات. ولكنْ لماذا تعارف المبرمجون في الغالب على تسمية هذا المتغير بالذات باسم i?
حرف i هو الحرف الأول من كلمة item ومعناها العنصر, طَيِّب ما هي قيمة هذا المتغير؟
قد يكون أي نوع من أنواع البيانات وهو عبارة عن أحد عناصر ما بَعد in سنعود للمتغير i لكنْ علينا إكمال الشرح أولاً, بعد المتغير i نجد المعامل المنطقي in ثم بعده نكتب متغير يتم إسناده في عملية منفصلة تكون قبل الحلقة وقد أسندنا name بعد هذه الكلمة نضع نقطتين رأسيتين ثم انتر للنزول إلى السطر الثاني ثم تاب والذي أوجبَ علينا التاب ليس كلمة for وفي الشرط ليست كلمة if بل النقطتين الرأسيتَين هما سبب التاب فكلما كانت هناك نقطتين رأسيتَين في نهاية سطر من الأسطر وجب علينا في السطر التالي له كتابة تاب مرة واحدة بعد النزول وكتابة تاب تكتب ما تشاء من أكواد تريدها أن تتكرر, طيَّب كم ستتكرر مرة هذه الأكواد نعم هنا نرجع إلى i i عبارة عن عنصر في المتغير الموجود في آخر السطر الأول قبل النقطتين الفوقيتين عندنا كلمة name ونوعها string وقيمتها 'salah ali atair' كل حرف من حروف قيمة المتغير هي عنصر ولمّا تقول له إطباع i فإنك تقول له اطْبَع العناصر عنصراً عنصر من الصفر حتى آخر عنصر وهو حرف r , سيتكرر الكود بعدد عناصر النص الموجود داخل المتغير name 
المثال في شكل مخالف .
for i in name:
	print ('سبحان الله وَبِحمْدِه سبحان الله العظيم')

النتيجة:
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
سبحان الله وَبِحمْدِه سبحان الله العظيم
هكذا تم طباعة التسبيحة بعدد عناصر السلسلة النصية القابعة داخل المتغير name وهي 'salah ali atair'
وعدد أحرف هذه السلسلة النصية 15 مبدوءة بصفر ومنتهية بِ14 سيدور الكود بعدد عناصر المتغير name.
هل يمكن وضع متغيرات أخرى غير السلاسل النصية في آخر جملة for ؟
الإجابة نعم ولكنْ ليس الكلام على إطلاقه سنجرب القوائم أولاً.
# نكتب متغير قائمي يعني قيمته قائمة، سنكتب أسماء المداومين على هذه الدورة على الشكل التالي:
x = ['محمد الهاشمي', 'محمد عبد الفتاح', 'أبو هاشم', 'أم عبد الرحمن', 'العصامية المسلمة','أشرف هلال', 'المسلم', 'أبو معاذ', 'أبو أيوب']
for i in x:
	print (i)
نضغط بعد نهاية هذا السطر انتر مرتين.
لننظُرْ في النتيجة.

محمد الهاشمي
محمد عبد الفتاح
أبو هاشم
أم عبد الرحمن
العصامية المسلمة
أشرف هلال
المسلم
أبو معاذ
أبو أيوب
انتهتْ النتائج.
الآن لنلعب لعبة جميلة:
نريد متغير من نوع قائمة وآخر من نوع عدد المتغير العددي الصحيح سنعطيه قيمة صفر. والمتغير القائمة سيكون مشابه للمتغير السابق, يعني القائمة ستحوي مجموعة من العناصر يمثلنَ في مجموعهن عدد متابِعِي الدورة والصامدين حتى الآن.
x = ['محمد الهاشمي', 'محمد عبد الفتاح', 'أبو هاشم', 'أم عبد الرحمن', 'العصامية المسلمة','أشرف هلال', 'المسلم', 'أبو معاذ', 'أبو أيوب']
y = 0
for i in x:
	y = y+1
	print (y)
الآن بعد نهاية السطر اضغط الانتر مرتين إحداهما للذهاب إلى السطر التالي والأخرى للخروج من كتابة الحلقة وتنفيذها.

لننظُرْ في النتيجة:
1
2
3
4
5
6
7
8
9
سؤال كم عدد عناصر القائمة x? 
نعم إجابتكم صحيحة عدد العناصر 9 
ولكنْ القائمة x أكبر من حيث عدد الحروف من السلسلة النصية name فلماذا كان عدد عناصر السلسلة النصية 15 وعدد عناصر القائمة 9؟
الإجابة سهلة كل حرف في السلسلة النصية هو عنصر وأما القاءمة فتختلف كل كائن يَشْغَل خانة في القائمة يُعَدُّ عنصراً, لاحِظْ أن عندنا داخل القائمة 9 سلاسل نصية هي أسماؤكم, كل سلسلة تُعدُّ عنصراً واحداً.
لا يزال عندنا كلام عن التكرار بالحلقة for لكن نريد منكم أمثلة مشابهة للمثال التالي:
الواجب:
بعض أحياء مدينتي:

c = ['العروبة', 'فاطمة الزهراء', 'عمر المختار', 'الدائري الشمالي', 'البيضاء الجديدة', 'الشعبية', 'الجُنَيِّن', 'السوق الفوقي', 'سيدي رافع', 'حارة الملح', 'حي البُسَطاء', 'الخنساء']
n = 0
for i in c:
	n = n+1
	if n == 1:
		print ('هذه بعض أهم أحياء وشوارع مدينة البيضاء في ليبيا:\n')
	print (str(n)+'-'+i)
النتيجة:

هذه بعض أهم أحياء وشوارع مدينة البيضاء في ليبيا:

1-العروبة
2-فاطمة الزهراء
3-عمر المختار
4-الدائري الشمالي
5-البيضاء الجديدة
6-الشعبية
7-الجُنَيِّن
8-السوق الفوقي
9-سيدي رافع
10-حارة الملح
11-حي البُسَطاء
12-الخنساء
لا تَنسَ ذِكرَ الله
الإجابة من المشاركين: 
الهاشمي
السلام عليكم
أخي صلاح أرجو هذه المرة ألا تسبقني أم عبد الرحمن: ههههه
هذا الواجب:
x = ['القصر الكبير', 'العرائش', 'طنجة', 'الرباط', 'الدار البيضاء', 'مراكش', 'تطوان', 'مكناس', 'وجدة', 'فاس', 'العيون']
d = 0
> for i in x:
	d = d+1
	if d ==1:
		print ('هذه بعض مدن المملكة المغربية:\n')
	print (str(d)+'-'+i)

هذه بعض مدن المملكة المغربية:
1-القصر الكبير
2-العرائش
3-طنجة
4-الرباط
5-الدار البيضاء
6-مراكش
7-تطوان
8-مكناس
9-وجدة
10-فاس
11-العيون

بالتوفيق للجميع
لا تَنسَ ذِكر الله 

إجابة أخرى مع الشرح:
x = ['القدس','غزة','الخليل','تل الربيع','بيت لحم']
n = 0
for i in x:
	n = n+1
	if n ==1:
#بعد ما إشترطنا هنا ما اشترطناه, قبل جواب الشرط علينا وضع تثليمتان, أي أن نضغط على tab مرتين, أو ما يعادلها, ثم نكتب الأمر print بعدهما, وكما قلت الأستاذ قد يفيدنا بمزيد..
		print ('هذه بعض مدن فلسطين المحتلة, والمحرَّرَ إن شاء الله:\n')
#ثم هنا انتهى جواب الشرط نرجع للحلقة أي نكتب تاب واحد في السطر اتالي:
	print (str(n)+'-'+i)

هذه بعض مدن فلسطين المحتلة, والمحرَّرَ إن شاء الله:

1-القدس
2-غزة
3-الخليل
4-تل الربيع
5-بيت لحم

لا تنسَ ذِكْرَ الله.

أم عبد الرحمن 
بارك الله فيك أستاذي الهاشمي
فهمت الآن قبل أمر الطباعة نحتاج لتثليمتين أحدهما لأجل نقطتين الرأسيتين لسطر for والثانية لأجل نقطتين الرأسيتين في جملة الشرط if 
وأما أمر الطباعة الثاني فلا يحتاج إلا تثليمة لأن في جملة الشرط نحتاج تثليمة فقط لسطر الذي يلي جملة الشرط
أتمنى أني أترجم ما أفهمه بأسلوب صحيح 
هذا تطبيق لكلامك رعاك الله، والشكر لك مرارا
q = ['مَنْسف', 'مقلوبة', 'مُسخن', 'ورق عنب', 'كوسى محشي']
b = 0
for i in q:
	b = b+1
	if b == 1:
		print ('بعض المأكولات المشهورة بفلسطين:\n')
	print (str(b)+'-'+i)

بعض المأكولات المشهورة بفلسطين:

1-مَنْسف
2-مقلوبة
3-مُسخن
4-ورق عنب
5-كوسى محشي
لا تنسَ ذِكْرَ الله.

ملحق بالدرس الثامن: الحلقة for


إخوتي الكرام اليوم سنتعلم أكثر حول الحلقة for لن يكون هناك جديد إنما كل الذي يتم شرحه ها هنا تثبيت للأفكار السابقة.
ما رأيكم في أن نُعِدَّ جدولاً لضرب الرقم 3 من الصفر حتى 12 ما الذي سنحتاجه؟
سنحتاج إلى إنشاء مُتَغَيّر يكون الرقم المراد ضربه في ثلاثة وسيكون هذا المتغير حاملاً لقِيمة رقمية لكنها متغيرة مرة تكون صفر ومرة واحد ومرة 2 حتى 12 وهذا المتغير لسنا في حاجة لإسناده لكننا سنستخدم حرف i كاسم له، وعلينا أن نلاحظ أن i ليسَ إلا عنصراً في سلسلة نصية أو في قائمة.
هنا نحتاج لكتابة متغير تكون قيمته قائمة أو ما يسمّى باللائِحَة والذي يحلو لبعض لغات البرمجة تسميته مصفوفة، هذه القائمة تحوي أرقاماً من الصفر حتى 12 وثمة طريقة نعد فيها هذه القائمة دون الحاجة لكتابتها كلها،
لِنبدأ العمل:
x = list(range(13))
ما الذي حدث بالضبط؟ 
range هذه الدالة تعطينا مجموعة أرقام من وإلى الرقم الذي نحدده، وعرفنا فيما سبق أن إلى لا تعني الرقم الذي سنكتبه بل الذي قبله، وهنا لم نحدد رقم في البداية فسيبدأ من الصفر.
لنطبعه حتى نتأكد أنها قائمة تحوي الأرقام:
print (x)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

الآن لنبدأ العمل سنضرب 3 في i والذي يمثل في كل دورة عنصراً من عناصر القائمة x يعني سيأخذ في الدورة الأولى رقم صفر وسيأخذ في الدورة الثانية رقم1 وهكذا إلى أن تأتي الدورة الأخيرة ويأخذ فيها قيمة العنصر الأخير من القائمة وهو الرقم 12.
for i in x:
	y = 3*i
	print (f'3*{i}={y}')
علينا أن نفرق بين ما هو رقمي وما هو نصي في المثال السابق.
كانت قيمة المتغير y هي الناتج من ضرب 3 في i والذي تتغير قيمته في كل دورة ابتداءً من ال الصفر وانتهاء بِ12. ثم طبَعنا الناتج بطريقة منظمة في سلسلة نصية.مستعينين في ذلك بالمتغيَّرَين السابقين y و x

الآن إلى الناتج من هذه الجلسة.
3*0=0
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27
3*10=30
3*11=33
3*12=36
الواجب: اختر أي جدول وقم بتنفيذه كهذا المثال.
لا تنسَ ذِكْرَ الله

الإجابة من المشاركين:
أم عبد الرحمن 
الواجب 
جدول 6

f = list(range(13))
for i in f:
	m = 6*i
	print ('6*%d=%d' % (i,m))

6*0=0
6*1=6
6*2=12
6*3=18
6*4=24
6*5=30
6*6=36
6*7=42
6*8=48
6*9=54
6*10=60
6*11=66
6*12=72

لا تنسَ ذِكْرَ الله.

ملحق بالدرس الثامن: الحلقة while


#الحلقة التكرارية while
# هذه الحلقة خطيرة للغاية, فإذا أخطأتَ في استخدامها, فإنك لا محالة ستضطر لإعادة تشغيل الجهاز وذلك أنَّ الجهاز سيتعرض لحالة تجمّد كاملة فلا يحرك ساكناً, لذلك حاولْ بذل أقصى ما عندك من جهود لفهمِ هذا الأمر وتطبيقه بشكل ممتاز.
# بالنسبة للسطر الأول من الحلقة فهو أشبه بجملة الشرط if لكنْ استبدلْ if بِwhile>
# يعني اكتب while ومعناها طالما, ثم التعبير المنطقي ثم نقطتين رأسيتين ثم انتر , ستجد نفسكَ بعدها في سطر جديد أول شيء ستكتبه هنا تاب أي التثليم وسببه النقطتين فهما دائماً يتسببان في التثليم ما داما في نهاية السطر السابق.
# بعد الإزاحة عليك أن تكتبَ الأكواد التي يجب أن تتكرر. نأخذ مثالاً على ذلك.
x = 0
while x <= 30:
	print (x)
	x = x+1

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ماذا تلاحظ من المثال السابق؟
#أعطينا قيمة رقمية لمتغير سمّيناه x وهذه القيمة صفر, ثم قلنا لبايثون عليك أن تفعل ما نأمرك به ما دامت x أصغر من أو تساوي 30, والأمر الذي طلبنا من بايثون أن يعمل على تكراره هو طباعة x والتي تساوي في الوقت الحالي صفر. ثم قلنا له غيّر قيمة x إلى x+1 وهكذا في كل دورة سيزيد بايثون واحد على قيمة x وفي كل دورة سيطبع x الذي ستتغير قيمته من دورة لأخرى, ولمّا يكون المتغير حامل لقيمة 29 سينتظر الأمر التالي في آخر دورة إلا دورة فيزيد واحد على x فتصبح ثلاثين فتدور الدورة الأخيرة سطراً بسطر فيجد بايثون أن شرط الاستمرار هو أن يكون x أصغر أو مساوياً لثلاثين فيمرر الأكواد التي تحت هذا الشرط وهما طبع x فيتم طبعها بقيمة 30 ثم يأتي لزيادة واحد على x ثم تدور دورة غير كاملة تتوقف عند الشرط حين يرى بايثون أن x أصبحتْ أكبر من ثلاثين يعني الشرط انتفى وهنا يأمر بايثون الحلقة بأن تُكسَرَ, فنخرج من هذا الأمر لكنْ تخيل لو أنك لم تضف واحد على قيمة x , في هذه الحالة لن يتغير المتغير x ويضل صفراً وهذا يتيح لبايثون الاستمرارية في الدوران إلى ما لا نهاية فيكون أمامك أحد احتمالات ثلاثة لإنهاء الدوران وهي:
#1 أن تعيد تشغيل الجهاز وتفقد بياناتك التي لم تحفظها.
#2 أن ينقطع التيار الكهربائي عن المنزل. وهذا طبعاً سيريحك من إعادة تشغيل الجهاز هاهاهاهها
#3 أن تسْمَعَ الصيحة الأولى معلنةً عن رفع الأقلام وجفاف الصحف ونصب الموازين, {هنالك تبْلُو كلُّ نفسٍ ما أسلفَتْ ورُدُّوا إلى الله مولاهم الحق وضلَّ عنهم ما كانوا يفترون}.

لا تنسَ ذِكْرَ الله

مَنْ يشرح لي هذه الأكواد؟

safety = 0
x = 0
y = True
while safety <= 100:
	print (x)
	if y ==True :
		x = x+1
	if x == 10:
		y = False
	elif x == 0:
		y = True
	if y == False:
		x = x-1
	safety = safety +1

النتيجة:
0
1
2
3
4
5
6
7
8
9
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9
9
8
7
6
5
4
3
2
1
0
0

لا تنسَ ذكر الله

الإجابة: حاوِل أن تُجيب بنفسِك أولا.
أم عبد الرحمن 
الشرح: 
safety = 0
x = 0
y = True
أسندنا المتغيرات لقيمتها
while safety <= 100:
ما دامت safety أصغر من 100 أو تساويها 
print x
إطبع قيمة x التي اتفقنا أنها صفر 
if y ==True :
إذا y تساوي True 
x = x+1
إجعل قيمة x = x+1 أي من الواحد فصاعدا
if x == 10:
إذا x تساوي منطقيا 10 
y = False
اجعل قيمة y تساوي False أي بمعنى أخر عندما يصل تنفيذ الشرط الأول إلى 10 أوقف العمل بالشرط الأول لأنه لم يصبح True بل أصبح False 
elif x == 0:
أما إذا كانت قيمة x تساوي منطقيا صفر 
y = True
إجعل y تساوي True أي أعيد عمل الشرط الأول الذي يقول إذا كانت قيمة y تساوي True فجعل قيمة x = x+1 ليبدأ العد من جديد من الواحد
if y == False:
أما إذا y تساوي منطقيا False وهنا أي تساوي عشرة 
x = x-1
اجعل قيمة x = x-1 أي ابدأ العد تنازليا 
safety = safety +1
واجعل قيمة safety تساوي safety + 1 ليتنفذ أمر طباعة x مرة ثانية كما هي بالشروط السابقة 
ولأن safety ممكن أن تكون أكثر من صفر على هذا الدوال توقف طباعة x تطبيقا للأمر الأول وهو 
white safety <= 100:
print x

لا تنسَ ذكر الله

ملحق بالدرس الثامن: الإفادة break


ثمة شيء مُهِمّ لا يمكننا بحال تجاوزه, وإلا فإننا نعد أنفسنا غير دارسين للحلقات, وهذا الأمر متمثل في معرفة كسر الحلقات ولو لم تصل الحلقة إلى الحد الواجب الوقوف عنده, يتم الكسر باستخدام كلمة 
break فهي تُوقف دوران الحلقة وتخرجُكَ منها تماماً, ما الفائدة من المعامل؟
هذا المعامل المُسَمَّى break تستخدمه جزءً من جواب شرط if أو إحدى أخواتها داخل الحلقة, فأحياناً تستخدم شرطاً داخل الحلقة, فإذا توفَّر الشرط رأيتَ ضرورة إنهاء عمل الحلقة لكن لاحلقة لن تتوقف بل ستستمر في الدوران فكيف ستوقفها, نعم لذلك تم إيجاد هذا المُعامل break والذي يضمن لكَ خروج آمن من الحلقة, وإليكم هذا المثال:
 سنُنشِئ متغيراً نصيّاً نكتب فيه جميع الحروف الهجائية الانكليزية ومتغير آخر نسميه x يكون هو بمثابة صمام الأمان لمنع حدوث سلوك غير محمود من قِبَل بايثون متى استمرتْ الحلقة تدور إلى ما لا نهاية.
طبعاً x سنجعله داخل الحلقة يزداد رقماً كل دورة حتى يصل إلى الرقم الذي توجب على الدائرة التوقف عنده, سيتم استدعاء حروف السلسلة النصية من خلال استخدام فكرة استجلاب العناصر وذلك بكتابة المتغير وبين قوسين مربعين كتابة رقم العنصر المراد إظهاره. لا ننسى استخدام الأمر print لطباعة عناصر السلسلة, لكن كي نستخدم المُعامل break نحتاج في مثالنا استعمال جملة الشرط وإلا فإن الدائرة ستدور وتدور حتى تصل إلى الحد المطلوب التوقف عنده. الآن عليكم أن تدرسوا هذا المثال وتركزوا على break.
x = 0
s = 'abcdefghijklmnopqrstuvwxyz'
while x <30:
	if s[x] == 'm':
		print ('ok')
		break
	else:
		print (s[x])
	x += 1

x+=1 تُعادِل x=x+1، أي هي اختصار لها.
النتيجة:
a
b
c
d
e
f
g
h
i
j
k
l
ok
نلاحظ أنه عندما وصَلَ إلى حرف m لم يطبعه بل طبع كلمة ok كما طلبنا منه تماماً ثم كُسِرتْ الدائرة وتم الخروج منها. لكنّ الكسر كان مرتبطاً بشرط وهو الوصول إلى الحرف m فلو كان هذا الشرط غير موجود لمَا توقّف بايثون حتى يصل إلى آخر عنصر وهو حرف z, هناك أرقام إضافية بعد حرف z والذي نفترض أن رقمه 25 باعتبار أن a صفر, ولكن لم نعبَأ بأمر هذه الزيادة لأن التوقف سيكون إن شاء الله عند حرف m.
الواجب:
أريد منكم إنشاء متغير يضم جميع الحروف العربية وإنشاء متغير لضمان نهاية الدائرة وعدم الدوران إلى ما لا نهاية. وأي متغيرات تراها ذات أهمية المهم أريدكَ أن تطبع الحروف العربية من الألف حتى الياء ثلاث مرات متتالية ومن يفعل ذلك في أقل عدد من الأسطر سيكون بإذن الله أذكانا وعليه تعويل كبير في إنشاء إضافاتنا المستقبلية.
بارك الله فيكم ننتظر الإجابات, بالتوفيق.

لا تنسَ ذكر الله

الإجابة:
العصامية المسلمة
السلام عليكم أستاذي :
لقد وفيت بوعدي ،وقمت بطباعة الحروف الهجاءية ثلاث مرات.
ا='أبتثجحخدذرزسشصضطظعغفقكلمنهوي'
ب=0
while ب <3:
	for i in ا:
		print (i)
	ب+=1

أ
ب
ت
ث
ج
ح
خ
د
ذ
ر
ز
س
ش
ص
ض
ط
ظ
ع
غ
ف
ق
ك
ل
م
ن
ه
و
ي
أ
ب
ت
ث
ج
ح
خ
د
ذ
ر
ز
س
ش
ص
ض
ط
ظ
ع
غ
ف
ق
ك
ل
م
ن
ه
و
ي
أ
ب
ت
ث
ج
ح
خ
د
ذ
ر
ز
س
ش
ص
ض
ط
ظ
ع
غ
ف
ق
ك
ل
م
ن
ه
و
ي

لا تنسَ ذكر الله

إجابة أخرى:
صلاح البرعصي
نعم لقد كتبتُ البرنامج في 9 أسطُر في حين كتبتْه العصامية في 6 أسطر وبفكرة أسهل وأروع ومن هذا المنطلق فإني أحَيَّيها وطبعاً كل ما كان البرنامج أقل في عدد الأسطر والحروف سيكون أقل في عدد البايتات وهذا يؤدي إلى صغر الحجم, وكلما كان حجم البرنامج صغيراً كان أفضل, تخيلوا أن برنامجي مثلاً أقول مثلاً حجمه تسعة ميجا وبرنامج العصامية حجمه ستة ميجا ويقومان بنفس العمل تماماً فأيهما ستشتري أو تُكَرِّك, هاهاهاها إليكم الأكواد.

a='أبتثجحخدذرزسشصضطظعغفقكلمنهوي'
b= 1
c = 0
while b <= 84:
	if c == 28:
		c=0
	print( a[c])
	c+=1
	b+=1
..
لا تنسَ ذكر الله


توضيح آخر عن break


سنتحدث الآن عن break هي إفادة من إفادات بايثون, ويجب أن لا نستخدم الأقواس بَعدها بعكس الدوال. تُستخدم لتوقيف عمل الحلقة. سنأخذ مثالاً بسيطاً. for i in range(1000000): print (i) if i == 10: break 0 1 2 3 4 5 6 7 8 9 10 قد تسأل ولماذا يا أخي تتعب نفسك لماذا لم تكتب التالي: for i in range(11): print i وانتهى الأمر. أقول هذا مثال بسيط فقط أعطيتكم إياه. تخيّل أنك تريد البحث عن كلمة في صفحة مستند نصي, وكتبت دالة لهذا الغرض, ستقول لبايثون كرر الدوران للحلقة والتي تفحس الكلام هل يحتوي على الكلمة المراد بحثها أم لا طيب نحن نريد العملية أقصد عملية البحث أن تستمر إلى أحد الحدّين التاليين: الأول أن نجد الكلمة وهنا نأمره بالخروج من الحلقة والوقوف على الكلمة. والثاني إن لم يجد الكلمة فإنه سيتوقف بعد 1000 دورة مثلا طبعاً كحدٍّ أقصَى. لا تنسَ ذكر الله

الدرس التاسع: الدوال والقواميس


السلام عليكم أصدقائي الأوفياء, أرجو أن تكونوا جميعاً في استعداد تام لتلقِّي الدرس التاسع 
# نبدأ الدوال مستعينينا بالله تعالى فنقول: الدوال هي مجموعة من الأكواد يتم ضم بعضها إلى بعض عن طريق وضعها تحت عنوان واحد وحين تريد استخدامها من جديد فإنك لن تضطر إلى كتباة كل تلك الأكواد مرة ثانية وثالثة ورابعة, ما عليك إلا كتابة اسم الدالة وستبدأ مباشرة في التنفيذ, فما هي الصورة العامة للدوال؟
def hi (name):
	print (f'مرحَباً {name} أرجو أن تكون بموفور الصحة والعافية أنت وكافة أفراد الأسرة, تقبّلْ تحياتي')

نشرح الدالة, هذه الدالة تختص بطباعة رسالة ترحيب إلى شخص معين وهذه الرسالة لم نحدد فيها من هو الشخص المخاطب بهذه الرسالة فيمكن استخدامها مع أي شخص ويمكنك ذلك بكل سهولة على النحو التالي:
hi('محمد الهاشمي')
مرحَباً محمد الهاشمي أرجو أن تكون بموفور الصحة والعافية أنت وكافة أفراد الأسرة, تقبّلْ تحياتي
طيّب أريد تغيير اسم الشخص الموجه له الخطاب.
hi ('أبو أيوب نضال شوَيّة')
مرحَباً أبو أيوب نضال شوَيّة أرجو أن تكون بموفور الصحة والعافية أنت وكافة أفراد الأسرة, تقبّلْ تحياتي
هذه هي الدالة وهذه الصورة العامة لاستخدامها فكيف يمكن كتابة الدوال؟
الدالة تتركب من:
1-العنوان:
وهو يحوي اسم الدالة مسبوقاً بكلمة def وبينهما مسافة ومتبوعاً بِقوسين هلاليين تليهما نقطتين رأسيتين هكذا:
def myBook():
رائع, هكذا انتهينا من القسم الأول والذي ينبغي أن نشير فيه أن القوسين الهلاليين وُضِعَا كي تكتب بينهما الوسيط المناسب والذي تترك عبء تعريفه حين استخدام الدالة وليس في وقت كتابة الدالة, فنحن كتبنا في أول مثال كلمة name وهي عبارة عن متغير لكننا لم نُسنِد إليه قيمة بل الذي سيسند إليه القيمة هو مستخدم الدالة. وقد تكون أنت أو مبرمج آخر.فالدوال التي تكتبها قد يستخدمها مبرمجون آخرون.
قلنا المتغير الذي نكتبه بين القوسين الهلاليين يسمَّى وسيط أو معامل، ورأينا في المثال الثاني أنه لا وجود لأي وسيط بين القوسين, نفهم من ذلك أن عدد الوسائط يرجع لاحتياجاتك كَمُبَرمِج, تستطيع أن تدع القوسين فارغين وهنا لا تطالب من سيستخدم الدالة بكتابة أي وسيط ولو كتبتَ فيها وسيطاً واحداً أوجبتَ عليه أن يكتب عدد واحد فقط من الوسائط فإن كتبتَ 2 كان لزاماً عليه استخدام وسيطين والآن نأخذ مثالاً ثالثاً نستخدم فيه وسيطين، أحدهما نصّي والآخر رقمي.
def x (name, age):
	print ('my name is %s and my age is %d' %(name, age))

والآن لنجَرّب الدالة المسمّاة x
x('salah',34)
my name is salah and my age is 34
هكذا تعرفنا على القسم الأول من الدالة وهو عنوان الدالة فما هو القسم الثاني والأخير منها؟
2-متن الدالة وفيه تكتب أكوادكَ كما تشاء لكن لا تنسَ أن آخر شيء كتبناه في سطر العنوان النقطتين الرأسيتين وأنتم تعرفون ما معنى أن تكون النقطتين الرأسيتين في آخر السطر البرمجي. يعني يجب أن يبدأ السطر القادم بإزاحة مناسبة تاب أو أربع مسافات أو أي تثليم مناسب بشرط أن تجعله قاعدة تسير عليها.
طيّب لو احتوى السطر الثاني شرطاً, ما عليك إلا أن تراعي هذا الأمر فتسبق جملة if بإزاحة الدالة ثم في جواب الشرط ستكتب إزاحتين الأولى من أجل عنوان الدالة فهي تنتهي بنقطتين فوقيتين والثانية من أجل الشرط فتراعي هذا الأمر, طيب تخيل أن جواب الشرط يحوي حلقة for سنبدأ سطر الحلقة بإزاحتين الأولى من أجل الدالة والثانية من أجل الشرط ثم ننتقل إلى السطر الثالث وهو جواب for ونبتدئَه بثلاث إزاحات : الأولى من أجل الدالة والثانية من أجل جملة شرط if والثالثة من أجل الحلقة for.
الآن سأستخدم الدالة السابقة دالة x كي يتم تطبيقها أكتبها ثم اضغط أنتر للتنفيذ, لكن سأفعل شيئاً خاطئاً سأكتب في الوسيط الأول كائن رقمي وفي الوسيط الثاني كائن نصي, بعكس الواقع فهي تقبل وسيطين الأول نصي والثاني رقمي, ينبغي مراعات الترتيب. تعرِّف name أولاً ثم age ثانياً وليس العكس. فما يترتب عن العكس. طبعاً أنا الآن في حال الاستخدام وليس في حال كتابة الدالة من الصفر.
x(34,'salah')
Traceback (most recent call last):
File "", line 1, in 
File "", line 2, in x
TypeError: %d format: a number is required, not str
# هل رأيتم هذا الخطأ لأنك وضعتَ الرقم مكان النص والنص مكان الرقم.تخيل أن برنامجك يشتغل وطلبتَ من المستخدم أن يكتب لك اسمه فكتب رقم بدلَ اسمه فما الذي سيحصل, سيتوقف البرنامج عن العمل وتحدث فيه مشاكل كبيرة, لذا علينا أن نعرف كيفية التعامل مع الأخطاء وهذا ما سندرسه في المشاركة التالية.

لا تنسَ ذكر الله

التطبيق على الدوال من المشاركين:
أم عبد الرحمن 
def c(mr,month):
	print ('السيد\ %s \n تقديرا لأدائكم المتميز في العمل وجهودكم المبذولة والتي تسهم في استمرار ازدهار ورقي شركتنا، يسعدني تهنئتكم باختياركم الموظف المثالي للشركة عن شهر %d \n ونحن إذ نشكركم على هذا العطاء. \n نرجو المزيد من الجهد وأن يكون عطائكم مثلا يحتذى به من الجميع. \n مع دوام التوفيق \n مدير عام:...' % (mr,month))

c('محمد محمود',12)
السيد\ محمد محمود 
تقديرا لأدائكم المتميز في العمل وجهودكم المبذولة والتي تسهم في استمرار ازدهار ورقي شركتنا، يسعدني تهنئتكم باختياركم الموظف المثالي للشركة عن شهر 12 
ونحن إذ نشكركم على هذا العطاء. 
نرجو المزيد من الجهد وأن يكون عطائكم مثلا يحتذى به من الجميع. 
مع دوام التوفيق 
مدير عام:...

c('أحمد محمود',11)
السيد\ أحمد محمود 
تقديرا لأدائكم المتميز في العمل وجهودكم المبذولة والتي تسهم في استمرار ازدهار ورقي شركتنا، يسعدني تهنئتكم باختياركم الموظف المثالي للشركة عن شهر 11 
ونحن إذ نشكركم على هذا العطاء. 
نرجو المزيد من الجهد وأن يكون عطائكم مثلا يحتذى به من الجميع. 
مع دوام التوفيق 
مدير عام:...

لا تنسَ ذكر الله

العصامية المسلمة
السلام عليكم ورحمة الله وبركاته.
def ams(a,b,c,d,e):
	print ('رجاءا قم بملء الحقول الاستمارية التالية :\nالاسم:\n%s\nتاريخ الميلاد :\nاليوم :\n%d\nالشهر :\n%d\nالسنة:\n%d\nالتوقيع:\n%s\nوصلت الآن إلى آخر الاستمارة ،اضغط على إدخال لحفظ البيانات ،أو تفريغ الحقول للتراجع .' %(a,b,c,d,e))

ams('العصامية',21,9,1996,'مرحبا')
رجاءا قم بملء الحقول الاستمارية التالية :
الاسم:
العصامية
تاريخ الميلاد :
اليوم :
21
الشهر :
9
السنة:
1996
التوقيع:
مرحبا
وصلت الآن إلى آخر الاستمارة ،اضغط على إدخال لحفظ البيانات ،أو تفريغ الحقول للتراجع .

لا تنسَ ذكر الله

الهاشمي
السلام عليكم
كيفكم يا إخوان, كيفك يا أستاذ

def information(name, age, nationality,phone):
	print ('الإسم الكامل: %s\n العمر: %d \n الجنسية: %s \n الهاتف: %d ' % (name,age,nationality,phone))

information ('الهاشمي محمد',41,'مغربي',0021200000000)
الإسم الكامل: الهاشمي محمد
العمر: 41 
الجنسية: مغربي 
الهاتف: 2315255808 

لا تنسَ ذكر الله

جولة حول التعامل مع الأخطاء


سنتحدث في جولة سريعة عن التعامل مع الأخطاء.
اعلم أَنَّ الخطَأ قد تتسببُ فيه أنتَ شخصيّاً, كَمُبرمج وذلك بسبب خطَأ في كتابة بعْض الأكواد 
وقد يكون من سبب خارج عنك وذلك في أثناء تشغيل البرنامج من قبَل المستخدِم, 
مثال على الخطَأ الناتج منكَ كأن تكتب كلمة غير معروفة لدَى بايثون، وهذا نسمِّيه الخطَأ في الاسم [NameError]
أما الخطَأ عند التشغيل كأن يحاول البرنامج فتح ملف يُفترض أنه موجود داخل مجلد ويندوز لكنْ للأسف هذا الملف غير موجود في المسار بسبب ما قد يكون ثمة خطَأ في تنصيب الويندوز أو تم العبث بالملف بحذفه أو تغيير اسمه.
والآن نأخذ مثالاً حيّاً على الخطَأ الذي لم تكن أنتَ سبب فيه, وإنما بسبب مستخدم البرنامج.
def test1(x,y):
	print (x/y)

#هذه الدالة تقبَل نوعين من المعاملات هما الاثنين رقمِيين, ثم تقوم بقسمة الأول على الثاني وطباعة الناتج هكذا.
test1(4,2)
2
# ممتاز لكنْ تخيّل لو أن السيد المستخدم كتبَ ما لا يخطر في البال.
test1('a',2)
Traceback (most recent call last):
File "", line 1, in 
File "", line 2, in test1
TypeError: unsupported operand type(s) for /: 'str' and 'int'
# جميل تأملوا معي الخطَأ ماذا نلاحظ؟
#TypeError: unsupported operand type(s) for /: 'str' and 'int'
# معامل غير متوقع, في حين كان بايثون ينتظر من المستخدم كتابة رقمين, أخطأ المستخدم فكتبَ نصاً ورقماً, وطبعاً لا يمكن القسمة في هذه الحال, علينا أن نتوقع أي شيء من المستخدم. ولذا نتعامل مع أي خطَأ من المحتمل أن يقع فكيف يمكن ذلك؟
ما اسم الخطَأ؟
TypeError يعني خطَأ في النوع, هذا الخطَأ انسخه وسأقول لك ما ستفعل به.
لنعيد كتابة الدالة من جديد بهذا الشكل.
def test1(x,y):
	try:
# هذه الكلمة معناها حاول أن تفعل ما يأتي, وما يأتي سيكون في السطر التالي لكن لاحِظْ معي أن كلمة try تنتهي بنقطتين رأسيتين وأنت الآن تعرف يا شاطر ما معنى وضع هذه العلامة ها هنا وما يترتب عنها، نعم أول شيء سيكون في السطر الموالي لهذه الإفادة هو الإزاحة بمقدار ثابت تَعارفنا على جعل هذا المقدار الثابت تاب أو أربع مسافات، ثم نكتب المطلوب من بايثون أن يحاول فعله وهو قسمة x على y.
		print (x/y)
# لاحظْنا في السطر الفائت وجود إزاحتين إحداهما عرفناها وهي إزاحة تتعلق بالإفادة try فما معنى الإزاحة الثانية؟
# أخي العزيز في الحقيقة أن الإزاحة الثانية هي التي تخص try وأما الأولى فتخص الدالة لأن عنوان الدالة ينتهي بنقطتين رأسيتين وعليك الالتزام في كل سطْر من الدالة بهذه الإزاحة حتى تنتهي لننظر ما السطر الواجب كتابته ها هنا، علينا العودة إلى إزاحة واحدة لأننا خرجنا من تأثير try وسنبدأ في استخدام إفادة أخرى وهي except بمعنى الاستثناء, نستخدمها في استثناء الأخطاء المتوقعة. نكتب هذه الإفادة ثم مسافة ثم الخطَأ الذي نسخناه من بداية السطر الثاني للخطَأ ثم نقطتين رأسيتين ولا تنسَ أن جملة الاستثناء على نفس مستوى جملة المحاولة يعني تسبقها إزاحة الدالة فقط أما جوابها وهو الذي يقع في السطر الموالي لسطرها ففيه إزاحتين ونكتب ما على بايثون أن يفعل حين وجود الخطأ المتوقع.
	except TypeError:
		print ('لقد أدْخلتَ قيمة خاطئة.')

# الآن لنذهبْ إلى تنفيذ الدالة ونتيجة هذا التنفيذ.
test1('a',4)
لقد أدْخلتَ قيمة خاطئة.
# نعم لقد تخلصنا من الخطأ الفاحش وبدأ يكتب كلام عربي واضح.

اللهم علِمْنا ما ينفعنا وانفعنا بما علَمْتَنا وزِدْنا عِلْما.

الشرح بشيء من التفصيل:
عندنا كلمتين نستخدمهما في تعاملنا مع الأخطاء الأولى كلمة try: وهذه الكلمة معناها حاولْ أن تعمل كذا،
ثلاثة حروف هي t r y وبعدها مباشرة نقطتين رأسيتين.
الكلمة الثانية except أيضاً متبوعة بنقطتين رأسيتين. لكن بين النقطتين وكلمة except عليك أن تكتب اسم الخطأ, واسم الخطَأ سهل جداً يمكن التعرف عليه بأن تقع في الخطأ تجريبياً ثم تأتي لنافذة النتيجة وتقف على السطر الأخير لرسالة الخطأ وتنسخ الكلام المكتوب قبل النقطتين الرأسيتين والموجودتين في رسالة الخطَأ, 
الآن نشرح الكلام الواقع في السطر التالي لهتين الكلمتين:
السطر الذي بعد try نكتب فيه أي كود بشرط أن نسبقه بإزاحة مناسبة تاب. والسطر التالي لكلمة except هو أيضاً مبدوء بإزاحة مناسبة ولْتَكُن تاب. ثم نكتب ما ينبغي أن يفعله بايثون إذا ظهر الخطَأ
الآن سنطبِّق هذا الكلام عمَليّاً في خطوات, أن نعرف نوع الخطأ وننسخه ثم نكتب كلمة try: في سطر لوحدها ثم انتر للانتقال إلى السطر التالي ثم تاب ثم نكتب أي أمر أو أي كود يكون خاطئ وذلك للتجربة فقط ليس إلا 
ثم نذهب إلى السطر التالي بالإنتر نكتب except ثم اسم الخطَأ ثم نقطتين رأسيتين ثم إنتر هكذا ننتقل إلى السطر التالي 
أول شيء نكتب إزاحة مناسبة يعني تاب ثم نكتب التصرف المطلوب من بايثون أن يتصرفه إذا وقع الخطَأ، فأحياناً وقوع الخطَأ غير مؤَكَد قد يقع وقد لا يقع, فإن لم يقع تَنَفَّذَ الأمر المكتوب في السطر الواقع تحت try: وإن وقع الخطَأ, فإنّ الكود الذي سيتم تنفيذه هو الكود المكتوب في السطر التالي لكلمة except.
مثال نفهم به الفكرة كاملة:
print 5 / 0
Traceback (most recent call last):
File "", line 1, in 
ZeroDivisionError: integer division or modulo by zero

لاحظْ معي هذا الخطَأ فمن المعروف أنه لو كانت عندك تُفاحَتانِ وطفلانِ وأردتَ أن تقسم بينهما بالتساوي فإنك ستعطي كل طفل 
تفاحة ولو كانت عندك تفاحة واحدة وطفل واحد ستعطي الطفل التفاحة لوحده دون قسمة فليس من شريك, ولكن لو طلبتُ منك أن تقسم التفاحة على لا أحد لا شيء فكم تقسمها قسماً؟
لا يجوز في الحساب أن تقسم أي رقم على صفر وإلا فإنك حين كتابة ذلك في بايثون ستقع حتماً في الخطأ السابق الآن سننسخ الخطأ, نذهب إلى السطر الأخير من الرسالة وننسخ ما قبل النقطتين الفوقيتين.
انظر إلى هذا الذي سننسخه ZeroDivisionError: 
# الخطأ قسمة على الصفر, نريد علاج المشكلة. فربما تضع أنت دالة للقسمة وتترك لها خانتين الأولى معامل رقمي والثاني أيضاً رقمي فلو وضع المستخدم لبرنامجك أي رقم في المعامل الأول وأي رقم في المعامل الثاني لاستطاع بايثون أن يقسم الأول على الثاني ولكن تخيل أن المستخدم وضع صفر في الخانة الثانية فماذا سيحدث يا صديقي؟ سنعالج الأمر بما يلزم.
def test2(x,y):
	try:
		print (x / y)
	except TypeError:
		print ('لقد أدْخلتَ قيمة خاطئة.')
	except ZeroDivisionError: 
		print (f'لا يمكن قسمة {x} على {y}')

الآن نستخدم الدالة استخداماً جيداً بأن نتخيل أن المستخدم لبرنامجنا يعرف قواعد الرياضيات فلن يفعل ما يسوء.
test2(6,2)
3
test2(120,5)
24
الآن تخيل أن المستخدم لبرنامجك غبي وكتب صفراً فما سيحدث حِينَها هل سيتوقف البرنامج ويتجمد ثم يضطر المستخدم الغبي لإطفاء الجهاز وتشغيله من جديد كي يخرج من المأزق مثلاً?
النتيجة من نافذة نتائج الأكواد:
test2(6,'d')
لقد أدْخلتَ قيمة خاطئة.
test2(6,0)
لا يمكن قسمة 6 على 0
test2('ok',4)
لقد أدْخلتَ قيمة خاطئة.
هكذا طبع لنا جملة التحذير من الخطَأ.
أرجوكَ أمعن التدقيق في التنفيذات الثلاث للدالة test2 فالأولى لم يكن فيها خطَأ وكذا الثانية فتم تنفيذ الكود الواقع بعد كلمة try: وأما في المثال الثالث فقد تحقق الخطَأ المتوقع ونتج عن ذلك أن الكود تحتَ try: لم ينفذ وإنما الذي تم تنفيذه هو الكود الواقع تحت except ZeroDivisionError: أرجو أن تكون الفكرة واضحة.

لا تنسَ ذكر الله

بعض التعليقات:
العصامية المسلمة
def math(a,b):
	try:
		print a*b
	except TypeError:
		print ('عفوا، دالة القسمة لا تقبل هذا النوع من المدخلات ،\nراجع مدخلاتك .')

math('123','321')
عفوا، دالة القسمة لا تقبل هذا النوع من المدخلات ،
راجع مدخلاتك .

لا تنسَ ذكر الله

الهاشمي
السلام عليكم

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

لا  تنسَ ذكر الله

صلاح البرعصي
أخي الهاشمي أنت مبدع في إجاباتك بل حتى في طرح أسئلَتِكَ, واعْلَمْ أخي أني أُولِي قدْراً كبيراً من الاهتمام بما تكتب, وأقرأُ مشاركاتكَ بمتعة بالغة.
إجابة عن سؤالك يمكن ذلك يا أيها الرجل الطيب عن طريق الشرط أيضاً فإذا كان الرقم المعامل الأول أصغر من 10 مثلاً فإن الإجابة بطباعة رسالة تخبر فيها المستخدم بأنه يجب أن يدخل رقماً أكبر من الرقم الذي كتبه, وبالنسبة للحد العلوي للأرقام سنتبع نفس الطريقة وذلك كالتالي:
def test4(x):
	if x< 30:
		print ('من فضلكَ اكتبْ رقماً أكبَرَ من هذا')
	elif x > 100:
		print ('من فضلك اكتبْ رقماً أصغَرَ من هذا')
	else:
		print (f'شكراً لك فقد أَدخلتَ الرقمَ {x} وهو أصغر من المائة وأكبر من الثلاثين.')

test4(22)
من فضلكَ اكتبْ رقماً أكبَرَ من هذا
test4(123)
من فضلك اكتبْ رقماً أصغَرَ من هذا
test4(66)
شكراً لك فقد أَدخلتَ الرقمَ 66 وهو أصغر من المائة وأكبر من الثلاثين.

لا تنسَ ذكر الله

صلاح البرعصي
الهاشمي طبِّقْ هذا من فضلكَ بمزيد من العناية والحرص
def x(name, d):
	if d >100:
		print ('أعدْ المحاولة من فضلكَ')
		return
	print ('شكراً لك يا %s لقد أدخلتَ رقماً صحيحاً' % (name))

x('salah',10)
شكراً لك يا salah لقد أدخلتَ رقماً صحيحاً
x('salah',101)
أعدْ المحاولة من فضلكَ

لا تنسَ ذكر الله

ملحق بالدوال


ختام الكلام عن الدوال:
قلْنا أن الدالة لها عنوان هذا العنوان مسبوق بكلمة def وبعده قوسين هلاليين. هذا هو مَرْبَط الفرس قوسين هلاليَين, 
نضع بينهما الوسيط وهو عبارة عن متغير إلا أنه لا يتم إسناد قيمة إليه في الغالب من نفس الدالة بل في وقت لاحق وبعيداً عن هذه الدالة.
سؤال ماذا نسمي المتغير الواقع بين القوسين؟ 
الاسم يختلف باختلاف حالة الدالة, فإن كنا في حالة الإنشاء والكتابة سمّيناه معامل 
وإن كنا في حالة التنفيذ سمّيناه مُعطَى, 
سؤال سريع ما الفائدة من تغير اسم الوسيط باختلاف وقت الدالة من وقت الإنشاء إلى وقت الاستعمال والتنفيذ؟ 
ركزوا قليلاً, قد تكون الدالة لها 3 معاملات لكنها تقبَل آلاف المعطيات, مثلاً أنتَ تُنشِئ دالة لها ثلاثة معاملات يعني هنا الوسيط ثلاث عناصر ثم يمكن للمستخدم في حال التنفيذ أن يضع خمسة وسائط أو أكثر الوسيط في حال الإنشاء 3 من حيث العدد وفي حال التنفيذ بالعشرات, نأخذ مثالاً عملياً:
def plus (x, y):
	print (x+y)

plus(3,4)
7
ممتاز الآن سأجمع ثلاث أرقام وهذا أراه حق مشروع بالنسبة لي.
plus (3, 4, 5)
Traceback (most recent call last):
File "", line 1, in 
TypeError: plus() takes exactly 2 arguments (3 given)
ركزوا معي في رسالة الخطَأ: plus() takes exactly 2 arguments (3 given) وهذا يعني أن الدالة plus() تأخذ بالضبط 2 من المعطيات وأنت أدخلتَ ثلاثة. طيب أريد زيادة عدد المعطيات هل سأحتاج أن أكتب في إنشاء الدالة 3 وسائط, حسَناً تخيلوا عند الاستخدام أراد المستخدم جمع خمسة أرقام, ستظهر رسالة الخطأ نفسها باستثناء الإشارة إلى أنك أدخلتَ خمس, نريد حلاً. إليكم الحل:
def plus(x,*y):
#كتبنا عنوان الدالة الخاصة بالجمع وسميناها plus بما يتناسب - على فكرة انتهى وقت اللعب وأنتم الآن على مَقْرَبَة من العمل الحقيقي لذا أنصح بأنَّ أي متغير أو دالة ينبَغِي أن يكون لها اسم ذا معنى وله علاقة بالشغل الذي تؤديه- نعود إلى موضوعنا كتبنا اسم للدالة ووضعنا لها معاملين اثنين أولهما x والثاني y وسبَقنا y بنجمة وهذا معناه أن y ليست وسيطاً اعتيادياً بل تجعل مما يأتي من معطيات بعدها في حال التنفيذ جزء منها في شكل قائمة وهذا يعني أن y هي قائمة عناصرها الوسيط y وأي معطيات يكتبها المستخدم بعد y ولا فرق أن تكون بعد y معطى واحد أو العشرات. الآن لنكتب متن الدالة. 
	a = 0
#لقد أنشأنا متغيراً أعطيناه قيمة رقمية صحيحة وهي صفر. سنستفيد منه استفادة عظيمة.
	for i in y:
#ها نحن قد استخدمنا الحلقة for لإتمام عملية الجمع بين عناصر القائمة y والتي حتى الآن لا ندري ما هي ولا كم عددها ولكنّ الأمر راجع للمستخدم حين تنفيذ الدالة.
		a = a+i
# أعطينا قيمة جديدة للمتغير a وهو متغير رقمي والقيمة الجديدة هي مجموع a مع i الذي لا نعرف عنه شيئاً إلا أنه سيكون رقماً. ستدور الحلقة بعدد عناصر y والتي سيحدد المستخدم عددها وما هي بالضبط, أول ما يعمله بايثون في الدورة الأولى يجمع صفر مع الرقم الموجود في y عند التنفيذ. ثم تأتي الدورة الثانية التي لن تكون قيمة a فيها صفلراً ثم يتم جمع قيمة a مع المعطى الثالث الذي سيضعه المستخدم الدورة الثالثة سيتم جمع المعطى الرابع مع قيمة a التي تتغير في كل دورة لتكون ناتج عمليات الجمع. أخيراً سنعمل بعد الخروج من الحلقة على جمع x مع a وهكذا سينتهي الأمر.
	print (x+a)

سننفِّذ الدالة, لاحظوا أن عدد الوسائط ليس 2 إذاً الدالة تريد معاملين لكنها تقبل عدد مفتوح من المعطيات.
plus(1,2,3,4,5,6,7,8,9,10)
55
نلاحظ عدم ظهور رسالة الخطَأ بل كان الأمر أروع وأجمل من استخدام معطيين. الآن ما رأيكم في أن يكون عدد المعاملات 2 ولو أدخلتَ واحداً فلا مشكلة. سنرى هذا بالدليل القاطع.
def hi(name , sons = 0):
	print ('مرحَبَاً يا %s عدد أولادك هو %d' % (name, sons))

سنكتب معطى واحد ونترك الثاني.
hi('sameer')
مرحَبَاً يا sameer عدد أولادك هو 0
طيب نكتب قيمة للمعطى الثاني.
hi ('salah',1)
مرحَبَاً يا salah عدد أولادك هو 1
هل يمكن أن نفعل هذا أيضاً مع السلاسل النصية.
def hi (name = ' بالجميع'):
	print ('hello' + name)

الآن نتوجه للتنفيذ.
hi('salah')
hellosalah
في المثال التالي لن أكتب أي قيمة. يعني لن يكون هناك معطيات من قِبَلي.
hi()
hello بالجميع
أخيراً يحْسُن بنا أن نشير إلى استخدام نجمتين قبل اسم الوسيط وهذا استخدام للمعطيات علىشكل قاموس لكن القيمة لا تكون إلا boolean كائانات منطقية. حالياً لا أراكم تحتاجونها, ولو درستم كل شيء في الدورة الأولى فما قيمة الدورة الثانية, يكفي أن تعلموا أن *args هي معامل يجعل من نفسه وما يأتي من معطيات بعده حين الإدخال والتنفيذ عبارة عن قائمة هم عناصرها واعلم انّ **kwargs هي نفس القائمة لكنها قاموس, يعني تجعل من المعطى الممرر من خلال هذا المعامل وما بعده عبارة عن مفاتيح وقِيَم لهذا القاموس.
# مثال سريع حتى لا تقولوا أننا لم ندرس هذا.
def test (*args,**kwargs):
	print (kwargs)

test(a=True,b=False,o=False)
{'a': True, 'b': False, 'o': False}
قد تسأل ما الفائدة من هذا إنها مجرد عملية إسناد أقول لك هذا ظاهرها وإنما الأمر مفيد لو استخدمنا هذه الدالة داخل دوال أخرى .
وفي الختام أسألكم هل تذكرون return؟
لقد علمنا في السابق أننا يسعُنا الانتفاع من الإفادة return لمنع الدالة من الاستمرار متى كان الشرط صحيحاً. 
لكنْ لها استخدام آخر قوي جداً يمكن أن يكون مع الشرط أو غيره. 
نحن نعلم كيفية جعل متغير يحمل قيمة رقمية أو نصية لكن هل نعرف طريقة جعل دالة تُرْجِع قيمة نصية أو رقمية?
الإجابة مع return يمكنك ذلك تأمل مثالاً السابق الخاص بالجمع في هذه المرة لن أطبع النتيجة بل سأجعلها قيمة تُعيدها الدالة فتظهَرُ الدالة كأنها رقمية قيمتها الناتج الذي سيظهر لو طبعنا.
def plus(x,y):
	return x+y

لِنُنَفِّذَ الدالة.
plus(4,2)
6
على فكرة هذا ما أخرجه لك بايثون تطوعاً منه ولكن الحقيقة لم يتم طباعة الدالة.
تأمل هذا .
r = 5 +plus(4,2)
print (r)
11
الآن تمَعّنُوا في هذا المثال الصعب وهو طباعة تاريخ اليوم. أول شيء نستدعي مكتبة datetime 
import datetime
سوف ننشئ الدالة التي ستستخدم هذه المكتبة.
def dayDate():
	d = datetime.datetime.now().date()
	return d

إلى الاستخدام.
print ('تاريخ اليوم هو' , d)
تاريخ اليوم هوTraceback (most recent call last):
File "", line 1, in 
NameError: name 'd' is not defined
ظهرتْ معنا رسالة خطَأ وهذا خطَأ متعمد مني حتى تلاحظوا أننا لم نستفد من المتغير d لأنه متغير محلّي لا يعرفه أحد إلا دالة dayDate , المتغير يكون مداه ضمن نطاق الدالة فلا يُستخدم خارجها وإن شئتَ أن يتم استخدامه في خارج الدالة فاستخدم الإفادة global سنتحدث عنها في الدرس القادم إن شاء الله, المُهِم أن تعرفوا أن المتغير الذي يتم إسناد قيمة إليه ضمن متن دالة ما لن يتعرَّفَ عليه أحد إلا الدالة نفْسَها ما لم تخبر بايثون بأن هذا المتغير عام.
print (' تاريخ اليوم هو ', dayDate ())
 تاريخ اليوم هو  2021-04-10

# جميل لكن ما نوع هذه الدالة هل هي سلسلة نصية أم هي رقم أم أنها نوع مختلف تماماً.
print (type(dayDate))


# تَبَيّنَ لنا أن قيمة الدالة من حيث أنواع البيانات هي function أي دالة، لكنْ ما القيمة التي تُعيدها دالَّتُنا هذه؟
l = dayDate()
print (type(l))


هل لاحظتم الآن نرى وجود متغير قيمته تاريخ ووقت وليس أي شيء آخر أَمَا عند طباعة نوع الدالة مباشرة فإنه أخبرنا أنها دالة function.
يجدُرُ بك أن تنتبه إلى أن المتغير l لمّا حملَ قيمة الدالة أصبحتْ قيمتة datetime وهي نوع آخر مستقل من أنواع البيانات, الدالة في حد ذاتها من نوع function لكنّ المتغير الذي يُسند إليها سيحمل قيمة ما بعد return لكن بشكل عام نقول أن الدالة التي كتبناها dayDate نوعها function وتعيد datetime.
لقد أصبحتَ تعرف الكثير من أنواع البيانات فإلى جانب الأرقام الصحيحة والعائمة والسلاسل النصية والقواميس والكائانات المنطقية والصفوف والعدم تضيف اليوم إلى معلوماتك function و datetime.
الواجب أريد منك ثلاث دوال واحدة تعيد قيمة نصية والأخرى تعيد قيمة عددية عشرية والثالثة تعيد قائمة فهل يمكنك هذا؟
مع استخدامها ضمن أكواد أخرى .

أَعانكُم الله ونفعَ بكم.

المشاركات:
الهاشمي
def hello(name = 'بالحياة'):
	print ('مرحبا' + name)

hello('صلاح العزيز')
مرحباصلاح العزيز
hello()
مرحبابالحياة

def account(name,account = 0):
	print (f'السيد: {name} حسابك هو: {account} ريال.')

account('كريم', 1000000)
السيد: كريم حسابك هو: 1000000 ريال.
account('عامر')
السيد: عامر حسابك هو: 0 ريال.
def test(*args,**kwargs):
	print (kwargs)

test(a=True,b=False,c=True,d=False)
{'a': True, 'c': True, 'b': False, 'd': False}

import datetime
def dayDate():
	d=datetime.datetime.now().date()
	return d

print ('تاريخ اليوم هو ', dayDate())
تاريخ اليوم هو 2014-01-04

بالتوفيق للجميع.

لا تنسَ ذكر الله.

القواميس


القواميس: هي نوع آخر من أنواع البيانات, وصورته قوسين مزخرفين وهما نفس مفاتيح القوسين المربعين لكن عند الضغط عليها لا تنسَ أن تضغط على الشفت أقول القوس المربع وليس القوس الهلالي فانتبه, قوس مزخرف للفتح وآخر للإغلاق, بينهما تكتب ما شئتَ من العناصر, ولكن عناصر القاموس ليست مثل عناصر القوائم, سنفصِّل الأمر ولكن لِنُنشئ أولاً قاموس فارغ قبل كل شيء ونَسنِده إلى متغير ولْيَكُن اسمه x.
x = {}
جميل, هل ثمة صعوبة في هذا الأمر؟ لا أعتقد. الآن نريد أن نُزَوِّدَ هذا القاموس بالبيانات, وللملاحظة فهو يقبل أي نوع من أنواع البيانات من سلاسل رقمية ونصية وقوائم. هذا القاموس الذي أنشأناه سنكتب فيه شيئين فقط. وعلى فكرة أقل القواميس أن يكون محتوياً على شيئين بعكس القوائم التي يمكن أن تحوي شيئاً واحداً فقط. الشيء الأول نسمّيه مفتاح والشيء الثاني نسمّيه قيمة.
في المثال التالي تخيّل نفسكَ تُعِدّ منظومة فيها أسماء طلاب ودرجاتهم. اكتبْ اسم الطالب أولاً ثم اكتبْ بعد الاسم مباشرة علامة نقطتين رأسيتين وهذه النقطتين لا تستوجب الإزاحة لأنها ليست في آخر السطر بعكس النقطتين التين نكتبهما في آخر عنوان الدالة أو جملة الشرط أو جملة while و for و try وأخواتها, ثم درجة هذا الطالب. 
هكذا فَرَغْنَا من إعداد أول عنصر من عناصر القاموس، وهو المفتاح كَطَرَفٍ أول من طَرَفَي العنصر القاموسي والمفتاح عندنا في مثالنا يمثله اسم الطالب, وقيمة المفتاح هي الدرجات التي تَحَصَّلَ عليهاالطالب.
نفهم من ما مضَى أن العنصر في القاموس يتألف من طرفين هما المفتاح key, والقيمة value ونفصل بينهما بنقطتين رأسيتين كما أسلفْنا.
فالعنصر في القواميس هو عبارة عن مفتاح وقيمة ولِكَي نفصِلَ بين عناصر القاموس في حالة تعددها نضع علامة فاصلة كالقوائم لا فرق في ذلك.
وزيادةً في الشرح لو أردنا إضافة مفتاح وقيمة جديدين فما علينا إلا أن نضع فاصلة ثم نكتب المفتاح والقيمة الجديدتين ومن الضروري الفصل بين كل مفتاح وقيمته بنقطتين فوقيتين وبين كل عنصر وآخر بالفاصلة, يعني لو كان يحوي القاموس مفتاحين سنكتب مفتاح ثم نقطتين ثم قيمة المفتاح الأول ثم فاصلة ثم المفتاح الثاني ثم نقطتين ثم قيمة المفتاح الثاني على النحو التالي:
x = {'ali': 6, 'adam': 9}
# هكذا أصبح لدينا قاموس يحوي مفتاحين المفتاح الأول سلسلة نصية ali والمفتاح الثاني أيضاً سلسلة نصيةadam , ولكل منهما قيمة وهي الدرجات التي تَحَصَّلَا عليها الآن نريد أن ننادي المفاتيح فقط. وسنطْبَعها حين المنادةِ.
print (x.keys())
dict_keys(['ali', 'adam'])
# keys جمع كلمة key ومعناها مفتاح، الآن نطبع القِيَم:
print (x.values())
dict_values([6, 9])
الأمر طبعاً واضح لا يريد شرحاً, تم طباعة القِيَم وهي درجات علي وآدم.
الآن أريد إضافة اسم طالب آخر ودرجاته,الطالب هو عُمَر ودرجاته 7.
x['omar']=8
وَلِنَتأَكَّدَ من نجاح إضافة المفتاح الجديدنَطْبَعُه.
print (x)
{'ali': 6, 'adam': 9, 'omar': 8}
سوف نحاول الآن تعديل قيمة المفتاح آدم .
x['adam']=2
نتأكد من أن قيمة آدم قد تغيرتْ.
print (x['adam'])
2
رائع للغاية، الآن أريد أن أحْذِفَ ali هو وقيمته.

del x['ali']
#نتأكد من الحذف بطباعة المتغير x.
print (x)
{'adam': 2, 'omar': 8}
أين ذهبَ السيد علي ودرجته؟
تجدر الإشارة أن الفاصلة تفصل بين عناصر القاموس وهذا يعني أن كل مفتاح وقيمته هما عنصر واحد وليسَ عنصرين, ويمكن طباعة المفتاح وقيمته معاً هكذا:
print (x.items())
dict_items([('adam', 2), ('omar', 8)])
طيب نريد طباعة العنصر الأول بكامله يعني بالمفتاح والقيمة معاً.
أولا: نُسند عناصر القاموس إلى قائمة هكذا:
y=list(x.items())
ثم نقوم باستدعاء العنصر الذي نريده
print (y[0])
('adam', 2)
نَطْبَعُ الآن العنصر الثاني.
print (y[1])
('omar', 8)

والآن سؤال: ما هي قدرَتُكَ لاسْتيعابِ القواميس مع الحلقات ركز معي؟حلقة for هل تذكرها؟ أتَذْكُر حين وضعنا حرف i قبل كلمة in وهي تدل على كل عنصر من عناصر القائمة أو السلسلة النصية.
الآن العنصر عندنا في القواميس من طَرَفَينِ أو شِقَّينِ سمِّهِ ما شئتَ مفتاح ونرمز إليه بحرف k وذلك ليس على سبيل الوجوب ولكن للدلالة على المفتاح key, ثم فاصلة ثم حرف v للدلالة على القيمة وليس واجب عليك أن تختار حرف v لهذا المتغير يمكنك اختيار أي حرف ولكن جرت العادة باختيار v لأنه أول حرف في كلمة value ومعناها القيمة.
لا أحتاج لكتابة متغير جديد وأسند إليه قيمة قاموسية سأستخدم القاموس x السابق.

for k, v in x.items():
	print (f'اسم الطالب {k} ودرجته هي {v}')

اسم الطالب adam ودرجته هي 2
اسم الطالب omar ودرجته هي 8
 k,v يدلان على نوع آخر من أنواع البيانات نسمّيه الصفوف أو المرتبات, وهو مشابه للقوائم ويختلف عنها في شيئين هما:
الأول اختلافهما في أنواع الأقواس فالقوائم أقواسها مربعة والصفوف أقواسها هلالية.
والثاني: أن القوائم كنوع من أنواع البيانات هي قابلة للتغيُّر والتحوُّل, بعكس الصفوف والسلاسل النصية التي تتصف بِالْجُمود, لأنك لو أردتَ إحداث تغيير حقيقي في السلاسل النصية فإنك ستضطر لإنشاء عملية إسناد جديدة هكذا:
l = 'ali, omar'
تمام الآن عندنا متغير عبارة عن سلسلة نصية. نريد إضافة اسم آخر إلى جانب الاسمين السابقين. لن نستطيع فعل هذا إلا بالإسناد من جديد إلى l أو أي متغير جديد فلو أنك تركتَ هذا فلن تستطيع إضافة أي اسم جديد لنُجرب إضافة اسم للسلسلة النصية بدون الاستعانة بعملية إسناد جديدة.

l+'muhammed'
'ali, omarmuhammed'
# طيّب هل بالفعل تم إضافة الاسم الجديد إلى المتغير l, كيف سنعرف هذا؟ أحسنتم بطباعة l.
print( l)
ali, omar
حسَناً أين محمد لا أثر له! ما الحل لهذه المشكلة؟ الحل عملية إسناد جديدة نستخدم فيها l يعني نفس المتغير الأول. 
l = l+'muhammed'
لِنَطْبَع المتغير l بغرض التأكد من الزيادة.
print (l)
ali, omarmuhammed
وهكذا فإن السلاسل النصية جامدة نحتاج إلى إنشاء متغيرات جديدة وبيانات جديدة حتى نضيف أو نعدّل أو نحذف، 
ولكي نعالج هذه المشكلة يتم الإسناد إلى نفس المتغير الأصلي حتى نضمن حدوث التغيير في نفس المتغير.
# الصفوف أيضاً جامدة تحتاج إلى أن تسند إلى نفس المتغير للهروب من مشكلتها, لكنْ القوائم والقواميس لا تحتاج إلى عملية إسناد جديدة ولكَ في التجربة خير دليل.
a = ['ali', 'muneer', ' eisa ']
نحاول الآن إضافة عنصر جديد للقائمة a.
a.append('khaled')
لقد أضفنا خالد دون الحاجة لأن نخوض في عملية إسناد جديدة, لكنْ هل تمت العملية حقاً؟
print (a)
['ali', 'muneer', ' eisa ', 'khaled']

*سؤال أريد قاموس يحوي خمسة عناصر وبعد تجهيز هذا القاموس وإسناده إلى متغير أطلبُ منكَ أن تطبع جزء من هذا القاموس على النحو التالي:
* أريد طباعة كل المفاتيح في قائمة واحدة.
* طباعة كل القِيم في قائمة واحدة.
* طباعة كل عناصر القائمة بما تحويه من مفاتيح وقِيَم .
* طباعة العناصر من العنصر الثاني للقاموس حتى العنصر الخامس يعني إلى غاية العنصر الخامس ومعنى هذا أن تتوقف في الطباعة إلى الرابع ولا تطْبَعْ الخامس ولكن تقف عنده.
* حذف العنصر الثالث ثم طباعة كافة عناصر القاموس للتأكد من تنفيذ عملية الحذف دون استخدام عملية إسناد جديدة عند حذفِ العنصر.
* نريد متغير قيمته مرتبة يعني صفَّاً ثم اطْبَعْ آخر عنصر فيه.

لا تنسَ ذكر الله

الإجابة:
أم عبد الرحمن 
السلام عليكم ورحمة الله وبركاته
الأستاذ القدير صلاح البرعسي لا أجد ما أشكرك به إلا أن أقول جزاك الله خيراً

x = {'dell': 2800, 'samsong': 2400, 'toshiba': 2500, 'apple': 2600, 'lenovo': 1500}
print (x.keys())
dict_keys(['dell', 'samsong', 'toshiba', 'apple', 'lenovo'])
print (x.values())
dict_values([2800, 2400, 2500, 2600, 1500])
print (x.items())
dict_items([('dell', 2800), ('samsong', 2400), ('toshiba', 2500), ('apple', 2600), ('lenovo', 1500)])
طباعة العناصر من الثاني إلى الخامس:
y=list(x.items())
print (y[1:4])
[('samsong', 2400), ('toshiba', 2500), ('apple', 2600)]
حذف العنصر الثالث:
del x['toshiba']
print (x)
{'dell': 2800, 'samsong': 2400, 'apple': 2600, 'lenovo': 1500}

لا تَنسَ ذكر الله 

الدرس العاشر البرمجة الكائنية (الكلاس والوراثة)


الكلاس: هو كائن برمجي له صفات ووظائف, وهذه استعارة من علم الأحياء القائم على دراسة الكائنات ووظائفها وصفاتها, تشترك كائنات البرمجة الشيئية أو الكائنية مع علم الأحياء في مفهوم آخر وهو الوراثة، 
أن يرث الابن بعض صفات أبويه, وهذا معلوم في البيولوجيا فَيرث بعض الأبناء من آبائهم صفات ويرث البعض الآخر نفس الصفات أو بعضها مضافة إليها صفات أخرى لم يرثها القسم الأول من الأبناء.
class لفظة انجليزية يقابلها في العربية لفظة فئة, فما هو الكلاس بالتحديد؟
نعم هو مجموعة من الدوال نسمّيها وظائف ومجموعة من المتغيرات نسميها صفات، وأفضل تقريب للذهن في هذا الباب هو المثال العملي:
class test1:
	pass

هكذا كتبتَ أول كلاس لك في حياتكَ, وهذا الكلاس فارغ لا توجد به أي أكواد إلا كود واحد هو pass ومعناه لا تفعل شيئاً, يمكن كتابته جواباً لشرط أو ضمن حلقة.

الآن سُننْشئ كلاس به مجموعة من الوظائف.
class Math :
	def plus (self, x, y):
		print (x+y)
	def sub(self, x , y):
		print (x-y)

هكذا انتهينا من كتابة الكلاس المُسَمَّى math ومعنى اسم الكلاس الرياضيات، طبعاً الآن كل مسمياتنا سيكون لها معنى.
بعد كتابة عنوان الكلاس كتبنا وظيفتين وهما نفس الدوال لكن إختلاف التسمية لها ما يبررها, فهذه الوظائف لا يمكن بحال أن تعمل خارج الكلاس في كلاسات أخرى إلا بطريقة الوراثة، نجد أننا كتبنا ثلاثة وسائط لكل وظيفة أولها self بمعنى نفس الكلاس يعني علامة على أن هذه الوظيفة خاصة بهذا الكلاس. 
يمكنك أن تكتب self أو this فأنت بالخيار، ثم كتبنا معاملين اثنين هما x و y سننفذ الكلاس الآن.
myMath = Math()
myMath.plus(3,2)
5
هكذا نفذنا الكلاس ودالة من دواله وهي الجمع، لاحظُوا أننا وضعنا بين المتغير الذي يحمل قيمة الكلاس وبين وظيفة الكلاس نقطة, ثم كتبنا الوظيفة وأعطيناها معطيين فقط فلا حاجة إلى أن أوضح بأن self هي وسيط للربط بين الكلاس والوظيفة.
myMath.sub(10,10)
0
نعم إجابة منطقية للغاية, فنحن طرحنا المعطى الثاني من المعطى الأول فكانت النتيجة صفر.
ما تعلمناه هو معرفة بسيطة لشكل الكلاس ثم وظائفه وقلنا في السابق ما الكلاس إلا وظائف وصفات, وها قد عرفتم الوظائف, فما الصفات؟
الصفات هي عبارة عن متغيرات لكن هذه المتغيرات نسبقها بكلمة self ثم نقط, ثم يساوي وتسند إليها ما تشاء من قِيَم، لماذا يتم تعقيد الأمر بهذا الشكل وما الحاجة لكلمة self والنقطة؟ 
الإجابة كي يفهم بايثون أن هذا المتغير لن يكون محلّي بل أنه سيعمل في أي جزء من أجزاء الكلاس ولو كان ألف سطر
قبل أن نشتغل على الصِفات ندرس وظيفة من وظائف الكلاسات وهي __init__ ومعناها التهيئة, ولكن الترجمة الصحيحة هنا ستكون البِناء. 
هذه الوظيفة ستعمل فوراً بمجرد تنفيذ الكلاس ولن تنتظر أي أمر آخر فعند التنفيذ لن تحتاج لكتابتها, بل يكفي كتابة اسم الكلاس. 
وما تكتب لوظيفة البِناء من معاملات ستكون خاصة بالكلاس يعني لو أنك أعطيته معاملين أقصد البِناء فإنك في التنفيذ ستكتب اسم الكلاس ثم قوسين وبينهما معطيات المعاملات التي كتبتَها في وظيفة البِناء خذ هذا المثال للتوضيح.
class Hi :
	def __init__(self, name):
		self.myName = name
		print (self.myName)

ننفذ الكلاس الآن, لاحظوا أننا لن نكتب وظيفة البِناء مع أنها ستعمل بمجرد كتابة الكلاس ولاحظوا أن معطيات الكلاس سنمررها عبر معاملات الوظيفة __init__.
Hi('salah')
salah

طبعاً السطر الذي ظهر بعد النتيجة سطر تعريفي بالكلاس لا حاجة لظهوره يمكن تجنب ذلك بأن تمرر المعاملات إلى معطيات لوظائف غير __init__ على النحو التالي:
class Hi :
	def __init__(self, name,age):
		self.n = name
		self.g = age
	def printHi(self):
		print ('hi %s, your age is %d' % (self.n, self.g))


hi = Hi('salah', 34)
hi.printHi()
hi salah, your age is 34
وهكذا عرفنا كيف نكتب كلاس ونعطيه صفات ونعطيه وظائف, في المشاركة القادمة ندرس الوراثة, كيف يرث كلاس ابن صفات أو وظائف من كلاس أب.

لا تنسَ ذكر الله

المشاركات:
الهاشمي
السلام عليكم
كيف الحال أخي صلاح
وكيفكم يا أخواني الكرام؟؟
class Hello:
	def __init__(self, name, age):
		self.n = name
		self.g = age
	def printHello(self):
		print ('مرحبًا %s, مشكور على %d دروس, إنها أفادتنا كثيرا' % (self.n, self.g))

marhaba = Hello(u'أخي صلاح', 9)
marhaba.printHello()
مرحبًا أخي صلاح, مشكور على 9 دروس, إنها أفادتنا كثيرا

لا تنسَ ذكر الله

أم عبد الرحمن
class Dear:
	def upper(self, name):
		name = name.upper()
		print (name)
	def lower(self, name):
		name = name.lower()
		print (name)

myDear = Dear()
myDear.upper('baraa')
BARAA
myDear.lower('EMAN')
eman

الكلاس الثاني:
class advice:
	def __init__(self, message):
		self.myMessage = message
		print (self.myMessage)

advice('Be confident of yourself')
Be confident of yourself

advice('خير الأعمال أَدومَها وإن قَل')
خير الأعمال أَدومَها وإن قَل

class Capitals:
	def __init__(self, country, capital):
		self.c = country
		self.p = capital
	def printCapitals(self):
		print (' الدولة: %s العاصمة: %s ' % (self.c, self.p))

myCapitals = Capitals(' فلسطين ', ' القدس')
myCapitals.printCapitals()
الدولة: فلسطين العاصمة: القدس 
cap = Capitals(u' السودان', u' الخرطوم')
cap.printCapitals()
الدولة: السودان العاصمة: الخرطوم 

سبحان الله العظيم.

الوراثة


إخوتي الكرام سندرس اليوم الوراثة في بايثون, وقد قلنا سابقاً إنها لفظة مستعارة من علم الأحياء, فكيف تتم هذه العملية?
نفترض أن عندك كلاس مسبق يَعُجُّ بالصفات الرائعات والوظائف القَيّمات, وتريد إنشاء كلاس جديد وستستعمل في الكلاس الجديد الكثير من صفات ووظائف الكلاس الأول, ولو لم تكن الوراثة موجودة لاضطَرَرْتَ أن تكتُبَ كل هذه الوظائف والصفات من جديد, مع الوراثة والبرمجة الكائنية لن تحتاج إلى هذا, فما عليك إلا أن تكتب عنوان الكلاس الجديد ثم قوسين هلاليين تكتُبُ بينهما اسم الكلاس الموروث منه أي الكلاس الأب فتَكُونُ العملية وكالتالي:
class son (father):
بهذا السطر فحسب استطعتَ أن تُوَرِّثَ كل صفات ووظائف الكلاس الأب إلى الكلاس الابن بمنتهى اليُسر والسهولة وبدون فضايح ولا قضايا ولا حاجة للملاسنات والمشدات الكلامية والأحقاد والمرافعات وتعيين محامي وأحكام محاكم ولا تبليغات ولا مشاكل بين الوَرَثَة.
طبعاً كلمة son و father افتراضيتان كتَبْتُهما حتى تمِيز الوارث من المورُوث منه,وإلا فيمكنكَ إعطاء أي اسم لكل منهما ما دمتَ لم تخالف شروط تسمية المتغيرات, والوارث في بايثون الكلاس الجديد والموروث منه هو الكلاس الأب أي القديم, تضعه بين قوسين هلاليين من بعد الكلاس الجديد حتى تتم الوراثة 
طيب كيف سأستفيد من وظائف وصفات الكلاس الأب؟
نعم عند تنفيذ أي كلاس أقول عند التنفيذ وليس الإنشاء تعودْتَ على كتابة اسم الكلاس ثم نقطة ثم الصفة أو الوظيفة التي بداخله, هذه المرة عند تنفيذ الكلاس الابن يمكنك وضع نقطة بعد الكلاس الابن وكتابة أي وظيفة أو صفة من وظائف وصفات الكلاس الابن كما يمكنك كتابة الكلاس الابن ثم نقطة ثم أي صفة أو وظيفة من وظائف الكلاس الأب وكأنه هو.
القادم:
سنُنشئ كلاسين أب وابن, الكلاس الأول سيختص بالجمع والطرح والكلاس الثاني وهو الابن سيختص بالجمع والطرح والضرب والقسمة ولكننا لن نحتاج في الكلاس الابن أن نكتبَ أربعوظائف بل سنكتب وظيفة القسمة والضرب فقط والوراثة ستكفل لنا انضمام وظيفتين جديدتين إلى الضرب والقسمة وهما الجمع والطرح من خلال الوراثة يمكن استجلابهما.
الآن إلى إنشاء الكلاس الأب.

class father:
	def plus(self,x,y):
		print (x+ y)
	def sub (self,x,y):
		print (x - y)

جميل جِداً, لقد أنشأنا كلاساً سمّيناه father ولكم أن تُسمّوا ما تشاؤون ما التزمتم بالشروط الخاصة بتسمية الدوال والمتغيرات, ثم كتبتم له وظيفتين إحداهما تحوّل المدخلات إلى float وتجمعهما معاً, والثانية أيضاً تحول المدخلات لكن تطرحهما من بعض. 
هل ثمة جديد في ما مضَى؟
الآن إلى التنفيذِ يا أصدقاء.
سنُنشِئ متغير نسمِيه اسم يذكُرنا بالقيمة هذا المتغير سنسند إليه الكلاس الذي أنشأناه وما دام الكلاس اسمه father فما رأيكم في تسمية المتغير حرف f حتى لا نحتاج إلى كتابة father كلما استخدمنا الكلاس, وهذا هو الغرض الحقيقي من إسنادنا هذا, وإلا فإنه لم يأتِنَا بجديد.
f = father()
الآن نستخدم وظائف هذا الكلاس.
f.plus(3,4)
7
f.sub(6,2)
4

الآن نعمل على إنشاء الكلاس الابن وتأملوا كيف تتم عملية الوراثة, ركّزوا على عنوان الكلاس والقوسين الهلاليين بعده.
class son(father):
	def mult(self,x,y):
		print (x* y)
	def div (self,x,y):
		print (x/ y)

نلاحظ أننا لم نكتبْ إلا وظيفتين فقط للكلاس الجديد وهما الضرب والقسمة فحسب. لاحِظوا بكل دقة أننا لم نتعرض لا للجمع ولا للطرح فهل يمكن الأتيان بهما من خلال هذا الكلاس وليس الكلاس الأب؟
الآن إلى التنفيذِ يا أبطال.
s = son()
أسندنا الكلاس إلى حرف s وهذا الاسم اخترتُه أنا وليس إجباري, أخذتُ الحرف الأول من اسم الكلاس كي أتذكّرَه. هذا أفضل من أن أُسَمّيه x أو y أو my أو أي أسماء أخرى غير معبِّرة, وفائدة هذا أنه عندما يكون السكربت الذي تكتُبه ضخم يتألف من ألف سطر فإنك من المؤكد أنْ ستقع في الْلَبس والخلْبَطة ما لم تسمِ أسماء مُعَبِّرة. 
s.mult(2,5)
10
s.div(10,2)
5
s.plus(3,3)
هل سيظهر معنا الناتج؟
لا أعتقد لأنه لا توجد وظيفة في الكلاس الابن بهذا الاسم plus. مِنَ المؤكد أن رسالة الخطَأ التي ستظهر معنا هي name error نلاحظ الناتج معاً.
6
غريبة كيف لم تظهر معنا رسالة الخطَأ الخاصة بعدم وجود حقيقي لاسم الدالة؟
نعم لأن الوراثة كفلتْ للكلاس الابن استخدام كل وظائف وصفات الكلاس الأب بدون استثناء ما لم تكن مسبوقة بخط سفْلِي _.
s.sub(4,1)
3
لكنْ ما قصة الخط السفلي؟
الموضوع بسيط تخيل أنك أنشأتَ كلاساً رائعاً جميلاً أُعْجِبَ به كل المبرمجين وتريد أن تحمي بعض الصفات والوظائف في هذا الكلاس فتمنع أن تتم وراثتها فكيف تفعل هذا؟
ما عليك إلا أن تسبقَ الصفة أو اسم الوظيفة بالرمز __ مرتين طبعاً. لن يتمكن أي كلاس من أن يرث أي صفة أو وظيفة مسبوقة بهذا الرمز, ونُسمّي هذا النوع من الصفات بالصفات الخاصة كما نسمي هذا الصنف من الوظائف بالوظائف الخاصة.
هذا النوع من الصفات وهذا النوع من الوظائف لا يعمل إلا في نطاق الكلاس وأقصد بهذا أنه يمكن الاستفادة من هذه الوظائف والسمات الخاصة بكتابة أكواد داخل الكلاس نفسه مستخدمة لهذه الصفات والوظائف, لِذا عليك أن تضع دائماً في اعتبارِكَ أنه لا يمكنك عند تنفيذ الكلاس الأصلي أن تستخدم الوظائف والصفات الخاصة مطلقاً فما بالك بتورِيثها.
سأنشِئ كلاساً أسمّيه old وأجعلُ له صفاتٍ هذه الصفات تحمِل قيَم نصّيّة تمثل بعضاً من أصدقائي المقرَّبين,
وسأُضَمّن الكلاس وظيفة تختص بطباعة أسمائهم نبدأ في الإنشاء أولاً.
أرجوكم أمعِنوا النظرَ بدقة في الصفة المسبوقة بِخَطَّينِ سُفْلِيَّينِ, 
هذه الصفة خاصة لا يمكن أن نستفيد منها إلا من داخل الكلاس أثناء الإنشاء فقط, ولا يمكن الاستفادة من هذه الصفة حتى لو نفّذْنا الكلاس وليس مجرد تورِيثِه,
بعكس بقية الصفات يمكن تنفيذها حين تنفيذ الكلاس كما يمكن توريثُها بمنتهى السهولة واليسر.
أكرر الصفات الخاصة هي تلك المتغيرات المسبوقة بِخطَّينِ سُفْلِيَّينِ.
class old :
	def __init__(self):
		self.friend1 = u'محمد الهاشمي'
		self.friend2 = u'نضال شوَيَّة'
		self.__friend3 = u'أبو عبيدة'
	def friends(self):
		print (' أصدقائي الأعزاء هم %s و %s و %s' % (self.friend1, self.friend2, self.__friend3))

انتهينا من إنشاء الكلاس والآن نكتب متغيراً نُسنِد إليه الكلاس, لتسهيل الكتابة فلا تضطر لكتابة الكلاس باسمه الطويل كلما أردتَ ااستخدامه.
o = old()
الآن ننفِّذ الوظيفةَ المُندَرِجةَ تحت الكلاس old والتي تختص بطباعة الصفات الموجودة في الوظيفةِ __init__
o.friends()
أصدقائي الأعزاء هم محمد الهاشمي و نضال شوَيَّة و أبو عبيدة
نطبع الآن الصفة الأولى لوحدِها.
print o.friend1
محمد الهاشمي
نطبع الآن الصفة الثانيةَ.
print o.friend2
نضال شوَيَّة
نطبع الآن الصفة الخاصة وهي الثالثة المُسمّاة __friend3 والتي تحمل قيمة نصية هي اسم صديقي أبي عبيدة الجزائري.
print o.__friend3
Traceback (most recent call last):
File "", line 1, in 
AttributeError: old instance has no attribute '__friend3'
نعم لم أتمكن من طباعة الصفة الخاصة فهي لا تعمل إلا من داخل الكلاس فقط.
نُنشِئ كلاساً ثانياً يرِثُ صفات الكلاس الأول ووظائفه.
class new(old):
	def hi (self, myFriend):
		print (' مرحَبَاً بصدِيقي العزيز %s ' % (myFriend))

الآن ننشِئ متغير نُسَمّيه n ونُسْنِد إليه الكلاس الجديد, أي الكلاس الابْنن.
n = new()
نطبع صفات الكلاس الجديد والتي ورِثَها من القديم.
print n.friend1
محمد الهاشمي
print n.friend2
نضال شوَيَّة
print n.friend3
Traceback (most recent call last):
File "", line 1, in 
AttributeError: new instance has no attribute 'friend3'
ما الذي حدثَ بالضبط؟
نعم نجحنا في طباعة الصفة الأولى والثانية ولم ننجح في طباعة الصفة الخاصة وهي الثالثة, لسبب بسيط وهي أنها خاصة لا يمكن تورِيثها.
الآن نبدأ في تنفيذ وظيفة الكلاس الجديد والذي يقبل مُعطَى قيمته نصيّة وبااعتبار صفات الكلاس القديم هي من قَبِيل الصفات النصية فسنجعلها معطيات لهذه الوظيفةِ.
n.hi(n.friend1)
مرحَبَاً بصدِيقي العزيز محمد الهاشمي 
n.hi(n.friend2)
مرحَبَاً بصدِيقي العزيز نضال شوَيَّة 
n.hi(n.__friend3)
Traceback (most recent call last):
File "", line 1, in 
AttributeError: new instance has no attribute '__friend3'

ملاحظة أخيرة عملية إسناد قِيَم للصِفات الصحيح أن تتم داخل الوظيفة __init__ والتي نُسَمِّيها وظيفة البِناء, هل عرفتُم مدَى أهمية هذه الوظيفة؟
وما دمنا بصدد الحديث عن الوظيفة __init__ فحقِيقٌ علينا الإشارة إلى أنه من الثابت والراسخ في لغة بايثون أن كل كلاس يحوي هذه الوظيفة افتراضياً سواءً تعرضتَ لها بكتابة أكواد ضمنها أو لم تتعرض لها، حتى لو أنشأتَ كلاس وتعمدتَ عدم كتابة هذه الوظيفة فاعلم يقيناً أنها موجودة.
ثم اعلم أن هذه الوظيفة تكمن أهميتها في تمرير ما بها من صفات وأكواد إلى الكلاس فكل معاملات هذه الوظيفة هي مُعامِلات للكلاس وأي كود تكتبه ضمنها هو افتراضياً سيعمل بمجرد عمل الكلاس. 
هناك وظيفة أخرى ينطبق عليها هذا الكلام تقريباً وهي الوظيفة __del__ هذه الوظيفة ستعمل فور انتهاء الكلاس وهدْمِه, ولذا نسمِّيها إصطلاحاً وظيفة الهدم.

لا تنسَ ذكر الله

التطبيق على الوراثة:
import webbrowser
import tones

class old:
	def web (self, x):
		webbrowser.open(x)
	def Beep(self, x, y):
		tones.beep(x, y)
	def numType(self, x):
		if x %2==0:
			print ("لقد أدخلتَ عددا زوجيا")
#هنا نقول إذا كان العدد الذي تم إدخاله عندما نقسمه على 2 يتبقى 0 فهذا يعني أنهُ عددا زوجيا اطبع لنا ذلك.
		elif x %2!=0:
			print ("لقد أدخَلْتَ عددا فرديا")
#وأما إذا كان لا يساوي 0 فهذا يعني أنهُ فرديا، أي عند القسمة يتبقى كسور.
		else:
			print ("هذا ليس عددا صحيحا")
#وهذا هو الكِلاس الأول به ثلاث دوال، الأولى لفتح الروابط، والثانية لإصدار صوت البيب، أما الثالثة لتحديد نوع الرقم الذي تم إدخاله أكان فرديا أم زوجيا.

#الآن نُنشِئ الثاني:
class new (old):
#new طبعا هو اسم الكلاس الجديد، وأما old هو الكلاس القديم وضعنا اسمه بين قوسين دلالة على أننا نريد استخدام وظائفه في كلاسنا الجديد.
	def مربعات (self, x):
		print (x*x)
#واضحة هذه الدالة تأخذ عدد من المستخدِم وتطبع له ناتج مربعه.
	def جذور (self, x):
		print (x**0.5)
#أما هذه فتأتي بالجذر التربيعي للعدد الذي تم إدخاله، كما يمكننا وضع الشروط لعدم حدوث أي أخطاء بسبب الإدخالات الخاطئة.

النتائج، سنستخدِم دوال الكلاسين من الكِلاس الجديد فقط:
>>> new().Beep(500, 100)
>>> new().مربعات(8)
64
>>> new().جذور(25)
5.0

>>> new().numType(5)
لقد أدخَلْتَ رقما فرديا
>>> new().numType(36)
لقد أدخلتَ رقما زوجيا

اللهم علِمْنا ما ينفعنا وانفعنا بما علَمْتنا وزِدْنا عِلْما.

الدرس الحادي عشر: ملحق بالمكتبات


في هذا الدرس نتعرف على طرق استيراد المكتبات مع إلقاء الضوء على عدة مكتبات مفيدة.
1 الطريقة المعتادة import واسم المكتبة مباشرةً كهذا:
import webbrowser
وهذا يتطلب كتابة اسم المكتبة كلما احتجنا إليها.
webbrowser.open('www.AlaqsaVoice.ps')
2 استيراد دالة واحدة من المكتبة المراد استخدامِها أو بعض دوالِها هكذا:
from webbrowser import open
وهذه الصورة لن تجعلنا نحتاج إلى كتابة اسم المكتبة كلما احتجنا إليها، وهذا يفيد في كون اسم المكتبة طويل، مثال:
open('www.AlaqsaVoice.ps')
هنا كتبنا اسم الدالة ومن ثَم قمنا بكتابة معاملاتها مباشرةً دون الحاجة لكتابة اسم المكتبة.
كما أن هذه الدالة open لا تفتح الروابط فقط بل يمكنُها فتح أشياء أخرى خاصة بالويندوز، على سبيل المثال:
open('.')
لو كتبنا هذا الكود في البوابة سيفتح لنا مجلد nvda الخاص بالنسخة التي نعمل عليها، ولو كنا نعمل على البايثون المثبتة سيفتح لنا مجلد المستخدِم، 
أي أن هذا يفتح مجلد العمل الذي نعمل عليه.
open('control')
أما هذا فيفتح لنا لوحة التحكم الخاصة بالحاسوب.
الآن إذا أردنا استيراد أكثر من دالة، نفصل بينهم بفاصلة على النحو التالي:
from webbrowser import open, open_new_tab
3 اختصار اسم المكتبة هكذا:
import webbrowser as web
ف web هنا اختصار لاسم المكتبة الطويل ويمكن اختصاره أكثر بكتابة حرف واحد w مثلا، المهم أي اسم صغير وتعرفه وقت الحاجة حتى تكتبه كما تم استيراده بالضبط.
مثال:
w.open('www.google.com')
4 الصورة الرابعة والأخيرة، هي استيراد كل دوال وصِفات المكتبة بوضع علامة النجمة هكذا:
from tones import *
وعند الاستخدام يمكنك كتابة اسم الدالة مباشرةً كما فعلنا مع الصورة الثانية.
في المشاركات التالية سنتحدث عن بعض المكتبات القياسية وغير القياسية.

لا تنسَ ذكر الله

مكتبة urlfinder: لاستخلاص الروابط من النصوص


قد تحدَّثْنا سابقاً عن المكتبات والحُزَم الجاهزة, وقلنا إنها نوعان:
النوع الأول المكتبات والحزم القياسية والتي تأتي مع بايثون, 
والثاني مكتبات غير قياسية جاهزة نعمل على تحميلها من الإنترنت ثم نستخدمها ونوفر الوقت على أنفسنا. 
أما تحميلها فسهل كتحميل أي ملف, وإليكم هذا الملف وهو مكتبة جاهزة لاستخلاص وإيجاد الروابط من نص بعينه, اسم المكتبة urlfinder إليكم رابط التحميل:
اضغط هنا للتنزيل

عندما تذهب إلى مجلد التحميل ستجد هذا الملف urlfinder.py
نعم هو ملف عادي من ملفات بايثون وبه أكواد عادية من أكواد بايثون, 
لكن بدل أن نأخذ هذه الأكواد ونستخدمها في مشاريعنا بتكرار كتابتها أو نسخها ولصقها بدل من كل هذا سنستخدمها كأنها مكتبة من مكتبات بايثون القياسية 
أي نأتي إلى الملف الذي نشتغل فيه والخاص بمشروعنا, ومع الاستدعاءات السابقة داخل مشروعنا سنستدعي هذه المكتبة بكتابة اسم الملف دون اسم الملحق هكذا:
import urlfinder
لكن توقف قليلاً, كيف نستدعي شيء غير موجود؟!، فنحن لم نضع المكتبة بعد في المكان المناسب, 
نعم سؤال في منتهى الذكاء ينْبَغِي وضعها أولاً في مكانها, 
اذهب إلى مجلد nvda سواء الثابتة أو المحمولة وقم بلصْقِهِ هناك, أقول مجلد nvda وليس مجلد المستخدِم, 
بعد أن تضع ملفكَ أي المكتبة في المكان المناسب من الأفضل أن تعيد تشغيل nvda 
سأشتغل الآن من خلال البوابة تأمّلوا فيما أكتبُ:
>>> import urlfinder
Traceback (most recent call last):
File "", line 1, in 
ImportError: No module named urlfinder
لا توجد مكتبة بهذا الاسم, لماذا؟
لأنه بكل بساطة لم ألصق المكتبة في مجلد nvda الآن سألصقها انتظروني قليلاً
.
.
.
لقد ألصقْتُها في المكان المناسب باعتبار أني أستخدِمُ nvda المثبتة على الجهاز فإني ذهبتُ إلى القرص c ثم Program Files ثم nvda وألصَقْتُها هناك.
ذهبتُ بعدها إلى البوابة وكتبتُ أوّل ما كتبتُ استيراداً للمكتبة على النحو التالي:
import urlfinder
والآن سأكتب متغيراً نصّياً به روابط كما أن به كلام فاضي كثير لا معنى له, وهذا النص لا ينفع أن نستخدمه مع مكتبة webbrowser لذا ينبغي الاستخلاص والاستئصال, سأنشِئ الآن المتغير x وهو من نوع string.
x = ' kd lskjd jakk45453222345 44frfds www.youtube.com lkjl;aldkfjgfjgirieiowwgf jfkdjlowqow www.yahoo.com jlkjlkdi iii uis www.AlaqsaVoice.ps h'
والآن سأنشِئ متغيراً من نوع القوائم سيحوي الروابط التي كانت في السلسلة النصية x لكن هذه المرة بشكل محترم.

list = urlfinder.find_urls(x)
نعم لقد كتبتُ اسم المكتبة ثم الدالة التي تعمل على تنظيف النص وجمع الروابط في قائمة واحدة, والدالة هي find_urls وهذه الدالة لها معامل هو السلسلة النصية التي تحوي الروابط المراد استخلاصها من بقية الكلام الفارغ. فالمعامل سلسلة نصية تحوي روابط كما تحوي كلاماً فاضياً, فإن لم تكن تحوي روابط فالنتيجة قائمة فارغة وإن كان النص يحوي رابطاً واحداً فالنتيجة قائمة تحوي عنصراً واحداً وهو ذاك الرابط فإن كان النص يحوي ثلاثة روابط فالنتيجة قائمة تحوي ثلاثة عناصر هي الروابط الثلاثة.
الآن سأطْبَعُ متغيرنا list .
>>> print (list)
الخارج:
['www.youtube.com', 'www.yahoo.com', 'www.AlaqsaVoice.ps']

لا تَنسَ ذِكر الله 

مكتبة xFind: لاستخلاص النصوص من بين أي علامَتين


السلام عليكم ورحمة الله وبركاته
إخوتي الكرام مرحباً بكم من جديد, سنتحدث عن موضوع تطرَّقنا إليه بشيء من الإيجاز في دروس سابقة, وها نحن اليوم نفصّل فيه أكثر, 
الحديث عن إضافة المكتبات غير القياسية إلى مشاريعنا, اسم المكتبة التي سنتعامل معها الآن هو "xFind." 
أولاً علينا أن نعمل على تحميل هذه المكتبة من الرابط الموجود في آخر المشاركة.
والآن ماذا سنعمل بها؟
المهمة بسيطة بإمكانكَ إلحاق ملف المكتبة بِمجلد nvda وبعد ذلك يمكنك إستخدامها بكل سهولة, والسؤال ما فائدة هذه المكتبة?
ألم تفكر يوماً في استخلاص جمل من نص كبير هذه الجمل بينها قواسم مشتركة مثلاً تقع بين قوسين هلاليين أو بين أصغر من وأكبر من أو بين www من ناحية وَ .com من ناحية أخرى ستعمل الإضافة على إيجاد كل هذه النصوص وتقديمها لكَ على طبق من ذهب في شكل قائمة تحوي عدد من السلاسل النصية متى تعددت النتائج. 
أو تعطيكَ سلسلة نصية واحدة إذا لم تكن من نتيجة إلا هذه, أو قائمة فارغة هكذا [] وذاك حين لا توجد أي نتائج بحث أصلاً.
طبعاً أنا أضفتُ المكتبة في وقت سابق وما عليّ هنا إلا استيرادها على النحو التالي:
import xFind
ممتاز الآن أريد متغير يحمل قيمة نصية للتجربة.
str = ' مَرحباً بالجميع أنا <صلاح البرعصي> أسكن مدينة <البيضاء> وأعملُ موظفَاً لدى <وزارة التعليم> و لي صديق من <المملكة المغربية> اسمه <محمد الهاشمي> ويسكن بالتحديد في مدينة <القصر الكبير>'
والآن سأجرب استخدام مكتبتنا لاستخلاص النصوص الواقعة بين علامَتَي أصغر من وأكبر من , سنكتب اسم المكتبة ثم نقطة ثم اسم الدالة وهو مشابه لاسم المكتبة والدالة xFind هذه لها ثلاثة معاملات هي: 
النص المراد إجراء البحث بداخله وفي مثالنا str ثم يأتي المعامل الثاني وهو أيضاً سلسلة نصية سنضع في مثالنا الحالي العلامة أو الحروف المراد بدء الاجتِزاء منها وستكون علامة أصغر من ثم المعامل الثالث وهو سلسلة نصية أيضاً تمثل المقطع النصي الذي تنتهي عنده عملية الاجتزاء وفي مثالنا سيكون علامة أكبر من إذاً إلى التطبيق. 
list = xFind.xFind(str, '<', '>')
سنطبع المتغير
print (list)
النتيجة:
['صلاح البرعصي', 'البيضاء', 'وزارة التعليم', 'المملكة المغربية', 'محمد الهاشمي', 'القصر الكبير']

هكذا تم الموضوع بنجاح وإلى اللقاء مع استفساراتِكم.
إليكم الرابط :
xFind اضغط هنا للتنزيل

مكتبة random: للاختيار العشوائي


فلنبدأ الآن باستيراد المكتبة هكذا:
import random
أولا طريقة اختيار رقم عشوائي:
نستخدِم الدالة: randint هكذا
>>> random.randint(100, 300)
109
أي قم باختيار رقم عشوائي من 100 إلى 300، وإذا كتبنا رقم 1 500 مثلا سيبدأ الاختيار من الصفر.
ثانيا الدالة التي تمكنُنا من اختيار نص هي: choice
random.choice(ونضع هنا قائمة بالنصوص التي نريدها)
>>> print (random.choice(["سبحان الله", "الحمد لله", "الله أكبر", "لا إله إلا الله", "لا حول ولا قوة إلا بالله"]))
الله أكبر
>>> print (random.choice(["سبحان الله", "الحمد لله", "الله أكبر", "لا إله إلا الله", "لا حول ولا قوة إلا بالله"]))
الحمد لله
الدالة الثالثة: وهي لتغيير ترتيب القائمة بشكل عشوائي هكذا:
>>> l = ["سبحان الله", "الحمد لله", "الله أكبر", "لا إله إلا الله", "لا حول ولا قوة إلا بالله"]
>>> random.shuffle(l)
لنرى النتيجة بطبع القائمة:
>>> print (l)
['الحمد لله', 'سبحان الله', 'لا إله إلا الله', 'الله أكبر', 'لا حول ولا قوة إلا بالله']

وإلى لقاءٍ آخر بمشيئةِ الرحمن، نرجو لكم وقتا ممتعاً.

مكتبة winsound: لتشغيل الملفات الصوتية بامتداد wav


السلام عليكم ورحمة الله وبركاته, أسعد الله أوقاتكم.
نتناول الآن بالشرح بعضاً من وظائف و صفات مكتبة winsound, وهي من المكتبات القياسية لن نحتاج إلى البحث عنها وتثبيتها.
أولاً سنستورد المكتبة بالطريقة المعتادَة:

import winsound
1- كيف يَسَعُني تشغيل مقطع صوتي بواسطة هذه المكتبة؟
في البداية عليكَ أن تَعْرِفَ أن الوظيفة المسؤولة عن تشغيل الأصوات في هذه المكتبة هي PlaySound ونرجو التركيز بدقة على الحرفين p و s الذَين تم كتابتهما بحروف كبيرة, ومما ينبغي أن تعرِفَه أيضاً أن هذه الوظيفة تَقْبَلُ وَسِيطَين, الأول اسم الملف المراد تشغيله ولا يكون إلا من نوع wav 'name.wav' في الوسيط الأول سَتَكْتُبُ دليل الملف الصوتي وأما الوسيط الثاني فسيكون من نوع long أي الأرقام الطويلة,وأنتَ بالخيار ما بين أن تكتب الصفة المناطة بالتشغيل أو قيمة تلك الصفة, فأما الصفة الخاصة بالتشغيل فهي winsound.SND_ASYNC أو أنْ تكتُبَ القيمة وهي كما قلنا عبارة عن رقم طويل هو 1 
نأخذ مثالاً عن هذه الحالة:
winsound.PlaySound('test.wav', winsound.SND_ASYNC)
طريقة كتابة القيمة بدل الصفة
winsound.PlaySound('test.wav', 1)
2- ما الطريقة التي ينبغي اتباعها كي أشغِّلَ الملف الصوتي بشكل مستمر, فكلما انتهى يبدأ من جديد؟
بإمكانكَ فعل هذا عن طريق الكود السابق ولكن بإضافة صفة أخرى إلى الوسيط الثاني, نعم أقول الثاني وليس بإنشاء وسيط ثالث, ستقول طيب سأكتب صفتين في وسيط واحد فكيف يمكن هذا, الإجابة عن طريق وضع هذه العلامة بين الوسيطين | علامة شريط, وهكذا سيتم تشغيل الملف الصوتي باستمرار وبدون توقف, إليكم مثالاً حياّ لِفَهْمِ هذا.
winsound.PlaySound('test.wav', winsound.SND_ASYNC| winsound.SND_LOOP)
حسَناً ما الوسيلة لكتابة هذا الكود بِالقِيَم بدل الصفات؟
تأمل هذا.
winsound.PlaySound('test.wav', 1 | 8)
3- لقد عملَ الكود السابق وأَدَّى إلى استمرار تشغيل الصوت دون توقف, فكيف أستطيع إيقافه؟
يمكنكَ ذلك عن طريق هذا الكود.
winsound.PlaySound(None, winsound.SND_ASYNC)
ويمكنك أيضاً كتابة الكود عن طريق وضع قيمة بدل الصفة في الوسيط الثاني.
winsound.PlaySound(None, 1)
نلاحِظُ في الكودَين الأخيرين أننا لم نضع اسم ملف لتشغيله بل وضعنا None أي لا شيء بمفهوم آخر "العدم".

الواجب:
إخوتي إذا كتبنا import winsound ثم 
help(winsound)
فإننا سنحصل على المساعدة الخاصة بهذه المكتبة, 
والمطلوب منكم أن تُعدُّوا ورقة بحثية تشرحوا فيها هذه المكتبة حسب ما تفهموا منها ولكم الحق كل الحق في الاستعانة بالعم google 
المهم هذه المرة ستتدربون على استنباط المعلومات من أدلَّتِها العلمية, المساعدة + التجربة العلمية لا العشوائية + الاستعانة بمحركات البحث ستعطيك كل ما تحب 
اكتب في google python winsound example import وادخل موقعين وثلاثة وأربعة بل حتى عشرة حتى تحظى بكل ما تحب, من السابق إلى هذا العمل الكبير والمكلِّف. 
ليس شَرطاً أن تفهم كل شيء أو أن تكتب عن كل الصفات المهم أن تغطِّي بالبحث الوظائف الثلاث مع وضع أمثلة مناسبة تم تجربتها على البوابة.
بارك الله فيكم،
والسلام عليكم ورحمة الله وبركاته.

الإجابة: لا تغش قبل محاولة معرفتها.
لهذه المكتبة ثلاث دوال وهي:
1 PlaySound
2 Beep
3 MessageBeep
الدالة الأولى: PlaySound, وتأخذ معاملين هما: الصوت المراد تشغيله والصفة أو الرقم الطويلولها عدة صفات كل صفة يقابلها عدد نتعرف عليه الآن:
    SND_ALIAS = 65536
ويجب سبقها باسم المكتبة هكذا:
winsound.PlaySound("C:/ok.wav", winsound.SND_ALIAS)
أما إذا استخدمنا الرقم المقابل لهذه الصفة فلا نحتاج لسبقه باسم المكتبة.
winsound.PlaySound("C:/ok.wav", 65536)
    SND_APPLICATION = 128
تشغيل أصوات خاصة بالتطبيقات.
    SND_ASYNC = 1
اسم الملف المراد تشغيله ملحق به امتداده wav وسيتم تشغيله مباشرةً.
    SND_FILENAME = 131072
اسم الملف المُراد تشغيله ولا يُشتَرَط إلحاقه بالامتداد.
    SND_LOOP = 8
لتشغيل الملف بشكل متكرر، أي كل ما ينتهي يعيد.
    SND_MEMORY = 4
    SND_NODEFAULT = 2
أي لا تشغل صوت البيب الافتراضي إذا كان الصوت المحدد غير موجود.
    SND_NOSTOP = 16
أي لا تجعل صوت آخر يوقف هذا الصوت أثناء عمله.
    SND_NOWAIT = 8192
أي انتظر حاليا توجد أصوات أخرى تعمل.
    SND_PURGE = 64

الدالة الثانية وهي Beep:
نلاحظ هنا أن حرف B كبير وليس كبيب التي تعرفنا عليها سابقا في مكتبة tones.
أما بالنسبة لوظيفتها فهي تؤدي نفس الوظيفة تقريبا ولكن يُشترط في العدد الأول وهو المسؤول عن حدة الصوت أن يكون بين 37 و32767 وإلا ستظهر رسالة الخطأ.
الدالة الثالثة: MessageBeep.
وهي المسؤولة عن تشغيل أصوات الويندوز الخاصة بالمستخدِم.
ونستخدِم معها الصِفات التالية:
    MB_ICONASTERISK = 64
    MB_ICONEXCLAMATION = 48
    MB_ICONHAND = 16
    MB_ICONQUESTION = 32
    MB_OK = 0
والحقيقة هي لا تساوي الرقم المكتوب فقط بل تساوي بدايةً من الرقم المكتوب إلى حين دخول رقم آخر، على سبيل المثال:
MB_OK هي تساوي 0 لكنها تساوي أي رقم من 0 إلى 16 أي رقم منهم سيعطينا نفس النتيجة.

اللهم علِمنا ما ينفعنا وانفعنا بما علَمْتَنا وزِدْنا عِلْما.

مكتبة os: للتعامُل مع الملفات والمجلدات وأشياء أخرى


السلام عليكم ورحمة الله وبركاته, كيف حال إخوتي اليوم, أتمنى أن تكونوا بموفور الصحة وكامل العافية.
سنتناول بالدراسة مكتبة os التي تساعدنا في التعامل مع المسارات أي الأدلة الخاصة بالمجلدات والملفات المختلفة كما يمكننا حذف الملفات والمجلدات بها, وإنشاء المجلدات وأُمور أخرى مفيدة للغاية. 
وهي من المكتبات القياسية، لن نحتاج إلى تثبيتها.
في البداية سنستورد المكتبة.
>>> import os
والآن لنتعامل مع دوالها المختلفة. 
لفتح ملف أو مجلد نستخدِم الدالة startfile على النحو التالي:
>>> os.startfile("sound.txt")
هذا ملف نصي سيفتح في النوتباد أو البرنامج الافتراضي الذي يعمل به، يعني لو كان ملف صوتي سيتم فتحه في مشغل الصوتيات الافتراضي الذي تستخدمه.
لنُجرِب فتح مجلد waves الذي يحتوي على أصوات nvda:
os.startfile("waves")
سيفتح المجلد مباشرةً.
مع التأكد من وجود الملف أو المجلد في المسار المحدد حتى لا يظهر الخطأ يقول أنه لا يوجد هذا الشيء المطلوب هكذا:
FileNotFoundError: [WinError 2] The system cannot find the file specified
كما يمكننا استخدام os.system('"***"') للتعامل مع سطر الأوامر، النجوم هي مكان كتابة الأمر.
أريد إعادة تسمية ملف ما الذي علي أن أجريه كي أصل إلى هذا الغرض؟
تأملوا معي الكود التالي , علماً بأن الملف الذي سنجري عليه تدريباتنا اسمه 'test.txt'
>>> os.rename('test.txt', 'hello.txt')
نعم لقد تمت العملية بمنتهى الدقة وقد تغير اسم الملف إلى hello.txt بعد أن كان test.txt 
ممتاز الآن وقد تعلمنا كيف نغير أسماء الملفات, 
نريد أن نتدرب على إنشاء المجلدات, الدالة المستخدمة هي mkdir()
>>> os.mkdir('صوت الأقصى')
الآن اذهب إلى الدليل الذي أنشأتَ فيه المجلد وتأكد من وجوده هناك, حتى يسْهُل عليك العمل دع المجلد مفتوحاً كي تتأمل التغييرات بسهولة, الآن أريد التأكد من الدليل هل هو موجود أم لا سنستخدم الدالة exists()
>>> os.path.exists('صوت الأقصى')
True
وهذا يعني أن المجلد أو الملف موجود بالفعل طيب لنغير اسم المعطَى بإضافة أي رقم أو حرف و نَنْظُر ما الذي سيحدث معنا.
>>> os.path.exists('1')
False
وهذا يعني أنه لا وجود لملف أو مجلد بهذا الاسم. 
كيف أستطيع التفريق بين الملفات والمجلدات عن طريق هذه المكتبة؟
>>> os.path.isfile('صوت الأقصى')
False
وهذا يعني أن الدليل ليس لملف بل لمجلد.
>>> os.path.isfile('hello.txt')
True
وهذا يعني أن الدليل لملف وليس لمجلد.
سنتعرض الآن إلى هذه الدالة:
>>> print (os.getcwd())
C:\Program Files\NVDA
الدالة السابقة تفيدنا في الحصول على دليل العمل الحالي, وهو بالتأكيد لن يعطيك إلا مسار برنامج nvda لأنه هو مسار عمل السكربت الحالي, فبايثون يتعامل مع nvda على أنه برنامج واحد وليس برنامج ومعه عدد من البريمجات الأخرى المسماة الإضافات. عندما تنشئ برنامج مستقل عن بايثون سيعطيك مسار ذاك البرنامج.
والآن إلى هذه الدالة لمعرفة حجم ملف ما.
>>> print (os.path.getsize('hello.txt'))
28
أي 28 بايت. 
والآن ما رأيكم في التعرف على محتويات مجلد بعينه؟
>>> list = os.listdir('locale')
>>> print (list)
['af', 'af_ZA', 'am', 'an', 'ar', 'as', 'bg', 'bn', 'ca', 'ckb', 'cs', 'da', 'de', 'de_CH', 'el', 'en', 'es', 'es_CO', 'fa', 'fi', 'fr', 'ga', 'gl', 'gu', 'he', 'hi', 'hr', 'hu', 'id', 'is', 'it', 'ja', 'ka', 'kmr', 'kn', 'ko', 'kok', 'ky', 'lt', 'mk', 'ml', 'mn', 'mni', 'my', 'nb', 'nb_NO', 'ne', 'nl', 'nn_NO', 'pa', 'pl', 'pt', 'pt_BR', 'pt_PT', 'ro', 'ru', 'sk', 'sl', 'so', 'sq', 'sr', 'sv', 'ta', 'te', 'th', 'tr', 'uk', 'ur', 'vi', 'zh', 'zh_CN', 'zh_HK', 'zh_TW']

وهذه هي الملفات التي يحويها المجلد locale.
الآن ما رأيكم أن نحذِف الملف hello
>>> os.remove('hello.txt')
نعم لقد تم حذفه تماماً.
سنتدرب فيما يلي على تشريح الدليل وذلك بفصل اسم الملف أو المجلد عن بقية امتداد الدليل. على النحو التالي:

>>> list = os.path.split("C:\Program Files\Libyamax-Cela\SetupDriver.exe")
>>> print (list)
('C:\\Program Files\\Libyamax-Cela', 'SetupDriver.exe')

مكتبات أخرى للتعامل مع الملفات والمجلدات


وهذه أيضا مكتبات قياسية لا تحتاج تثبيت من الخارج.
import shutil
لنقل الملفات
>>> shutil.move('atair.txt', 'new')
وهذا لحذف الملفات والمجلدات
>>> shutil.rmtree('new')

المكتبة الثانية:
import subprocess
>>> subprocess.Popen('explorer "new"')

الدرس الثاني عشر: موضوعات متنوِعة, المصطلحات الإنجليزية


إليكم بعض المصطلحات الإنجليزية التي علينا معرفتها:
1- python: بايثون 
2- language: لغة 
3- program: برنامج 
4- code: شفرة 
5- programmer: مبرمِج
6-value : القِيمَة.
7-type : نوع.
8-string: السلسلة النصية أو المحارف أو السلسلة الحرفية أو النصوص.
9- integer: الأرقام الصحيحة.
10-float : الأرقام المحتوية على فاصلة عائمة أو ما نسميها بالأرقام العشريّة.
11-tuple : صَف
12-variable :متغير
13- function : دالة 
14-body : جسد ونقصد به متن الدالة.
15-head : رأس ونقصد به عنوان الدالة.
16-list: قائمة 
17-dictionary: قاموس
18-key: مفتاح
19-loop: حلقة
20-condition: شَرْط
21-item: عنصر
22-attribute: صفة للكلاس
23-method: وظيفة الكلاس
24-class: فئة أو كلاس
25-error: خَطَأ
26- statement:إفادة, مثل return و break وغيرها من الإفادات.
27-recursion: التكرار.
28-boolean: منطقي وهو نوع آخر من أنواع البيانات, ويكون إما True أو False ويُعرَف اختصاراً بِbool.
29- unicode: يونيكود وهو نوع من أنواع البيانات مشابه لحد قريب لنوع البيان string.
30- data types: أنواع البيانات, مثل السلاسل النصية والأرقام الصحيحة والأرقام العشرية والصفوف والقوائم وغيرها.
31-long: نوع آخر من أنواع البيانات, وتحديداً البيانات الرقمية سنضيفه إلى ما تعلمناه سابقاً من الأرقام الصحيحة والأرقام العائمة, فهو يمثل الأرقام الطويلة أي التي تبدأ من الرقم 2148473648 إلى ما لا نهاية.
32-Syntax errors: الأخطاء في بناء الجمل البرمجية, مثل أن تنسى إغلاق قوس مثلاً أو فتحه وغيرها من أخطاء التراكيب, نعطي مثالاً على ذلك:
>>> type 33)
File "", line 1
type 33)
^
SyntaxError: invalid syntax
33-Semantic errors: الأخطاء المعنوية.
34-Run time errors: الأخطاء التي تقع حين تشغيل البرنامج ولا تظهر حين كتابته, مثال ذلك أن تعطي أمراً في برنامجكَ بتشغيل ملف صوتي من ملفات ويندوز وحين تشغيل البرنامج من مستخدم آخر, لا يعمل هذا الكود لأنه بكل بساطة الملف الصوتي غير موجود بسبب تغيير اسمه أو حذفه, فأنتَ لا تتصور أن ثمة ويندوز لا يوجد فيه ذاك الملف الصوتي مثلاً, ولذلك عليك أن تتوقع هذه الأخطاء وتعد لها العدة المناسبة.
35Reserved words :الكلمات المحجوزة من قِبَل بايثون, وهذه الكلمات ينبغي علينا معرفتها حتى لا نسمي متغيراتنا بأسمائها, مثال ذلك if و else و class وغيرها من الكلمات التي تم حجْزَها.
36-Operators: العوامل الرياضية, مثل الزائد والناقص والضرب وغيرها.
37-Expressions:التعبيرات البرمجية.
38-Comments: التعليقات, وهي التي نسبقها بالعلامة #.
39-bugs: الأخطاء البرمجية. 
40-debugging: إصلاح الأخطاء البرمجية. 

موضوعات متنوِعة: أنواع المتغيرات والإفادة global


المتغيرات من حيث تأثُّرِها وتأثيرها تنقسم إلى عام وخاص:
العام نسمّيه عمومي أو عالمي. 
الخاص نسميه محلّي كل متغير من الناحية الهرمية له مكان يتبَوَّؤُه, 
كيف ذلك?
اللبنات البرمجية تحوي بعضها بعضاً, الكلاس عبارة عن لبنة برمجية والوظيفة التي داخل الكلاس لبنة برمجية والدالة الموجودة خارج الكلاسات أيضاً لبنة برمجية. 
هل اتَّفَقْنا على هذا؟ 
ما معنى اللبنات تحوي بعضها بعضاً؟ 
نعم, الكود الذي نكتبه قد يحوي كلاس أو اثنين أو أكثر, فالملف الذي نعمل عليه مشروعنا في قمة الهرم ثم تأتي بعده الكلاسات وكل كلاس فيه وظائف 
فالوظائف تأتي في ترتيب متأخر عن الكلاسات وعن ملف العمل ,تخيل الصورة بشكل هرمي, في أعلى الهرم ملف التطبيق ثم تحته الكلاسات أو الدوال ثم داخل الكلاسات الوظائف, 
ما معنى أن تجد الدالة داخل ملف وخارج كلاس, هذا أمر سهل وبسيط قلنا أن الوظيفة هي المندرجة داخل كلاس ونجد من معاملاتها self وأما الدالة فلا تندرج تحت كلاس بل هي في الملف مباشرة, وليس من معاملاتها self, جميل جداً. 
ركزوا قليلاً: كل متغير في رتبة يَسرِي تأثيره على كل الرُّتَب التي تحته ويمكن لهذه الرُّتَب استعماله, لكنها لا تؤثر فيه, أي أن الرتب لا يمكنها تغيير قيمة المتغير بل تستفيد من قيمته الأصلية في الرتبة الأعلى فحسب. 
نشرح الكلام السابق بالأمثلة. 
افتح بوابة بايثون واكتبْ التالي: 
x =1
أنشأنا متغيراً سمّيناه x وأعطيناه قيمة رقمية وهي 1. 
print (x)
طبَعنا المتغير x وهذا يعني أن قيمته هي التي ستتم طباعتها. 
الناتج من أمر الطباعة: 1 
رائع, نلاحظ أن المتغير x في قمة الهرم فهو لا يندرج تحت كلاس ولا وظيفة ولا دالة. 
الآن سنُنشئ دالة نسميها test1 وهذه الدالة بسيطة جداً لا توجد بها أي أكواد اللهم إلا كوداً واحداً وهو أمر طباعة للمتغير x. 
def test1():
	print (x)
 ... 
الآن نخرج من الدالة تماماً ثم نعطي المتغير x قيمة جديدة وهي 2. 
>>> x =2 
الآن نُنَفِّذ الدالة test1 ونرى ما سيحدث. 
>>> test1() 
2
ممتاز, الخلاصة أن الدالة test1 استطاعت استعمال المتغير x لكن السؤال هل لو غيّرنا قيمة x داخل الدالة سيسري هذا التغيير خارجها أم هو تغيير محلّي فقط?
التجربة هي من سيجيب عن السؤال. 
نُنشِئ دالة جديدة نسميها test2, فيها سنكتب كَودَين اثنين فقط, هما عملية إسناد بها نعطي x قيمة عددية صحيحة وهي 10, والكود الثاني نطبع قيمة x. 
def test2():
	x = 10
	print (x)
... 
هل تذكرونا قيمة x قبل كتابة هذه الدالة?
 نعم 2 كانت بالفعل 2, 
الآن لننفِّذ الدالة test2.
test2() 
10 
جميل, الدالة عملتْ بالشكل المطلوب, أعطتْ x قيمة عددية وههي 10, ثم طبعتْ هذه القيمة وما رأيناه هو طباعة قِيمة x. 
الآن نريد أن نطبع x لكن خارج الدالة أي في الهواء الطَّلْق, يعني في البوابة مباشرة.
>>> print (x)
2
غريب ألم تتغير قيمة x إلى 10?
لا غريب ولا شيء, 
كل ما في الأمر أن الهواء الطلق أقوى من الدالة, فكانت x خارج الدالة يسعها التأثير داخل الدالة ولو لم يسعها ذلك لقال لنا بايثون حين استخدام x في المثال الأول إنه لا يعرف x. 
ولكنه بالفعل يعرفها ويعرف قيمتها المُعرَّفة خارج الدالة, هكذا المتغير خارج الدالة يمكنه أن يعمل داخل الدالة وأن تتم الاستفادة منه بطبعه أو أخذ قيمته والتعامل معها بأي شكل من الأشكال, ولكنّ العكس غير صحيح, فلو أن عندكَ متغير داخل الدالة ولا يعرفه أحد إلا الدالة 
ونفترض اسمه y وخارج الدالة أعطيته أمر طباعة 
فإن بايثون سيُوبِّخكَ ويُعنِّفُكَ ويُسوِّد عيشَتَك, لأنه لا يعرفه إلا داخل الدالة ولا يُسمحُ لك باستعماله إلا داخل الدالة فحسب. 
لقد رأينا في مثال test2 أن قيمة x تساوي عشرة, لكن هذا الكلام سيكون بشكل محَلّي وعلى نطاق ضيق داخل الدالة test2 ولن يَسري هذا الكلام على ما هو خارج الدالة سواء الهواء الطلق أو الدوال الأخرى بل حتى مع الدالة نفسها متى تكررتْ. 
ماذا تقول؟ حتى مع الدالة نفسها متى تكررتْ؟! 
كيف ذلك؟ 
لو تم استخدام الدالة مرة ثانية فإنها لن تعتَبِر بالاستخدام الأول لها وإنما ستبدأ كأنه لم يكن شيء قبْلاً. 
مثال ذلك: 
>>> x =1 
أنشأنا متغير هو x وقيمته 1. 
>>> def test3(x):
... 	x = x+1
... 	print (x)
... 
أنشأنا دالة لها معامل سمّيناه x قد يحل محله أي رقم وليس معناه أنه x السابقة, لكنها تَصْلُح أن تكون معطَى لها لأنها بطبيعة الحال سلسلة رقمية, كأي سلسلة رقمية يمكنها أن تلعب دور معطى لهذه الدالة. 
ثم كتبنا بها كَودَين: 
الأول : عملية إسناد لمتغيرٍ محلِّي اسمه x, وهذا ليس المتغير العام بالخارج, وأعطيناه قيمة عددية هي x والمتمثلة في المعامل الخاص بهذه الدالة زائد واحد. 
الثاني: أمر طباعة للمتغير المحلِّي x. 
الآن إلى التنفيذ: 
>>> test3(x) 
ولأن الدالة test3 تقبل معاملاً واحداً رقمِياً, ولأن xالتي قيمتها واحد والمُعَرَّفَة في أول المثال خارج الدالة هي أيضاً تحمل قيمة رقمية فبالتالي استخدمناها لِتَكُون معطَى لذاك المعامل. 
الناتج: 2 
نتيجة جِدُّ طبيعية, تم إعطاء x المحلي قيمة متمثلة في x المعامل, وهو طبعاً يمثل في هذا المثال x العامة أي الخارجة عن الدالة, مجموعة مع واحد. 
ثم طباعة المتغير المحلي x. 
الآن نريده أن يكرر هذا الأمر بتكرار الدالة. 
>>> test3(x) 
الناتج 2 
لم يتغير شيء لأن الدالة متغيراتها محلّية لا تؤثر في ما هو خارج الدالة من أسطر برمجية أو دوال ولا حتى الدالة نفسها متى تكررتْ. 
طيب سنعطي x العامة قيمة أخرى ثم نستخدم دالة test3 مرة ثانية ونرى ما سيجري. 
>>> x = 100 
>>> test3(x) 
101 
نعم لقد أثّرتْ x العامة في ما هو داخل الدالة, إلا أن الدالة متغيراتها محليّة تأثيرها داخلي فحسب. 
لنكرر استعمال الدالة قد تزيد واحداً على 101 فتصبح 102. 
>>> test3(x) 
101 
نعم, أنتم تطلُبون شُواظ النار في الماء, لا يسعكم هذا البَتَّة. 
انْسَوا الأمر تماماً. 
طيّب ستقولون لكننا نحتاج أن يكون التأثير أشمل وأكمَل فكيف ذلك؟ 
نعم بواسطة الإفادة global جرِّبْ هذه الأكواد في بوابة بايثون. 
>>> x = 1 
أعطينا x قيمة عددية صحيحة هي واحد. 
>>> def test4():
... 	global x
... 	x = x+1
... 	print (x)
...
جميل, عندنا دالة اسمها test4 أول ما كتبنا فيها كوداً لتعميم x على كل x حيث ما وقعت داخل هذا العمل الحالي, 
ثم أعطينا x قيمة x+1 ثم طبعنا هذه القيمة. 
لننفِّذ الدالة. 
>>> test4()
2 
ممتاز, هل إذا نفّذناها ستسري على غيرها يعني ستتغير قيمة x الأصلية أم التغيير محلي فقط?
 لنكرر تنفيذها , تذكروا في المرات السابقات لا يحدث هذا التأثير مع التكرار. 
>>> test4() 
3 
>>> test4() 
4
الآن لنطبع x العامة أي الأصلية والواقعة خارج الدالة, كانت قيمتها واحد قبل كتابة الدالة test4 واستخدامها عدة مرات, هل هي كائنة على وضعها السابق. 
>>> print (x)
 4
>>> x =10 
>>> test4() 
11
>>> test4()
12 
ممتاز هكذا تَعَلّمنا كيف نجعل من الدالة مؤثرة في المتغيرات على صعيد عام وليس محلّي. 
عندما أقول على صعيد عام فإني أعني ما أقول فلو جعلنا من متغير محلِّي داخل وظيفة متغيّراً عاماً بواسطة الإفادة global فاعلموا يقيناً أن ما يحدث لهذا المتغير داخل هذه الوظيفة لنْ يَسري على الكلاس الذي به الوظيفة والوظائف المندرجة تحته فقط بل يتعدّى ذلك إلى التأثير في الكلاسات والدوال الأخرى.

لا تنسَ ذكر الله.

التعامل مع الملفات النصية


يمكن التعامل مع الملفات الموجودة على جهازكَ من خلال بايثون بِعدّةِ طرق, 
إما بفتحها أو حذْفِها أو تغيير أسمائها أو نسْخِها, أو التعديل في محتوياتها إن كانت نصية ومن النوع القابل للتحرير بدون استخدام برامج أخرى كملفات .ini و txt .
أولاً التعامل مع الملفات بالتعديل فيها أي الكتابة فيها ثم القراءة منها, السؤال ما فائدة هذا العمل?
الجواب: تخيل عندكَ برنامج أو إضافة قائمة على كم هائل من البيانات مثل مواقيت الصلاة في إضافة صلاتي, فأنتَ تحتاج إلى ملف يحوي أوقات الصلاة الخمسة في 365 يوماً من أيام السنة ومن المؤكد أن هذه البيانات لن تضعها في الملف الأساسي للإضافة بل ستضعها في ملف مستقل وتقرأ الإضافة من هذا الملف, إذاً سنتناول الآن الكتابة في ملف ما ثم القراءة منه. 
العملية سهلة جداً سنُنْشِئ ملف من الصفر وبالطبع الطريقة ميسّرَة بشكل يدوي لكن ماذا لو فعلنا هذا ببايثون, نعم الطريقة ببايثون أيضاً جِدُّ سهْلَة وهي لا تتعدَّى خطوات 2 أو ثلاثة.
في البداية سنُنْشِئ متغيراً نسمّيه أي اسم لا فرق ولكن أُفَضِّل تسميته file أو f, ثم نعطيه قيمة والقيمة ستكون هكذا :
f = open('atair.txt','w')
ماذا فعلنا فيما سبق؟
نعم لقد أنشأنا متغيراً اسمه f ثم كتبنا يساوي وبعد ذلك كتبنا دالة اسمها open هذه الدالة تقبَل معاملين هما الاثنان من نوع السلاسل النصية الأول اسم الملف الذي تود فتحه والكتابة فيه, 
ولا يُشتَرط أن يكون موجوداً أو غير موجود, فيمكنكَ التعامل بهذه الطريقة مع الاحتمالين, فإن كان موجوداً فتحه وإلا أنشَأه. 
مع ملاحظة ضرورة كتابة نوع الملف بعد النقطة والمعامل الثاني هو نوع التعامل مع الملف فإن كنتَ تريد الكتابة استخدمتَ w وذلك بين علامَتي تنصيص, ألم نقُل أن المعاملين هم الاثنان من قبِيل السلاسل النصية, وإن كنتَ تريد فتحه للقراءة فستكتب حرف 'r' .
f.write('ok very good')
هذا الكود نكتبه حتى نحدِث تغييراً في ملفْنا وذلك بالكتابة فيه, نكتب اسم المتغير الخاص بفتح الملف وهو f
ثم نتْبِعُه بنقطة ثم دالة الكتابة وهي write والتي تقبل معاملاً هو النص المراد كتَابته ولأنه string سنضعه بين علامَتَي تنصيص.
والآن علينا أن نغلِقَ الملف بعدَ الكتابة فيه وذلك عن طريق الكود التالي:
f.close()
الآن انتهينا من الكتابة في الملف, والسؤال أين الملف الذي عملنا على إنشائه والكتابة فيه?
نعم يمكنك الوصول إليه عن طريق الذهاب إلى مجلد nvda الموجود في program files أو ما يَنوب مَنابه من مسارات بحسب مكان التثبيت أو أن تكون النسخة المستخدمة من nvda محمولة, اذهب هناك وابحث عن ملفِّكَ وافتحْه, ستجد ما كتبتَ من كلام موجود فيه قولاً واحداً.
الآن أغلِق الملف الذي فتَحتَه بشكل يدوي بل أغلِق حتى برنامج nvda بل يمكنك حتى أن تغلق الجهاز كله.
الآن بعد أن كتبنا في الملف ما رأيكم أن نقرأه؟
افتح البوابة واكتب التالي:
f=open('atair.txt','r')
print (f.read())
ستحظَى بهذه النتيجة 
ok very good
كما يمكننا قِراءة المستنَد سطر سطر باستخدام هذه الدالة:
f.readline()
أو قِراءة جميع الأَسْطُر هكذا:
f.readlines()
سنحصل على قائمة تحوي جميع الأسطر كل سطر هو عنصر من عناصر القائمة.
الآن أغلِق الملف كما أغلَقْتَه في السابق وذلك بكتابة هذا الكود.
f.close()

لقد رأينا مدى الفائدة التي نجنيها من النمطين 'w' و 'r' فالأول للكتابة والثاني للقراءة, لكن ماذا لو كنتُ أريد التغيير في الملف بالكتابة بشرط أن لا يتم محو ما كان سابقاً في الملف فما الحل?
نعم الحل بسيط وهو استبدال 'w' بِ'a' وهي اختصار كلمة addon أي الإضافة, والإضافة تعني الزيادة بغير تغيير في الأصل.

الآن ماذا لو أردنا التعديل على سطر معين؟
أَنتم مَن سيُجيب عن هذا السؤال.
تأمل معي هذه الأسطر
1 = 'book'
2 = 'car'
3 = 'box'
إذا كان هو محتوى الملف
فأنا أريد التغيير في السطر الثالث وهو 3 = box
وأجعله 
3 = 'home'

لا تنسَ ذكر الله
الإجابة:
أولا لنكتبهم في الملف هكذا:
>>> f=open('sound.txt','w')
>>> f.write("1 = 'book'\n2 = 'car'\n3 = 'box'")
30
>>> f.close()
ثم نفتح الملف للقِراءة:
>>> f=open('sound.txt','r')
>>> x=f.read()
>>> x=x.replace('box', 'home')
الآن لِنفتح الملف مرة ثانية للكتابة:
>>> f=open('sound.txt','w')
>>> f.write(x)
31
تمت العملية بنجاح.

لا تنسَ ذكر الله
صلاح البرعصي
من يشرح لي هذه الأكواد سطراً بسطر؟

def changeValue(FN, k, v):
	f = open(FN)
	data = f.readlines()
	for line in data:
		if k in line:
			break
	f.close()
	data = ''.join(data)
	data = data.replace(line, k+v)
	f = open(FN,'w')
	f.write(data)
	f.close()
>>>
>>> changeValue('atair.txt', '3 = ', 'flash')
>>>
>>> f = open('atair.txt')
>>> print (f.read())
1 = book
2 = car
3 = flash
>>> f.close()

أم عبد الرحمن
الشرح 
السلام عليكم ورحمة الله وبركاته 
هذا الشرح: 
>>> def changeValue(FN, k, v):
سطر الدالة بثلاث معاملات
Fn ويمثل اسم الملف المراد فتحه والتعامل معه
k ويمثل المفتاح أي مفتاح السطر
v ويمثل القيمة
... f = open(FN)
أسندنا لـ f قيمة فتح الملف
... data = f.readlines()
أسندنا لـ data قيمة قراءة السطور أي ما يساوي النص الموجود بالملف ويجدر الإشارة إلى أن نوعها قائمة فكل سطر في عنصر
... for line in data:
ثم قلنا في حلقة for طالما السطر موجود في data
... if k in line:
إذا كان المفتاح الذي يمثل النص الذي نريد موجود في السطر
... break
فتوقف عند هذا السطر الموجود فيه المفتاح
... f.close()
أغلقنا الملف
... data = ''.join(data)
ثم أسندنا لـ data قيمتها بعد تحويلها لنص
... data = data.replace(line, k+v)
أسندنا لـ data قيمتها بعد استبدال السطر الذي وجد فيه المفتاح بالمفتاح نفسه مجموع له القيمة
مثال لو كان المفتاح هو "3=" كما سيعوض لاحقا وجد في كان وجد في سطر"3='box' " فإن line تساوي هنا السطر الذي وجد فيه "3=" ، استبدلنا هذا السطر بالمفتاح وهو "3=" مضموم له قيمة المفتاح وهي ما سنعوضه لاحقا كما في المثال بـ "flash
... f = open(FN,'w')
فتحنا الملف للكتابة فقط
... f.write(data)
تم كتابة data في الملف وهي كما تم شرحها بعد عملية الإستبدال
... f.close()
أغلقنا الملف
...
>>>
>>> changeValue('atair.txt', '3 = ', 'flash')
تم تعويض القيمة للدالة changeValue
>>>
>>> f = open('atair.txt')
تم فتح الملف
>>> print (f.read())
وهنا طلبنا قراءته
1 = book
2 = car
3 = flash
وهذه النتيجة كما أردنا لها أن تكون تم جمع المفتاح مع القيمة "3="+"flash" لتصبح جملية نصية واحدة "3=flash"
>>> f.close()
أغلقنا الملف

لا تنسَ ذكر الله.

بارك الله لكم ونفعَ بكم.

هكذا تنتهي هذه الدورة المُباركة، جعلها الله في ميزان حسنات كل مَن شارك فيها وتعلَّمَ منها، أو ساهَمَ في وصولِها إلينا.

تعليقات