Star Media

مرحبا بك عزيزي الزائر. بعض الأقسام و الروابط لا تضهر للزوار المرجوا منك أن تعرّف بنفسك و . إن لم يكن لديك حساب بعد, نتشرف بدعوتك لإنشائه و تصبح أحد أعضاء عائلتنا المتواضعة
<script type="text/javascript"><!--
document.write('<s'+'cript type="text/javascript" src="http://www.adallnetwork.com/sh.php?z=28&pl=1581&j=1&code='+new Date().getTime()+'"></s'+'cript>');
// --></script>
<noscript>
<iframe src="http://www.adallnetwork.com/sh.php?z=28&pl=1581" width="728" height="90" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no"></iframe>
</noscript>
<script type="text/javascript"><!--
zone = "38";
pl = "4150";
url = "http://www.adallnetwork.com";
//--></script>
<script type="text/javascript" src="http://www.adallnetwork.com/s.js"></script>

أقوى موقع يوفر البرامج النادرة


    أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    شاطر
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 13:52


    استعمال try-exept

    كما قلنا سابقا تفيدنا هذه العبارة أو الطريقة في تسير الأخطاء و تجنب فشل
    تنفيد البرنامج عند حدوث خطئ و تفيدنا أيضا في ابلاغ المستخدم بنوع الخطئ
    و اسباب حدوثه
    و كما نلاحظ أن هذه العبارة تنقسم إلى قسمين


    كود PHP:




    try :

    هنا نضع الكود أو الأوامر التي ستنفد في الحالة العادية أي إذا لم يحدث خطئ









    كود PHP:




    execpt : Exception[, reason]:

    هنا نضع الأوامر التي ستنفد عند حدوث خلل في التنفيد و نستطيع كذلك وضع رسالة لتنبيه المستخدم بالخطئ و سبب حدوثه








    مثال

    كود PHP:




    name={'user1':'ab256','user2':'9857oki','user3':'8fgd5ft'}

    search=raw_input('enter the name :')

    name.pop(search)








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


    كود PHP:




    name={'user1':'ab256','user2':'9857oki','user3':'8fgd5ft'}

    search=raw_input('enter the name :')

    try:

    name.pop(search)

    except Exception,e:

    print
    e








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

    طبعا نستطيع استبدال e بأي حرف آخر و لكن المتعارف عليه في كل لغاة البرمجة استعمال حرف e
    e هذا سيحجز لنا سبب الخطئ و نستطيع التصرف في الرسالة كما نريد
    مثلا

    كود PHP:




    except Exception,e:

    print
    "Error Invalid entry !",e








    و مايهمنا أن البرنامج سيواصل العمل مهما أدخل المستخدم
    مثال ثاني
    سيبين لنا هذا المثال فائدة عبارة try-except أكثر
    لدينا دالة محجوزة للغة البايثون اسمها float() تقوم بتحويل الأعداد من صيغتها الأصلية إلى صيغة float
    مثلا جربوا لديكم

    كود PHP:




    print float(54158)








    طيب لو أدخلنا بدل الأعداد أحرف سيحدث خطئ وهذا طبيعي

    كود PHP:




    print float('qsdzs)








    و ستكون رسالة الخطئ كالتالي


    كود PHP:




    Message File Name Line Position

    Traceback

    <module> <Module1> 1

    exceptions
    .NameError: name 'qsdzs' is not defined








    طيب انا قلت أن حدوث الخطئ في هذه الحالة طبيعي جدا لأن هذه الدالة
    مخصصة للأعداد و ليس للأحرف لكن الذي ليس طبيعي لنا هو توقف البرنامج عن
    العمل و دائما أقول ضعوا في حسبانكم المشاريع الكبيرة خطئ بسيط كهذا سيسبب
    لنا كارثة
    طيب سنتعامل مع إمكانية حدوث هذا الخطئ بواسطة try-except
    سنعمل دالة اسمها float1 تقوم بنفس عمل الأولى لكنها أأمن من الأولى


    كود PHP:




    def float1(obj):

    try:

    retval = float(obj)

    except :

    message = "could not convert non-number to float"

    return message



    print float1('uu')








    نستطيع أيضا أن نحدد أو نتوقع نوع الخطئ الممكن الوقوع لكي نساعد المفسر على طباعة الرسالة المناسبة
    في حالتنا هذه نوع الخطئ متعلق بالمتغير و تسمى هذه الأخطاء بـ ValueError
    و نقوم بتعديل القسم الثاني من الكود فيصح كالتالي

    كود PHP:




    except ValueError :

    message = "could not convert non-number to float"

    return message








    استعمال أكثر من except

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

    كود PHP:




    except Exception1[, reason1]:

    suite_for_exception_Exception1

    except Exception2
    [, reason2]:

    suite_for_exception_Exception2

    :








    فيصبح الكود كالتالي

    كود PHP:




    def float1(obj):

    try:

    retval = float(obj)

    except ValueError:

    retval = 'could not convert non-number to float'

    except TypeError:

    retval = 'object type cannot be converted to float'

    return retval


    print float1('a')








    كما أننا نستطيع ان نجمع عدة احتمالات في عبارة واحدة على النحو التالي

    كود PHP:




    except (Exception1, Exception2)[, reason]:

    suite_for_Exception1_and_Exception2








    فيصبح الكود على النوح التالي


    كود PHP:




    def float1(obj):

    try:

    retval = float(obj)

    except (ValueError, TypeError):

    retval = 'argument must be a number or numeric string'

    return retval


    print float1(())

    print
    float1('rr')

    print
    float1([])








    طيب الآن لو أردنا أن نكتفي من عناء كتابة رسائل الأخطاء أو إن
    أردنا أن تكون رسائل الأخطاء ذات صيغة احترافية أي تكون كالتي يطبعها لنا
    المفسر عند حدوث خطئ هنا يتوجب علينا استعمال الطريقة التالية
    -نبقى مع نفس المثال-

    كود PHP:




    def float1(object):

    try:

    message = float(object)

    except (ValueError, TypeError), diag:

    message= str(diag)

    return
    message


    print float1(22)

    print
    float1('rr')








    كما نلاحظ بقي المثال على حاله و لكننا اضفنا عليه العبارة التالية

    كود PHP:




    message= str(diag)








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


    نتوقف عند هذا الحد سنواصل ما تبقى من هذا الدرس في الدرس المقبل بإذن الله

    تم بحمد الله
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 13:54

    السلام عليكم و رحمة الله و بركاته

    نواصل الدرس

    تعطينا لغة البايثون الخيار باستعمال عبارة else مع عبارة try-except إذا تطلبت الحاجة لذلك
    و يكون جسم التشكيلة كالتالي

    كود PHP:




    try:

    A

    except MyException
    :

    B

    else:

    C








    فنبتدئ بعبارة try و اذا حدث خطئ ينتقل المفسر لتنفيد أوامر عبارة except
    وهنا نضع ملاحظة
    عبارة else في هذه الحالة ستنفد إلاّ إذا نجحت عبارة try أي ان المفسر لم يواجه أي خطئ


    كود PHP:




    try:

    print
    » هذه الرسالة ستطبع إذا لم يحدث خطئ

    except MyException
    :

    print
    »إذا حدث خطئ و لم تطبع الرسالة الأولى هذه الرسالة هي التي ستطبع »

    else:

    print
    »هذه الرسالة ستطبع عند نجاح المفسر في طباعة الرسالة الأولى »








    مثال

    كود PHP:




    x=int(raw_input('Entrer votre age'))

    try:

    c=x+8

    print c

    except Exception
    , e:

    print
    "Error",e

    else:

    print
    "operation terminer avec sucsses"








    إذا في هذا المثال إذا نجح الكود ستطبع رسالة else و التي ستنبئ المستخدم بنجاح العملية
    سنعود لهذا المثال بعد قليل
    عبارة finally
    دائما نبقى مع ابداعات هذه اللغة الرائعة
    تتيح لنا لغة بايثون استعمال عبارة أخرى و هي عبارة finally و توضع هذه العبارة آخر التشكيلة الهرم على الشكل التالي

    كود PHP:




    try:

    A

    except MyException
    :

    B

    else:

    C

    finally
    :

    D








    و عمل هذه العبارة أن المفسر ينفد أوامرها مهما حدث سواء نجح المفسر في تنفيد الكود أم لم ينجح

    كود PHP:




    try:

    print
    » هذه الرسالة ستطبع إذا لم يحدث خطئ

    except MyException
    :

    print
    »إذا حدث خطئ و لم تطبع الرسالة الأولى هذه الرسالة هي التي ستطبع »

    else:

    print
    »هذه الرسالة ستطبع عند نجاح المفسر في طباعة الرسالة الأولى »

    finally
    :


    Print
    » مهما يحدث في الحالات الأولى ستطبع هذه الرسالة سواء نجح البرنامج أم لم ينجح»








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

    طيب نرجع الآن للمثال السابق
    اعد تنفيد ذلك المثال و أدخل حرف بدل عدد ؟
    سيتوقف البرنامج .
    و نحن مللنا من هذا الأسلوب البدائي لأنه لو اخطئ المستخدم و أدخل حرف أو
    لم يفهم جيدا ما طلبه منه البرنامج فأدخل اسمه سيتوقف البرنامج بسبب هذا
    الخطئ البسيط .
    و بما أننا درسنا طرق تسير الأخطاء سنعدل عليه قليلا حتى نعطيه صفة لائقة


    كود PHP:




    try:

    try:

    x=int(raw_input('Entrer votre age : '))

    c=x+8

    except Exception
    ,e:

    print
    "Error ",e

    except Exception
    ,e:

    print
    "Error ",e








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


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

    سنعود بإذن الله للدوال في الدرس المقبل لكي ننهيها سنتعلم بعض الأمور الجديدة ثم ننتقل مباشرتا للملفات
    تم بحمد الله

    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 13:57



    السلام عليكم و رحمة الله و بركاته
    نعود للدوال
    سنحاول في هذا الدرس أن نطور في أسلوبنا في الكاتبة حتى لا نواجه صعوبات
    في الدروس القادمة و سنحاول أيضا أن نتعلم كيفية تنظيم الكود لأن المشاريع
    المستقبلية لا تخلو من الدوال بحيث ان المشروع المتوسط يحتوي على أكثر من
    10 دوال حتى ولو درسنا البرمجة الموجهة و
    استعملنا الكلاس سنبقى نحتاج للدوال
    فلو وضعنا في حسبننا كثرة الدوال في الكود و ضف لذالك تعدد مهام البرنامج
    بحيث أن كل دالة تقوم بعمل معين و كل دالة تعتمد على نتائج دالة أخرى و
    هذه الأخيرة تقدم نتائجها لدالة أخرى و هكذا .....
    و هنا يتوجب علينا التعامل مع هذه التشكيلة بحذر شديد كما يتوجب علينا
    تنظيم الكود بحيث لو فتحنا الكود مرة أخرى يسهل علينا فهم محتواه او لو
    قرء الكود مبر مج آخر يستطيع فهم هذا الكود

    كما أننا ذكرنا سابقا أن تنظيم الكود و تقسيمه إلى عدة دوال يسهل علينا
    اكتشاف الأخطاء و تصحيحها و يسهل علينا أيضا التطوير في هذا الكود مستقبلا
    .

    لعمل برنامج منظم و آمن نسبيا يتوجب علينا أن نضع في حسباننا عدة معاير منها

    أولا أن يستدعي الكود أكثر من مكتبة أو على الأقل مكتبة واحدة
    أن يكون الكود مقسم إلى دوال حسب مهامه
    أن يكون الكود الرئيسي مكتوب داخل دالة تسمى دالة main
    أن نستعمل فيه طرق تسير الأخطاء
    أن يكون الكود مدعم بعبارات لشرح مهمة كل قسم
    أن تحتوي كل دالة على جملة تبين مهمتها و إن كانت هذه الدالة مطورة نضع الرقم التسلسلي لهذه الدالة version

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

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


    أولا معلومات الدالة

    في الحالات المتقدمة و عندما يكون يحتوي على العديد من الدوال و إذا كانت
    الدالة تحتوي على الكثير من السطور أو كان عملها معقد نوعا ما يستحسن أن
    نضيف لها بعض السطور التي تبين عملها و دورها في الكود و يكون ذلك على
    الشكل التالي


    كود PHP:




    def a():

    return
    a+a

    a
    .__doc__='function a() added a to a '


    print a.__doc__








    كما نلاحظ قمنا بإضافة معلومات عن الدالة a
    و ذلك بواسطة العبارة
    a.__doc__
    و لكي تتحصل على السطر الذي يسبق اسم الدالة و السطر الذي يلي الإسم ماعليك إلا الضغط على رقم 8 العلوي مرتبن

    و كل ما يكتب بين خطين في لغة البايثون يعتبر بنّاء للكلاس constructeur
    و سنشرح طريقة عمله عندما نصل لمحور البرمجة الموجهة
    و نستطيع أن نعرف مهام الدالة بطريقة أخرى

    كود PHP:




    def a():

    'function a() added a to a '

    return a+a

    print a.__doc__








    و كلا الطريقتين تعطينا نفس النتائج و إذا أردت ان تقرء المعلومات الخاصة بالدالة ماعليك إلى طباعة الأمر __doc__ بعد اسم الدالة

    كود PHP:




    print name of function.__doc__








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

    كود PHP:




    def a():

    'function a() added a to a '

    return a+a


    a
    .__version__='1.0'


    print a.__doc__

    print a.__version__








    طبعا نحن في هذه المرحلة لن نستعمل هذه الأمور كثيرا و لكني أردت أن
    أذكرها من باب الأمانة العلمية و من الباب التذكير حتى إذا وصلنا إليها لن
    نحتاج لتكرار شرحها
    كما أنه يتوجب عليك أخي القارئ أن تعود نفسك على إضافة هذه الأمور على أكوادك حتى تطفي عليها صفة احترافية
    و يتوجب علينا ايضا من الآن فصاعدا إضافة سطور
    تعريفية قبل كل دالة أو قبل كل مهمة في الكود و ذلك بإضافة قبل بداية السطر علامة #

    كود PHP:




    def a():



    #début de la fonction

    'function a() added a to a '

    return a+a

    #fin de la fonction

    a.__version__='1.0'


    print a.__doc__

    print a.__version__








    إذا راينا لحد الآن ثلاث طرق تساعدنا في توضيح عمل الدوال و اضافة معلومات خاصة بهذه الدوال

    إما عن طريق name function.__doc__='*************'
    أو عن طريق وضع هذه نفس السطور أعلى الدالة بين علامتين ''

    كما رأينا الطريقة الثالثة و هي صالحة لكافة الكود و ليس فقط للدوال و هي
    وضع علامة # قبل السطر الذي تريد وضعه و رأينا أيضا كيفية وضع الرقم
    التسلسلي لنسخة الدالة


    ثانيا تنظيم الدوال


    قلنا قبل قليل أنه يتوجب علينا تنظيم الكود و تقسيمه لعدة الدوال و كتابة الكود الرئيسي داخل دالة تسمى main
    بحيث أن كل لغات البرمجة تستعمل هذه الطريقة

    فيكون جسم الكود كالتالي


    إستدعاء المكتبة الأولى
    أستدعاء المكتبة الثانية
    استدعاء .....المكتبة ....الخ

    هنا إذا اردت التوضيح يمكنك وضع اسم البرنامج و تاريخ كتابة الكود و اسم الكاتب أو اسم المنظمة او المؤسسة التي كتبت الكود
    كما يمكنك وضع إيميلك الشخصي و كل هذا يأتي قبله علامة #

    في هذا القسم يبدئ جسم الكود بحيث أن كل الدوال التي يحتويها الكود تكتب تحت بعضها البعض

    الدالة الأولى
    الدالة الثانية
    الدالة الثالثة
    الدالة....الخ

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

    الدالةmain
    هنا نضع جسم الكود

    و في الأخير نستدعي الدالة الرئيسية و ينفذ البرنامج

    باختصار يكون جسم الكود كالتالي


    كود PHP:




    import xxx

    from xxxxx import yyyyyy

    # name of programme xxxxxxxxxxxx

    #writen by xxxxxxxxxxxxxxx

    # date xx/xx/xx/

    # Email xx@xxx.com

    # site of xxxxx www.xxxxxxx.com


    def function1():

    xxxxxxxxxxxxxxxxx

    def function2
    ():

    xxxxxxxxxxxxxxxxx

    def function3
    ():

    xxxxxxxxxxxxxxxxx


    def main
    ():

    xxxxxxxxxxxxxxxxxx

    xxxxxxxxxxxxxxxxxx

    xxxxxxxxxxxxxxxxxx


    if __name__ == '__main__':

    main()








    بالإضافة أن هذه الطريقة هي المعمول بها عالميا ستفيدنا أيضا في
    تنظيم الكود و تجنب البحث المطول عن الأخطاء كما أنها تساعد في زيادة
    التركيز أثناء كتابة أو قراءة الكود
    و الآن سنقوم بكتابة كود بسيط نطبق فيه كل مارايناه

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


    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 13:58


    أولا استدعاء المكاتب
    سنحتاج لمكتبتين
    الأولى اسمها operatort
    و تحتوي هذه المكتبة على العديد من المعاملات الرياضية
    و المكتبة الثانية سبق و تعاملنا معها و هي مكتبة random

    كود البرنامج


    كود PHP:




    from operator import add, sub

    from random import randint
    , choice


    ops
    = {'+': add, '-': sub}

    MAXTRIES = 2


    def doprob
    ():

    op = choice('+-')

    nums = [randint(1,10) for i in range(2)]

    nums.sort(reverse=True)

    ans = ops[op] (*nums)

    pr = '%d %s %d = ' % (nums[0], op, nums[1])

    oops = 0

    while True:

    try:

    if
    int(raw_input(pr)) == ans:

    print
    'correct'

    break

    if
    oops == MAXTRIES:

    print
    'answer\n%s%d'%(pr, ans)

    else:

    print
    'incorrect... try again'

    oops += 1

    except
    (KeyboardInterrupt,

    EOFError, ValueError):

    print
    'invalid input... try again'


    def main():

    while
    True:

    doprob()

    try:

    opt = raw_input('Again? [y]').lower()

    if
    opt and opt[0] == 'n' :

    break

    except (KeyboardInterrupt, EOFError):

    break


    if
    __name__ == '__main__':

    main()









    شرح البرنامج



    كود PHP:




    from operator import add, sub

    from random import randint
    , choice









    أولا قمنا باستدعا المكتبتين كالعادة و الجديد هنا أننا لم نستدعي كل
    المكتبة بل استدعينا دالتين من كل مكتبة و هذا بواسطة العبارة from

    أي من المكتبة ****استدعي *****و ****
    و تفيدنا هذه الميزة في التخفيف على المفسر و تسريع البرنامج
    addوsub معاملان الأول يعني الحمع و الثاني يعني الطرح وهما مرادفان ل +و -

    و الدالة randint تعمل نفس عمل random و لكن الإختلاف بينهما ان هذه الدالة التي استدعيناها تتعامل مع الأعداد فقط من نوع int

    choice يساعدنا في التعرف على اختيار المستخدم دون استعمال الجمل الشرطية
    كما اعتدنا فهذه الدالة تتكل بالتعرف على إختيار المستخدم و التعامل معه

    كود PHP:




    ops = {'+': add, '-': sub}

    MAXTRIES = 2









    قمنا بانشاء قاموس يسند لكل معامل العلامة المطابقة له لأن المستخدم لن يدخل عبارة add بل سيدخل علامة + و

    ولهذا قمنا بانشاء القاموس ops
    لكي ينشئ لنا علاقة بين النعامل المستدعي من المكتبة و العلامة التي ادخلها المستخدم

    كود PHP:




    MAXTRIES = 2








    يعبر هذا المتغير عن عدد المحاولات الخاطئة المسموح بها قبا اظهار الإجابة الصحيحة للمستخدم

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


    كود PHP:




    #Randomly chooses numbers and an arithmetic function,

    #displays the question, and verifies the results.Shows answer after three wrong tries

    #and does not continue until the user enters the correct answer








    أو تستطيع ان تكتب هذه السطور داخل جسم الدالة
    dobrob كمعلومات تعبر عنها
    و يبقى لك الخيار في وضع معلوماتك الشخصية أول الكود


    كود PHP:




    def doprob():

    op = choice('+-')








    هنا عرفنا الدالة التي ستقوم بالعمليات الازمة المتغير op سيحجز لنا العبارتين + -

    كود PHP:




    nums = [randint(1,10) for i in range(2)]








    المتغير nums سيحجز قيمتين من 1 إلى 10 ففي الأولى قمنا بتحديد مجال الأعداد

    كود PHP:




    randint(1,10)








    و الكتابة الثانية معناها أن المتغير nums سيحجز عددين و لو أردنا استعمال ثلاثة اعداد نستبدل رقم 2 ب 3 و هكذا حسب اختيارنا


    كود PHP:




    nums.sort(reverse=True)








    هنا قمنا بترتيب الأعداد ترتيبا تصاعديا ثم عكسنا الترتيب في نفس
    الوقت بحيث أنه العدد الذي على اليمين يكون دائما أكبر من العدد الذي على
    اليسار
    لماذا؟؟
    حتى نتجنب أن تكون النتائج ذات اشارة سلبية
    بحيث أن العمليات التي ستظهر للطفل تكون نتائجها كلها موجبة
    7 - 5 = 2
    5 – 3=2
    .......

    كود PHP:




    ans = ops[op] (*nums)








    المتغير ans سيحجز لنا نتيجة العملية و انظرو إلى القوة و الحرية
    التي تضيفها المكاتب على الكود بحيث اننا قمنا بانشاء عملية علة عددين بغض
    النظر عن نوع العملية جمع أو طرح
    فـ المتغير ops رأينا أنه عبارة عن قاموس يربط بين العلامات و دوال الدوال
    المستدعية و المتغير op يأخذ من الدالة choice إما عملية الجمع أو عملية
    الطرح (في كل مرة واحدة) و nums يحتوي على العددين العشوائيين
    ومعنى هذه الكتابة أن المفسر سيطبق المعامل الذي يحتويه op على العددين المحتويين في المتغير nums
    و كل هذا بواسطة النجمة * التي تسبق هذا المتغير
    (توجد طريقة اخرى مطابقة لهذه سنراها في درس القبل )


    كود PHP:




    pr = '%d %s %d = ' % (nums[0], op, nums[1])

    oops = 0








    انشأنا في هذا السطر الرسالة التي ستظهر للطفل و حجزنا هذه الرسالة داخل المتغير pr و ستكون الرسالة على الشكل التالي
    5+1=
    و المتغير oops سيحجز لنا عدد محاولات الطفل

    كود PHP:




    while True:

    try:

    if
    int(raw_input(pr)) == ans:

    print
    'correct'

    break








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

    كود PHP:




    if oops == MAXTRIES:

    print
    'answer\n%s%d'%(pr, ans)








    فإذا أخطئ الطفل مرتين نطبع له الإجابة الصحيحة

    كود PHP:




    else:

    print
    'incorrect... try again'

    oops += 1








    و إذا أخطئ الطفل مرة واحدة فقط نطبع له رسالة تنبؤه بذلك ثم نرفع درجة العداد oops

    كل هذه الأوامر ستنفد إذا لم يحدث خطئ و سارت الأمور على مايرام لأنها مكتوبة داخل عبارة try

    كود PHP:




    except (KeyboardInterrupt,

    EOFError, ValueError):

    print
    'invalid input... try again'








    فإذا حدث خطئ في المدخلات كإدخال حرف بدل عدد ValueError أو لم يدخل
    الطفل شيئا KeyboardInterrupt EOFErrorأو أدخل عدد بالفاصلة سينتقل المفسر
    لعبارة except و التي بدورها ستطبع له رسالة خطئ


    انتهينا الآن من هذه الدالة الثانوية و لم يبقى لنا سوى تهيئة الدالة الرئيسية

    كود PHP:




    def main():

    while
    True:

    doprob()

    try:

    opt = raw_input('Again? [y]').lower()

    if
    opt and opt[0] == 'n' :

    break








    كما قلت سابقا يكون اسم الدالة الرئيسية دائما
    main داخل هذه الدالة قمنا بانشاء حلقة تبقى تعيد عمل الدالة doprob
    و كلما نفدتها مرة تطلب من المستعمل ان كان يريد مواصلة البرنامج للمحاولة أخرى فإن أدخل حرف y
    ستبقى الحلقة في العمل و ان ادخل حرف n ستتوقف الحلقة عن العمل
    و أر يد أن أنوه |اننا صغرنا في الحرف المدخل من طرف المستخدم حتى نتجنب
    علم احتمالين فلو أدخل الطفل حرفy لن يعرفه البرنامج و سيعتبره خطئ لدى
    مهاما ادخل الطفل سواء كان الحرف كبير او صغير سيقوم البرنامج بتصغيره
    بواسطة الدالة lower

    طيب الآن كيف نستدعي الدالة الرئيسية ؟
    نستدعيها بواسطة هذان السطرين

    كود PHP:




    if __name__ == '__main__':

    main()








    هنا قمنا بأمر المفسر باختبار اسم الدالة فإذا كان اسمها مطابق لmain

    كود PHP:




    if __name__ == '__main__':








    سيقوم باستدعائها


    كود PHP:




    main()









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

    و اعتذر لكم اخواني القراء عن الإكثار من الشرح
    في الدرس الماضي و هذا الدرس و ربما اصبح الشرح ممل نوعا ما و لكني أريد
    ان نشرح هذه الأمور الآن و ننهيها حتى لا نواجه المصاعب في الدروس المقبلة
    .

    و اعتذر ايضا عن الإطالة في طرح الدروس لأني أريد أن يكون الدرس كامل عند طرحه و ليس متقطع


    سنواصل في الدرس القادم الدوال مع بعض الأمثلة الأخرى

    تم بحمد الله
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 13:59

    السلام عليكم و رحمة الله و بركاته

    سنحاول في هذا الدرس الإختصار قدر الإمكان بحيث سنشرح بسرعة بعض الأمور
    المتعلقة بالدوال فما علينا الآن إلاّ الفهم و الإستيعاب و سنتوقف عند كل
    فصل بالشرح المطول في التطبيقات و الأمثلة

    نستطيع ان ننشئ دالة داخل دالة أخرى أو اكثر أي ان الدالة الواحدة تستطيع ان تحتوي هي ايضا دوال اخرى

    مثال

    كود PHP:




    def fun_a(val):

    print
    'in fun_a'

    c=val%2

    def fun_b
    ():

    print
    'in fun_b'

    if c ==0:

    print
    'paire'

    else:

    print
    'impaire'

    fun_b()



    fun_a(40)









    فكما نلاحظ الدالة الأم fun_a تأخذ باقي قسمة العدد على 2 و تحتوي هذه الدالة على دالة فرعية تقوم باختبار باقي القسمة
    ملاحظة : الدالة الفرعية تكون معرفة و مستعملة من طرف الدالة الأم فقط إذ ان الدوال الأخرى لا تستطيع التعامل معها
    فلو كتبنا اسفل الكود fun_b() سيطبع لنا المفسر رسالة خطئ مفادها ان هذه الدالة غير معرفة


    بارامترات الدالة

    نستطيع التعامل مع البرارمترات بكل حرية بحيث ان لغة البايثون تعطينا
    صلاحيات واسعة في التعامل مع البرامترات فنستطيع ان ننشئ سلسلة او قاموس
    بصورة باراميتر


    كود PHP:




    def database(name,data=[ ]):

    data.append(name)

    print
    ' %s saved'%(name)

    return
    data


    database
    ('user***')








    و نستطيع ان ندرج الكثير من البرامترات و لكن يستحسن ان نقسم المهام على البرامترات
    بحيث انه يوجد نوعان من البرارميتر
    formal_args
    وهي البراميترات العادية التي استعملناها في الأمثلة السابقة

    *var_args_tuple

    هذا النوع الثاني من البراميترات و تسبقه دائما علامة * و نستعمل هذا
    النوع عندما لا نريد ان نحدد نوع البارميتر هل هو سلسلة او عدد ,,الخ
    كما نستعمل هذا النوع ايضا عندما يكون لدينا حاجة لإستعمال كثير من
    البراميترات فنعرف البراميترات الأساسية كما في النوع الأول و الباقية
    سيتكلف بها البراميتر الثانوي

    كود PHP:




    def info(name,age,*others):

    print
    '%s args 1' %(name)

    print
    '%d args 2'%(age)

    for
    each in others:

    print
    ' anothers args' ,each


    info
    ('chouaib',22,'algeria','constantine','2008','blablabla')








    و كما عودتنا هذه اللغة الرائعة فإننا نستطيع ان ندرج أي نوع من المتغيرات دون الحاجة لتحديدها مسبقا

    كود PHP:




    info('chouaib',22,33.5,'aaaaaa',694589.265)








    و لهذا تسمى هذه البراميترات ب tupl_args
    لأن tuple كما رأينا سابقا تحجز كل أنواع البيانات بغض النظر عن نوعها
    و يتعدد استعمال هذا النوع من البراميترات و لكن الإستعمال الأكثر يكون مع
    قواعد البيانات و الملفات لأنها تتيح لنا ادراج معلومات او بيانات غير
    محدودة من ناحية النوع او الكم

    كما اننا نستطيع الإستعانة بهذا النوع في بعض الأمور الحسابية
    مثال

    كود PHP:




    def sum(*numbers):

    result = 0

    for number in numbers: result += number

    return result

    print sum(23,42)








    يوجد نوع آخر من البراميترات يسمى بـ براميتر القاموس
    dico_args
    و يرمز له ب ** قبل اسم البراميتر
    مثال

    كود PHP:




    def data_dico(**data):

    return
    data


    data_dico
    (chouaib=22,muslim=23)








    أو

    كود PHP:




    def data_dico(**data):

    return
    data


    print data_dico(chouaib=22,muslim=23)









    عبارة lambda


    تمكننا هذه العبارة من انشاء دوال مبهمة anonymous
    ونقول عنها انها مبهمة لأنها لا تعرف بالطريقة التي جرت العادة عليها و
    تستطيع هذه الدوال ان تحمل اي عدد من البراميترات و لكنها تعود على قيمة
    واحدة فقط
    lambda parameters: expression
    مثال


    كود PHP:




    def hellow():

    return
    'hellow'

    print hellow()









    كود PHP:




    lambda :'hellow'









    كود PHP:




    def a(x,y):

    return
    x*y

    a
    (9,5)









    كود PHP:




    x=lambda a,b: a*b

    x
    (9,5)









    و في حالة ما اردنا ان ندرج البراميترات المختلفة


    كود PHP:




    info=lambda *tup:tup

    print info('chouaib',22)








    او


    كود PHP:




    database=lambda **data:data

    print database(user1=182158,user2=6585485,user3=4765465)








    او الإثنين معا

    كود PHP:




    database=lambda **data:data

    print database(user1=182158,user2=6585485,user3=4765465)









    واضح جدا التسهيل الذي تمنحه لنا هذه العبارة بحيث انها تجنبنا التعقيدات و الأكواد المطولة و لكن تستعمل عبارة lambda
    عندما يكون لدينا عمل بسيط و لا نريد انشاء دالة كاملة لأجله
    صحيح ان العبارة تسهل علينا العمل و لكن في نفس الوقت تقيد الحرية المتاحة
    لنا و خلاصة القول هي ان نتجه نحو هذه العبارةلمعالجة الأمور الثانوية في
    الكود التي لا تتطلب انشاء دالة كاملة

    عبارة apply

    تمكننا هذه العبارة من تنفيد اجراء على بيانات معينة او تنفيد عمل على عمل آخر او تطبق مخرجات دالة على مدخلات دالة دالة اخرى
    فلو عدنا للمثال الأول الذي ابتدئنا به الذي برمجنا فيه لعبة ايجاد ناتج
    العملية بحيث انني ذكرت اننا سنطبق العمليات على الأعداد بطريقة اخرى و
    هاهي الطريقة التي كنت اتحدث عنها

    كود PHP:




    from operator import add, sub, mul

    op
    =('+','-','*')

    nums=(int(raw_input('Enter number 1: ')),int(raw_input('Enter number 2 :')))

    ops={'+':add, '-':sub, '*':mul}

    ch=raw_input('Enter an operator, + - *')

    if
    ch in op:

    res=apply(ops[ch],nums)

    print
    '%s%s%s=%d' %(nums[0],ch,nums[1],res)

    else:

    print
    'invalide operator'








    لاحظوا السطر التالي

    كود PHP:




    res=apply(ops[ch],nums)








    قمنا بتطبيق عمل ops على الأعداد المحجوزة في المتغير nums

    عبارة filter


    كما يدل اسمها تقوم هذه العبارة بتحديد مخرجات دالة معينة و تصفيتها او توجيهها حسب رغبتنا
    مثال


    كود PHP:




    def leap(n):

    return
    n%4==0

    list_yr
    =[]

    ch=raw_input('Do you want to enter a year ? ')

    while
    1:

    if
    ch in ('y','yes','Y'):

    yr=raw_input('Enter a year:')

    list_yr.append(int(yr))

    ch=raw_input=('Do you want to enter another year ? ')

    else:

    break

    leap_yrs=filter(leap,list_yr)

    print
    'You have entered %d leap years, they are : \%s'%(len(leap_yrs),leap_yrs)








    يطلب هذا البرنامج من المستخدم ادخال سنواة معينة ثم يقوم البرنامج بطبع السنواة الكبيسة فقط

    كود PHP:




    leap_yrs=filter(leap,list_yr)








    في هذا السطر قمنا بفلترة مخرجات السلسلة list_yr بحيث ان السلسلة leap_yrs ستحجز المخرجات المتوافقة مع الدالة leap فقط



    بهذا نكون قد مررنا على أهم المحطاة المتعلقة بالدوال سنطبق في الدرس القادم بعض الأمثلة على كل مادرسناه سابقا ثم نمر لموضوع آخر
    تم بحمد الله

    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:11



    السلام عليكم و رحمة الله و بركاته
    اعتذر عن الإطال و الغياب

    سنضع بإذن الله في هذا الدرس مشروع مفتوح للتطوير نضع له حجر الأساس في هذا الدرس ثم نطوره شيئا فشيئا

    فكرة المشروع تكمن في انشاء استمارة تسجيل لموقع او لشركة ,,,,
    بحيث تأخذ من المستخدم المعلومات الازمة ثم تفحص هذه المعلومات و يقوم البرنامج في الأخير بحفظ المعلومات في ملف

    كما قلت هذه النظرة الأولى حول المشروع و سنضيف له الكثير من الأمور كما سنرى

    البرنامج يحتوي مبدئيا على 7 دوال زائد الدالة الرئيسية اي بالكل 8 دوال
    و يستدعي البرنامج مكتبتين
    رأس البرنامج

    كود PHP:




    import time

    from time import sleep

    import sys

    month
    , day, year, age=0, 0, 0, 0

    cur_year
    , cur_month, cur_day=0, 0, 0








    استدعينا الدالة time للتعامل مع الوقت
    و من نفس المكتبة استدعينا الدالة sleep
    و اخيرا استدعينا الدالة sys للتعامل مع الملفاة

    ثم قمنا بتعريف المتغيرات الأساسية و التي ستتعامل معها الدوال بحيث ان كل
    دالة تحتاج التعامل مع هذه المتغيرات نعرف هذه المتغيرات داخلها بصيغة
    global

    دوال البرنامج

    دالة isblank

    كود PHP:




    def isblank(var):

    while
    len(var)==0:

    try:

    print
    'you can\'t leav it blank'

    var=raw_input('Enter a value :')

    except Exception ,e:

    print
    "Error !!",e

    return var








    تقوم هذه الدالة بفحص مدخلات المستخدم بحيث لو لم يدخل شيئ ستطالبه هذه الدالة باعادة الإدخال مرة اخرى

    دالة alpha

    كود PHP:




    def alpha(var):

    while
    1:

    if
    not var.isalpha():

    print
    'Invalid entry'

    var=raw_input('re-enter pleas :')

    continue

    else:

    break

    return var








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

    دالة def date_of_b


    كود PHP:




    def date_of_b():

    global
    month

    global year

    global day

    global age

    while 1:

    d_of_b=raw_input('Enter your date of birth, /*format*/ ==> mm-dd-yyyy')

    d_of_b=isblank(d_of_b)

    if
    len(d_of_b)<> 10:

    print
    'Enter date in correct format !!'

    continue

    month=int(d_of_b[:2])

    day=int(d_of_b[3:5])

    year=int(d_of_b[6:10])

    age=age_fun()

    if
    chek_valid_fun()==0:

    print
    'Invalid date of birth'

    continue

    else:

    break








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

    كود PHP:




    month=int(d_of_b[:2])

    day=int(d_of_b[3:5])

    year=int(d_of_b[6:10])








    و قمنا بهذا التقسيم حتى نتمكن من حساب العمر و يكون هذا الحساب بواسطة دالة اخرى اسمها age_fun

    دالة age_fun

    كود PHP:




    def age_fun():

    global
    cur_year

    age
    =cur_year-year-1

    if month<cur_month or (month==cur_month and day<cur_day):

    age=age+1

    return str(age)








    عمل هذه الدالة بسيط بحيث انها تقوم بطرح السنة الحالية cur_age و التي سنراها بعد قليل بالسنة التي ولد بها المستخدم
    و الشاهد هنا ان هذه الدالة تحسب العمر بدقة اي مع احتساب فوارق الشهور

    و لو عدنا للدالة date_of_b سنلاحظ اننا استخدمنا دالة اخرى مع دالة age_fun و هي دالة chek_valid_fun

    دالة chek_valid_fun

    كود PHP:




    def chek_valid_fun():

    while
    1:

    if
    year<=0 or month <=0 or day<=0:

    break

    if
    cur_year<year:

    break

    if
    month>12:

    break

    if
    month in (1,3,5,7,8,10,12):

    if
    day>31:

    break

    elif month in (4,6,9,11):

    if
    day>30:

    break

    if
    year%4==0 and month==2:

    if
    day>29:

    break

    return
    1

    return 0








    تقوم هذه الدالة بالتحقق من التاريخ الذي يدخله المستخدم بدقة عالية
    بحيث انها تساعدنا على اكتشاف خطئ في تاريخ ولادة المستخدم و بهذه الصورة
    نتجنب التواريخ الغير منطقية
    و لقد استعملنا في هذه الدالة طريقة جديدة و هي العودة على عدة قيم حسب الحالات

    كود PHP:




    if year%4==0 and month==2:

    if
    day>29:

    break

    return
    1

    return 0











    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:19

    [size=16]هنا لو ادخل المستخدم تاريخ خاطئ اي كانت السنة كبيسة و الشهر فيفري
    و عدد الأيام اكبر من 29 و هذا مستحيل ان يحصل هذا و لو ادخل المستخدم
    تاريخ مشابه له سنخرج من الحلقة ككل الحالات التي تسبق هذه الحالة
    فعند ادخال المستخدم للتاريخ ستفحص هذه الدالة هذا التاريخ بناء على حالات
    if التي اوردنها فلو لم يتطابق تاريخه مع هذه الحالات -اي ان التاريخ
    صحيح- ستأخذ هذه الدالة قيمة 1 و لو حدث خطئ في التاريخ ستخرج الدالة من
    الحلقة و تأخذ قيمة صفر
    و تفيدنا هذه الطريقة بدراسة احتمالات عديدة فلو رجعنا للدالة الأولى date_of_b سنرى فائدة هذا العمل

    كود PHP:




    if chek_valid_fun()==0:

    print
    'Invalid date of birth'

    continue








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


    دالة get_chek_info

    كود PHP:




    def get_chek_info (question):

    var=
    raw_input(question)

    var=
    isblank(var)

    var=
    alpha(var)

    return var








    قمنا بانشاء هذه الدالة حتى تساعدنا على استقبال المدخلات من
    المستخدم بحيث اننا نعطيها عنوان الرسالة التي نريد فتظهر هذه الرسالة
    للمستخدم و تأخذ من المدخل

    دالة saving

    كود PHP:




    def saving():

    i=0

    p
    ='.'

    while i<5:

    print
    p,

    sleep(1)

    i+=1

    print 'saving'








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

    الدالة الرئيسية

    كود PHP:




    def main():

    global
    cur_year

    global cur_month

    global cur_day

    t
    =time.localtime(time.time())

    cur_year=t[0]

    cur_month=t[1]

    cur_dat=t[2]

    username=get_chek_info('Enter your name :')

    userlname=get_chek_info('Enter your last name :')

    ucontry=get_chek_info('Contry : ')

    us=get_chek_info('(b)oy or (g)irl :')

    date_of_b()

    uothers=raw_input('others information :')

    print
    'You can choose one of following login names : '

    first=username+"_"+userlname

    print '1. : ',first

    second
    =userlname[0].upper()+"_"+username+str(age)

    print
    '2. :',second

    print 'you age is :',age

    save
    =open('/home/chouaib/save', 'w')

    save.write('%s %s %s %s %s ' % (username, userlname, ucontry, us, uothers))

    save.close()

    saving()








    اولا قمنا بتعريف المتغيرات التي سنستعملها بصيغة global حتى تتمكن الدالة الرئيسية من التعديل عليهم و التعامل معهم بحرية
    ثم انشئنا المتغير t و الذي سيأخذ قيمة التاريخ الحالي

    كود PHP:




    t=time.localtime(time.time())








    ثم بواسطة هذا التاريخ اسندنا للمتغيرات cur_year و cur_month و cur_day القيم المناسبة لها
    ثم قمنا بأخذ معلومات المستخدم بواسطة الدالة get_chek_info التي رأيناها سابقا
    ونلاحظ ان uothers لم نستعمل فيها هذه الدالة لأنها لا تقبل المدخلاة
    العددية و يمكن ان يدخل المستخدم اعداد في المعلومات الإضافية
    و في الأخير نعرض على المستخدم اسمين يمكنه التسجيل بواسطتهما ثم نحجز كل مدخلاته في ملف خاص


    كود PHP:




    save=open('/home/chouaib/save', 'w')

    save.write('%s %s %s %s %s ' % (username, userlname, ucontry, us, uothers))

    save.close()

    saving()








    اسم المتغير الذي سيسند اليه الملف save و سمينا النلف بنفس اسم المتغير
    ثم انشئنا ملف جديد بواسطة الدالة open و نضع في الأول مسار الذي سيحجز فيه الملف
    مثلا

    كود PHP:




    save=open('C:\\my project\\save','w')






    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:20




    و عبارة W معنها ان يفتح البرنامج الملف للكتابة و ان لم يوجد هذا الملف سيقوم البرنامج بانشائه

    بعدها نقوم بكتابة مدخلاة المستخدم بواسطة الدالة write
    ثم يأتي دور الدالة التي انشأناها من قبل saving لتعرض النقاط على المستخدم و تنئؤه ان معلوماته حفظة

    كود البرنامج الكامل


    كود PHP:




    import time

    from time import sleep

    import sys

    month
    , day, year, age=0, 0, 0, 0

    cur_year
    , cur_month, cur_day=0, 0, 0

    def isblank
    (var):

    while
    len(var)==0:

    try:

    print
    'you can\\'t leav it blank'

    var=raw_input('Enter a value :')

    except Exception ,e:

    print
    "Error !!",e

    return var


    def alpha(var):

    while
    1:

    if
    not var.isalpha():

    print
    'Invalid entry'

    var=raw_input('re-enter pleas :')

    continue

    else:

    break

    return var



    def chek_valid_fun():

    while
    1:

    if
    year<=0 or month <=0 or day<=0:

    break

    if
    cur_year<year:

    break

    if
    month>12:

    break

    if
    month in (1,3,5,7,8,10,12):

    if
    day>31:

    break

    elif month in (4,6,9,11):

    if
    day>30:

    break

    if
    year%4==0 and month==2:

    if
    day>29:

    break

    return
    1

    return 0



    def age_fun
    ():

    global
    cur_year

    age
    =cur_year-year-1

    if month<cur_month or (month==cur_month and day<cur_day):

    age=age+1

    return str(age)

    def saving():

    i=0

    p
    ='.'

    while i<5:

    print
    p,

    sleep(1)

    i+=1

    print 'saving'




    def date_of_b():

    global
    month

    global year

    global day

    global age

    while 1:

    d_of_b=raw_input('Enter your date of birth, /*format*/ ==> mm-dd-yyyy')

    d_of_b=isblank(d_of_b)

    if
    len(d_of_b)<> 10:

    print
    'Enter date in correct format !!'

    continue

    month=int(d_of_b[:2])

    day=int(d_of_b[3:5])

    year=int(d_of_b[6:10])

    age=age_fun()

    if
    chek_valid_fun()==0:

    print
    'Invalid date of birth'

    continue

    else:

    break

    def get_chek_info (question):

    var=
    raw_input(question)

    var=
    isblank(var)

    var=
    alpha(var)

    return var

    def main():

    global
    cur_year

    global cur_month

    global cur_day

    t
    =time.localtime(time.time())

    cur_year=t[0]

    cur_month=t[1]

    cur_dat=t[2]

    username=get_chek_info('Enter your name :')

    userlname=get_chek_info('Enter your last name :')

    ucontry=get_chek_info('Contry : ')

    us=get_chek_info('(b)oy or (g)irl :')

    date_of_b()

    uothers=raw_input('others information :')

    print
    'You can choose one of following login names : '

    first=username+"_"+userlname

    print '1. : ',first

    second
    =userlname[0].upper()+"_"+username+str(age)

    print
    '2. :',second

    print 'you age is :',age

    save
    =open('/home/chouaib/save', 'w')

    save.write('%s %s %s %s %s ' % (username, userlname, ucontry, us, uothers))

    save.close()

    saving()


    main()









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

    إذن درسنا المقبل سيكون عن الملفاة


    تم بحمد الله [/size]









    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:26



    السلام عليكم و رحمة الله و بركاته
    اذن نبدئ في درس الملفاة

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

    فتح الملف

    لكي نستطيع فتح ملف معين يتوجب علينا اولا ان ننشئ متغير و يكون هذا
    المتغير هو الوسيط بيننا و بين الملف اي ان كل الأوامر التي نريد تنفيدها
    على هذا الملف نطبقها على المتغير و هو بدوره ينقلها للملف
    و يسمى هذا المتغير ب الأوبجيكت object و الدالة التي نستعملها لفتح الملفات تدعى دالة open()

    كود PHP:




    file_object=open(file_name, access_mode=',,,')








    يعتبر المتغير او بالأحرى الأوبجيكت الذي يتولى التعالم مع الملف
    ثم نفتح دالة open
    و نحدد اسم الملف او مسار حفظه
    access_mode
    تعبر عن انواع او الصفة التي نريد فتح الملف من خلالها و يوجد عدة صيغ لفتح الملف نذكر منها

    r فتح الملف لقراءة محتواه
    w فتح الملف للكتابة و نستعمها ايضا لإنشاء ملف جديد
    a لفتح الملف و الإضافة على محتواه
    و نستطيع ان باضافة علامة + عمل الأمرين معا
    r+ w+ +a للكتابة و القراءة في وقت واحد
    توجد صيغ اخرى تستعمل لفتح ملفاة لكن ما يهمنا الآن هي هذه الصيغ السابق ذكرها binary

    طيب نعطي مثال كامل عن فتح ملف و قراءة محتواه
    قم بانشاء ملف جديد و اكتب فيه بعض السطور ثم احفظه
    افتح مفسر البايثون و اكتب السطور التالية

    كود PHP:




    file_name=open('/home/chouaib/test', 'r')

    all_lines=file_name.read()

    file_name.close()

    print
    all_lines








    داخل دالة open اكتب المسار الكامل للملف
    في السطر الثاني قمنا بانشاء اوبجيكت آخر يقوم هذا الأوبجيكت بقراءة كل الملف و ذلك من خلال دالة read
    و في السطر الثالث قمنا بغلق الملف لأننا انتهينا من استعماله و لا يجب ترك الملف مفتوحا
    و في السطر الأخير قمنا بطباعة محتوى الملف
    توجد طريقة اخرى تمكننا من قراءة الملف و لكن هذه الطريقة تعطينا ميزة
    معرفة نهاية السطور و تستعمل هذه الطريقة دالة readlines و تمكننا هذه
    الدالة من طباعة الملف سطرا سطرا

    كود PHP:




    file_name=open('/home/chouaib/test', 'r')

    all_lines=file_name.readlines()

    file_name.close()

    for
    line in all_lines:

    print
    line








    دالة readlines تستطيع التفرقة بين السطور و ستفيدنك هذه الميزة كثيرا في كل برامجك

    الكتابة في الملف

    للكتابة في الملف نتبع نفس الخطواة السابقة و لكن الدوال تتغير في هذه الحالة كما ان صيغة الفتح تصبح w

    كود PHP:




    file_name=open('/home/chouaib/test', 'w')

    line=raw_input('enter a line ')

    file_name.write(line)








    و اذا اردنا كتابة اكثر من سطر داخل الملف ما علينا سوى اضافة حلقة على الشكل التالي

    كود PHP:




    file_name=open('/home/chouaib/test', 'w')

    while
    True:

    line=raw_input("enter a line '.' to quit ")

    if
    line !='.':

    file_name.write(line)

    else:

    break

    file_name.close()








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

    كود PHP:




    file_name.write('%s %s' %(line, os.linesep ))








    بحيث اننا استعملنا الدالة linesep و التي تعني line separate بحيث انها تفرق بين السطور .
    و لستعمال هذه الدالة يتوجب علينا استدعاء مكتبة os اول البرنامج

    كود PHP:




    import os

    file_name
    =open('/home/chouaib/test', 'w')

    while
    True:

    line=raw_input("enter a line '.' to quit ")

    if
    line !='.':

    file_name.write('%s %s' %(line, os.linesep ))

    else:

    break

    file_name.close()








    طيب الآن لو لاحظتوا اننا عندما نعيد تشغيل البرنامج يحذف كل محتوى
    الملف و يكتب السطور الجديدة و لو عاودنا مرة اخرى ستحذف هذه السطور و
    تكتب سطور جديدة ,,,,
    و لو اردنا فتح الملف و الإضافة على سطوره دون حذفها نفتح الملف بصيغة a- append- فيصبح السطر الأول من البرنامج

    كود PHP:




    file_name=open('/home/chouaib/test', 'a')








    و بهذا نستطيع اضافة سطور جديدة على الملف دون حذف محتواه
    و لو اردنا الكتابة و القراءة معا نستعمل الصيغة r+ او w+

    كود PHP:




    import os

    file_name
    =open('/home/chouaib/test', 'r+')

    rline=file_name.readlines()

    for
    l in rline:

    print
    l



    while True:

    line=raw_input("enter a line '.' to quit ")

    if
    line !='.':

    file_name.write('%s %s' %(line, os.linesep ))

    else:

    break

    file_name.close()









    و لكن هنا احسن الصيغ لمثل هذه الحالات استعمال صيغة a+ بحيث نستطيع قراءة سطور الملف و الإضافة عليها دون حذفها
    و نستطيع ايضا ان نحدد عدد الأحرف الذي نريد ان ينسخها البرنامج و ذلك باضافة هذا العدد داخل الدالة read()

    كود PHP:




    rline=file_name.read(20)








    التعامل مع النظام من خلال مكتبة os

    توفر لنا مكتبة os عدة دوال للتعامل مع الملفاة من خلال النظام كانشاء ملفاة جديدة و اعداة تسمية الملف حذف الملفاة ,,,الخ



    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:27


    اعادة تسمية الملف

    اولا نقوم باستدعاء المكتبة osو الدالة المستعملة لتغير الإسم هي دالة rename

    كود PHP:




    import os

    os
    ,reanme('old_file', 'new_file')








    مثال

    كود PHP:




    import os

    os
    .rename('/home/chouaib/test', '/home/chouaib/test1')








    طبعا على نظام الويندوز لا يتغير شيئ سوى المسار

    كود PHP:




    import os

    os
    .rename('C:\My ********s\test', 'C:\My ********s\test1')









    انشاء مجلد جديد

    تسمح لنا نفس المكتبة انشاء مجلد جديد من خلال الدالة mkdir()

    كود PHP:




    os,mkdir('new_dir')








    مثال

    كود PHP:




    import os

    os
    .mkdir('/home/chouaib/pythondir')









    اظهار محتوى المجلد

    لكي نستعرض محتوى مجلد معين اي نستعرض الملفات و المجلدات التي يحتويها المجلد الأول نستعمل الدالة listdir()
    مثال

    كود PHP:




    import os

    print os.listdir('/home')








    و يكون المخرج عبارة عن سلسلة كهذه
    ['lost+found', 'chouaib']
    و بهذا نستطيع ان ننشئ متغير يحجز لنا محتوى هذه السلسلة لإستعماله و استغلاله في البرنامج
    مثلا

    كود PHP:




    import os

    list= os.listdir('/home/chouaib')

    i=1

    for a in list:

    print
    'file ID : %d __ name : %s' %(i,a)

    i+=1








    حذف ملف

    نستعمل الدالة removeلحذف الملفات
    مثال

    كود PHP:




    import os

    os
    .remove('/home/chouaib/test1')








    اظهار المسار و تغيره

    اذا كنت تريد ان تعرف المسار الكامل الذي انت فيه فعليك استعمال دالة
    getcwd()
    و لتغير هذا المسار او الذهاب للمسار جديد نستعمل دالة chdir() ثم نضع المسار الذي نريد الذهاب اليه
    مثال

    كود PHP:




    import os

    os
    .chdir('/home/chouaib')

    print
    os.getcwd()

    os.chdir('/usr')

    print
    os.getcwd()








    print os.getcwd()

    اذا فالدالة الأولى تغير المسار و الدالة الثانية تعلمنا بالمسار الحالي

    نبقى مع نفس المكتبة لنرى خصائص اخرى تقدمها لنا من خلال مكتبة path

    تحليل المسار
    تمكننا دالة basename و دالة dirname
    من تحليل المسار و معرفة اسم المجلد و اسم الملف
    مثال لمعرفة اسم الملف

    كود PHP:




    import os.path

    print os.path.basename('/home/chouaib/save')








    مثال لمعرفة المجلد الأب

    كود PHP:




    import os.path

    print os.path.dirname('/home/chouaib/save')








    حفظ المسار على شكل سلسلة

    في احيان كثيرة ستحتاج لحجز اسم المسار و تقسيمه للستغلاله في برنامج و
    لهذا تقدم لك لغة البايثون دالةsplit التي تقسم المسار و تحجزه في متغير
    آخر انت تختاره
    مثال

    كود PHP:




    import os.path

    dir
    = os.path.split('/home/chouaib/save')

    print
    dir








    فيكون الناتج
    ('/home/chouaib', 'save')

    معرفة حجم الملف

    لمعرفة حجم ملف او مجلد معين نستعمل دالة getsize()
    مثال

    كود PHP:




    import os.path

    print os.path.getsize('/home/chouaib/save')








    و يكون الحجم بالبايت byte

    دوال اخرى مفيدة

    دالة exist

    لمعرفة ان كان يوجد الملف او لا
    و تعود الدالة على قيمة 1 ان كان الملف موجود و قيمة 0 ان كان الملف غير موجود
    مثال

    كود PHP:




    import os.path

    e
    =os.path.exists('/home/chouaib/save')

    if
    e==1:

    print
    ' file exist'

    else:

    print
    'file does not exist'









    دالة isdir
    لمعرفة ان كان آخر المسار عبارة عن ملف او مجلد و كالدالة السابقة تعود على قيمة 1 ان كان مجلد و 0 ان كان ملفا
    مثال

    كود PHP:




    import os.path

    e
    =os.path.exists('/home/chouaib/save')

    if
    e==1:

    print
    ' file exist'

    else:

    print
    'file does not exist'









    ثوجد دالة اخرى مشابهة لهذه الدالة و لكنها مخصصة للملفات اسمها دالة
    isfile و نستعملها كالدالة السابقة و لكن هذه الدالة تعود على قيمة 1 ان
    كان آخر المسار ملفا و تعود على قيمة 0 ان كان شيئ آخر عدى ملف



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

    تم بحمد الله













    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:31



    بسم الله الرجمن الرحيم
    و الصلاة و السلام على اشرف المرسلين
    اخوتي في الله السلام عليكم و رحمة الله و بركاته




    يا جماعة من المستحسن ان نستعمل من هنا فصاعدا برنامج eclips لأنه الأروع بالنسبة للغة البايثون

    للتحميل البرنامج

    http://www.eclipse.org/downloads/

    اختر Eclipse Classic 3.3.2


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





    في هذه النافذة اكتب في المجال الأول PyDev
    و في المجال الثاني انسخ الرابط التالي
    http://pydev.sourceforge.net/updates/

    ثم
















    الى الآن انته تثبيت PyDev
    سيطلب منك البرنام اعادة تشغيل eclips


    الآن تفتح eclips مرّة أخرى أرفع رأسك رأسك لفوق
    تجد Windows >Preferences
    تظهر لك نافذة
    على يسارك تجد PyDev اضغط عليه
    ستنزل لك قائمة جديدة
    اختر منها Interpter- Python
    على يمين النافذة يظهر لك زر new
    اضغط عليه و انسخ المسار الكامل -الذي نصبت فيه python exe
    بعدين اضغط ok

    و سيشتغل معك البرنامج عادي

    و يا جماعة الي واجه مشاكل يضع استفساره هنا و سأحاول التوضيح اكثر











    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:33



    بسم الله الرحمن الرحيم
    و الصلاة و السلام على اشرف المرسلين سيدنا محمد و صحبه اجمعين و تابعيه و تابعيهم بإحسان الى يوم الدين


    نبتدئ يا اخوة اليوم بحمد الله تعالى في البرمجة الكائنية الموجهة
    أرجو منك اخي القارئ ان تكمل القراءة إلى آخر الدرس و تركز قليلا لأني
    اعتمدت اكثر من تعريف و في كل مرة اضيف شيئا جديدا في التعريفات و بإذن
    الله ستنهي الصفحة و انت فاهم للدرس
    Object-Oriented Programming

    مقدمة حول البرمجةالكائنية الموجهة ,
    في جميع برامجنا وحتى الآن ، قمنا بتصميم برنامجنا حول دوال أو كتل من
    البيانات التي تتلاعب بالبيانات.فمعظم برامجنا الأخيرة كانت عبارة عن
    مجموعة من الدوال التي تحتوي بنفسها على مجموعة من التعليمات و في الكود
    الرئيسي قمنا بتوجيه هذه الدوال حتى تقوم بالعمل الذي نريده ويسمى هذا
    طريقة البرمجة الإجرائية الموجهة procedure-oriented.

    وهناك طريقة أخرى لتنظيم برنامجك الذي هو الجمع بين الوظيفة والبيانات
    وتغليفها معا فيما يسمى بالكائن أي أننا نقوم بجمع الوظائف او التعليمات
    مع البيانات و نقوم بتغليفها و جمعها في كائن وهذا ما يسمى نموذج البرمجة
    الكائنية التوجه Object-Oriented Programming
    للمبرمج الحرية في استعمال اي طريقة تناسبه و لكن في البرامج الكبيرة التي
    تحتوي على كم هائل من المعلومات و المهام لابد من استعمال البرمجة
    الكائنية الموجهة لأننها و كما قلنا سابقا تمكن المبرمج من جمع البيانات و
    الوظائف معا و تمكنه من تغليفها في كائن واحد و هذا ما يساعد في تنظيم
    البرنامج حتى و لو كان ضخما و يعطي هذا النمط من البرمجة الحرية للمبرمج
    بتوجيه الكائنات و الوظائف حتى تعطيه النتائج الماردة من خلال مشروعه
    لن أستطيع ان اعرف البرمجة الكائنية الموجهة في مقدمة فهذا محال لأننا
    الآن أمام نمط برمجي جديد علينا كليتا لذا سأحاول في هذا الدرس تعريف
    أقسام هذا النمط و اعطاء العديد من الأمثلة و في كل مرة نتوقف بالشرح عند
    كل جزء و عندما تتكون لدينا صورة واضحة سندعم فهمنا بمجموعة من البرامج
    الكاملة


    الكلاس Class

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

    إنشاء الكلاس

    لإنشاء كلاس جديد نقوم بكتابة الكلمة المخصصة class ثم تليها اسم الكلاس

    مثال

    كود PHP:




    class My_class:

    'exemple of class data atributes'

    a=125

    b
    =8958

    print My_class.a

    print My_class.b








    قمنا باختيار اسم للكلاس My_class
    و هنا ملاحظة
    يستحسن كتابة الحرف الأول من اسم الكلاس بالحجم الكبير فهذا يعتبر عرف عند كل المبرمجين و في كل لغاة البرمجة

    طيب الآن ركزو معي قليلا
    ماهي الكلاس ؟؟

    تعتبر الكلاس صنف مثلا من الكائنات الحية نأخذ الطيور فالطيورصنف من الكائنات الحية
    لو دققنا في هذا الصنف نجد ان لكل طائر صفاة خاصة به
    اللون و الطول الوزن ,,,,,,,,,,
    كذلك لكل كلاس صفات خاصة بها و تسمى الصفاة بـattributes
    مثال
    فلننشئ كلاس و نسميها Bird ثم نعطيها صفات خاصة بها

    كود PHP:




    class Bird:

    pass

    Bird
    .color='yellow'

    Bird.poid='58gr'

    Bird.name='coucou'


    print Bird.color

    print Bird.poid

    print Bird.name








    قمنا بإنشاء الكلاس و تركناها فارغة و نستطيع فعل هذا بواسطة الكلمة pass
    المهم بعد الإنشاء اعطينا هذه الكلاس attributes او صفاة خاصة بها تميزها
    عن باقي الكلاس الأخرى في البرنامج و هذه الصفاة هي اللون و الوزن و الإسم

    نعرف الكلاس مرة أخرى

    الكلاس ماهي إلاّ وعاء يحوي داخله مجموعة من الصفاة و الوظائف
    أو بعبارة اخرى الكلاس عبارة عن بويضة تظم داخلها مجموعة من الصفات و التي نستعملها في البرنامج كأساس لتعبئة البيانات بالإضافة للصفاة تضم الكلاس ايضا مجموعة من الوظائف methodes
    تمثل هذه الـ methodes الوظائف و المهام التي تقوم بها الكلاس
    فلو عدنا للمثال الذي ضربناه سابقا صنف الطيور له صفات تميزه عن باقي
    الأصناف و كذلك له مهام يقوم بها مثل الطيران الأكل النوم الصيد ,,,
    كذلك الكلاس لها وظائف معينة تقوم بها في البرنامج و تنبني هذه الوظائف على الصفاة
    و نستطيع ان نلخص تعريف الكلاس في السطر التالي

    الكلاس= مجموعة من الصفات+ مجموعة من الوظائف

    نتفق الآن ان الكلاس تحتوي على صفاة و وظائف رأينا مثال بسيط جدا عن الصفاة سندرس الآن الوظائف و الطريقة المعتمدة لإدراج الصفاة
    لكن قبل هذا ندرس الحالات Instances فهي بسيطة جدا ننهيها و نمر للوظائف

    Class Instances

    معنى Instancesهي اسناد الكلاس إلى كائن -Instances- يرث هذا الأخير
    كل خصائص الكلاس و بواسطة هذا الـInstances نستطيع استغلال وظائف الكلاس و
    نقول ان هذه instance صارة عبارة عن حالة للكلاس
    مثال


    كود PHP:




    class My_class:

    'exemple of class Instance'

    a=125

    b
    =8958

    inst
    =My_class()

    print
    inst.a

    print inst.b

    print inst.a+inst.b









    كما نلاحظ قمنا بإسناد instances inst الى الكلاس My_class
    و بهذا ورث inst كل خصائص الكلاس و استطعنا من خلاله استغلال بينات الكلاس
    طيب الآن سنعرف أهمية استعمال instance
    عندما ندخل الآن للوظائف



    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:34


    ( Method (Functional attributes


    ما هي الميثود ؟؟

    قلنا قبل قليل أن الكلاس تحتوي على صفاة و وظائف الصفاة رأيناها تبقى لنا الوظائف سنضرب الآن مثال آخر
    نفرض انه لدينا سيارة تمثلها كلاس
    طبعا كل سيارة لها صفاة خاصة بها هي اللون و الحجم .........
    هذه صفاة السيارة
    و للسيارة أيضا وظائف تتمثل هذه الوظائف في
    الإنطلاق التوقف الدوران ...................
    سننشأ الآن كلاس نسميها Car و نعطيها الصفات اولا


    كود PHP:




    class Car:

    def __init__(self, color, size):

    self.color=color

    self
    .size=size








    نشرح خطوة خطوة

    بعدما انشأنا الكلاس قمنا باعطائها صفاة معينة لها
    __init__ هي عبارة عن كلمة محجوزة للغة البايثون و هي ميثود ايضا معنها initialisation أي التهيئة و اسمها يدل على وظيفتها تقوم هذه الميثود بتهيئة الصفاتو هي تبقى بلا عمل فإذا اسندنا حالة instance للكلاس
    تنطلق الميثود __init__ في العمل و تقوم بتهيئة الصفاة و اسنادها للحالة التي انشأنها
    سنفهم هذا عندما نكمل الكود
    و كل ماكتبناه في هذا الكود يعتبر صفة للكلاس Car و هي ليست دالة فلا يجب
    الخلط حتى و لو ابتدئ السطر بـ def لا تسمى هنا دالة بتاتا و إنما تسمى
    method للكلاس Car
    الآن قمنا بإنشاء الكلاس و اعطيناها صفاة كيف سنستفاد من هذه الصفاة
    ممممممممممممممم

    يجب اولا ان ننشئ حالة instance و من خلالها نستغل هذه الصفاة
    مثال


    كود PHP:




    BMW=Car('red', '5 places')

    print
    BMW.color

    print BMW.size








    قمنا بإنشاء حالة BMW و اسنادناها للكلاس في هذه اللحظة تنطلق
    الميثود __init__ و تقوم بتهيئة الكلاس و تهيئة الصفاة ثم تقوم بتعويض self
    الخاص بالكلاس و نقله للكائن الجديد BMW
    self هنا تلعب دور الوسيط بين الميثود التابعة للكلاس و ماأدخلناه من بيانات في الكائن الجديد او الحالة الجديدة BM
    و لنا الخيار باستعمال self أو this
    طبعا مستعملين الجافا و السي شارب سيفضلون this لأنها هي نفسها التي في لغة الجافا و السي شارب نعطي نفس المثال و لكن بعبارة this


    كود PHP:




    class Car:

    def __init__(this, color, size):

    this.color=color

    this
    .size=size


    BMW
    =Car('red', '5 places')

    print
    BMW.color

    print BMW.size









    كما في self تماما تقوم this بربط صفاة الكلاس Car إلى الحالة او الكائن الجديد BMW
    أظن يا اخوتي أن مفهوم البرمجة الكائنية بدئ يتضح نوعا ما

    الآن رأينا صفاة الكلاس و رأينا كيفية استعمالها سنرى الآن الوظائف
    في نفس المثال سنقوم بإضافة وظائف لهذه السيارة او بمعنى ادق نضيف ميثود وظيفية للكلاس Car


    كود PHP:




    class Car:

    def __init__(this, color, size):

    this.color=color

    this
    .size=size

    def start
    (self):

    print
    "the car started"

    def stop(self):

    print
    "this car stoped"


    BMW=Car('red', '5 places')

    print
    BMW.color

    print BMW.size

    BMW
    .start()

    BMW.stop()









    أظفنا للنفس الكلاس وظائف و هي الإنطلاق و التوقف و نلاحظ ان الميثود
    startو الميثود stopتشبه الدوال و لكن قلنا انها في هذه الحالة تسمى
    methodو السطر الأول -صفاة الكلاس- تسمى attributes

    مثال آخر اكثر واقعي
    لدينا كلاس اسمها student تحتوي على صفاة و هي الإسم و العمر و النقطة
    الأول و النقطة الثانية كما تحتوي هذه الكلاس على وظيفة واحدة و هي حساب
    معدل النفطتين


    كود PHP:




    class Student:

    def __init__(self, name, age, n1, n2):

    self.name=str(name)

    self.age=str(age)

    self.n1=int(n1)

    self.n2=int(n2)



    def moy(self):

    m=(self.n1+self.n2)/2

    print m


    s
    =Student('Ahmed', '18',15, 19)

    s.moy()








    نلاحظ اننا اذا استعملنا احد صفاة الكلاس يجب كتابة كلمة self أو this
    قبلها لأنه كما قلنا ان وظيفة هذه العبارة هي تعويض القيم عند اسناد الكلاس لكائن جديد و اسمه في الكود s
    نلخص مرة اخرى معتمدين على هذا المثال
    الكلاس عبارة عن صنف يظم داخلة قسمين اثنين
    مجموعة من الصفاة و تسمى attributes
    نقوم يادراجها من خلال الصيغة التالية

    كود PHP:




    def __init__(self or this, attributes)








    بعد ذلك نقوم بربط الصفاة بواسطة الكلمة self أو this
    self,صفة أ=صفة أ
    this,صفة أ=صفة أ
    بعد ذلك نقوم بإدراج الوظائف لهذه الكلاس و هي شبيهة بالدوال و لكن لا تسمى دوال بل تسمى method
    هنا يصبح الأمر عادي نعتمد على الصفاة و البيانات المدرجة في attributes
    لكي ننشئ وظائف method للكلاس


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



    تم بحمد الله
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:45



    بسم الله الرحمن الرحيم
    و الصلاة و السلام على رسول الله
    اخوتي في الله السلام عليكم و رحمة الله و بركاته
    نتابع ما ابتدءناه في الدرس السابق و هذا الدرس يعتبر التعريف الصحيح و
    المعتمد لكل ما رأيناه في الدرس السابق فلم اتعمد في الدرس السابق
    استعمالا لكثير من التسميات و حاولت ان اشرح بعض المفاهيم بصورة تقريبية و
    في هذا الدرس سنعرف كل مارأيناه سابقا بصورة
    رسمية و من فهم الدرس السابق سيمر على هذا الدرس بسهولة لأنه عبارة عن تثبيت المفاهيم السابق و لن نأتي بشيئ جديد
    و نبتدء بحول الله بمثال نراجع فيه الدرس السابق
    المثال عبارة عن كلاس اسمها Info تحتوي على صفاة و على وظائف

    نتتبع المثال ثم نشرح


    كود PHP:




    import os

    import sys

    class Info :

    def __init__(self, name, mpass, age, email):

    self.name=str(name)

    self.mpass=str(mpass)

    self.age=int(age)

    self.email=str(email)

    def save_info(self, nfile):

    self.nfile = nfile

    try
    :

    ff= open(self.nfile, 'a+')

    ff.write('%s %s %d %s %s ' %(self.name, self.mpass, self.age, self.email, os.linesep))

    ff.close()

    except Exception, e:

    print
    "Error",e

    Chouaib
    =Info('chouaib', '00000', 22, 'lem_chouaib@hotmail.fr')

    Chouaib.save_info('/home/chouaib/info_user')








    الكلاس مجهزة بميثود __init__ و هذه الأخيرة تحتوي على أربعة بارامترات و هي الإسم و رقم السري و العمر و الإيميل
    بعد تهيئة الميثود __init__ تقوم بربط الصفة self مع الصفاة المدرجة في البارمتر
    و كل هذا يدخل تحت وظيفة __init__التي تهيئ الصفاة (attributs) و تقوم بعملية ربط هذه الصفات مع الأداة self
    فــ self أو this تعملان كأداة ربط بين الصفات (attributs) و الوظائف التي تعتمد عليها داخل الكلاس نفسها من خلال الميثود

    كود PHP:




    ff.write('%s %s %d %s %s ' %(self.name, self.mpass, self.age, self.email, os.linesep))








    كما في المثال قمنا باستعمال الـ attributs الخاصة بالـميثود__init__في ميثود اخرى هي save_info
    هذا داخل الكلاس نفسها و مثال آخر عن الكائنات المشتقة كما في الكائن الجديد الذي اشتققناه

    كود PHP:




    Chouaib=Info('chouaib', '00000', 22, 'lem_chouaib@hotmail.fr')








    ففي هذه الحالة تقوم self بربط الصفاة المدخلة الجديدة أو بتعبير آخر البيانات المدخلة
    مع صفاة الكلاس الأصلية و Info
    و كل هذا العمل يدخل تحت عمل الميثود__init__ التي سنعرف اسمها الحقيقي بعد قليل

    الكلاس Info تحتوي على ميثود ثانية اسمها save_info تقوم هذه الميثود بحفظ
    البيانات المدخلة في ملف خاص و هذا طبعا بالإعتماد على الـ attributs في
    الميثود __init__
    و هنا نلاحظ ان الميثود save_info تحتوي هي الأخرى على صفة attribut
    فلا يمنع ان تضم الميثود صفات خاصة بها و في نفس الوقت تستعمل صفات خصاة
    بميثود اخرى و لكن قبل استعمال الصفة يجب دائما تهيئتها و ربطها بالأدات
    self

    كود PHP:




    def save_info(self, nfile):

    self.nfile = nfile









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


    **
    البرمجة الكائنية الموجهة هي نمط او اسلب جديد او طريقة برمجية لها قواعد
    خاصّة بها لكتابة الأكواد و سنلاحظ عند التعمق ان هذا الأسلوب صارم جداّ
    من ناحية اتباع قواعده
    **
    صرامة قواعد OOP تساعد المبرمج على تنظيم مشاريعه مهما كانت كبيرة و معقدة
    فهي كقوانين المرور فهذه الأخيرة تنظم طريقة السير و تمنع الحوادث حتى
    داخل المدن المعقدة كذلك قوانين –ووب اذا احترمها المبرمج سيتمكن من اكمال
    مشروعه و بطريقة منظمة و آمنة

    **
    فكرة OOP
    الفكرة الأساسية لـ OOP تكمن في جمع مجموعة من البيانات و المعطيات attributs
    و مجموعة من التعليمات او اللوغاريتميات التي تعالج هذه البيانات methods
    و كل هذا يكون مضغوط encapsul او محتوى داخل كائن واحد object
    و نستخلص من ما سبق المعادلة التالية

    Object=attributes+Methodes

    هذا الجمع لهذه البيانات و التعليمات داخل كائن واحد يتيح للمبرمج حرية
    كبيرة في استعمال مايشاء من المعلومات او مجموعة المعلومات data و بصورة
    منظمة اكثر
    مثلا لدينا مشروع لتسير مستودع بضائع كبير
    يقوم المبرمج بجمع البيانات و الوظائف الخاصة بالبضائع التي توجد داخل المستودع في كائن object واحد
    و يقوم بجمع البيانات و الوظائف الخاصة بالبضائع التي خرجت من المستودع -بيعت- في
    اوبجيكت آخر
    و البضائع التي لم تسدد قيمتها و التي اتلفت في اوبجيكت آخر وهكذا .....
    يكون المشروع متكون من العديد من الكائنات –object فيقوم بتوجيه هذه
    الكائنات لكي يحصل على النتائج المرجوة من المشروع ولهذا نسمي هذا النمط
    بـ البرمجة الكائنية الموجهة Object-oriented programming













    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الأحد 8 مارس - 14:45


    **

    __init__ Constructeur

    قمنا في الدرس السابق بتعريف الميثود __init__ وقلنا ان مهمتها هي تهيئة
    الـattributs الخاصة بالكلاس و هذا التعريف صحيح لا غبار عليه و لكن الإسم
    الصحيح لهذه الميثود هو Constructeur و باللغة العربية تدعى الميثود
    __init__ بـ بناء الكلاس و الإسم يدل على مهمت Constructeur إذ انه يقوم
    بتهيئة الكلاس و بناء روابط بين الـ attributs و البيانات التي ستعوض بها

    **
    method
    باختصار الميثود هي كل دالة كتبت داخل الكلاس او هي كل دالة تابعة للكائن
    فكل دالة كتبت داخل كلاس تسمى ميثود حتى Constructeur يسمى ميثود

    هذه هي التعريف و المفاهيم الأساسية لكل ما رأيناه سابقا طبعا لا تنتهي
    OOP هنا فمازال هناك الوراثة inheritance و تعدد الأشكال Polyphormisme

    **
    الوراثة inheritance و تعدد الأشكال Polyphormisme

    هما ثاني و ثالث مفاهيم الـ OOP الأساسية فركائز البرمجة الكائنية الموجهة هي

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

    الوراثةinheritance و سنرى تعريفها الآن
    تعدد الأشكالPolyphormisme سنعرفه بعد قليل ايضا

    و تجدر الإشارة ان الوراثة و تعدد الأشكال مرتبطان ببعضهما البعض و سنفهم هذا بعد قليل


    ماهي الوراثة : في حياتنا اليومية نفسر
    الوراثة على انها اكتساب لأشياء جديدة من طرف عنصر آخر فنقول مثلا ان
    الولد ورث صفاة ابيه فهذا يعني ان الولد قد اكتسب صفاة من طرف ابيه و صار
    بينهما شيئ مشترك و لا يعني ان الإبن صورة طبق الأصل عن ابيه و انما ورث
    بعض الصفاة فقط
    نفس الشيئ بالنسبة لـ OOP
    نفرض مثلا انه لدينا كلاس اسمها Etud هذه الكلاس مخصصة لصنف الطلاب
    و نريد ان ننشئ كلاس اخرى اسمها Teach مخصصة لصنف الأساتذة
    للطلاب صفاة معينة كالإسم و اللقب و القسم و النقطة ..........
    و للأستاذ ايضا صفاة معينة
    في هذه الحالة نستطيع ان ننشئ لكل صنف كلاس مخصصة و لكن منحتنا OOP
    مفهوم جديد اسمه الوارثة يمكننا من استعمال عدة خصائص و صفاة لأصناف مختلفة
    نعود لمثالنا
    بدل ان ننشئ كلاس للأستاذ و نعيد ادراج كل الصفاة الخاصة به نستفيد من
    تقنية الوراثة و ننشئ هذه الكلاس و لكن لا ندرج كل الصفاة فيها بل ندرج
    الصفاة التي لا تحتويها كلاس الطلاب فقط لأنه بين الأستاذ و الطلاب توجد
    العديد من الصفاة المشتركة كالإسم و اللقب و القسم سنستغل هذه الصفاة
    المشتركة و في الكلاس الخاصة بالأستاذ ندرج الصفاة التي ينفرد بها صنفه
    فقط ثم نقوم بإنشاء علاقة وراثة بين كلاس الطلاب و كلاس الأستاذ
    فنقول ان كلاس الأستاذ ترث خصائص كلاس الطلاب
    و هنا تدعى كلاس الأستاذ بالولد و كلاس الطلاب بالأم
    و البعض يسمي الكلاس الأم بـ Base class و الكلاس الولد بـ Subclass
    الصيغة الكتابية للوراثة هي

    كود PHP:




    class Sub_class_Name (Base_class1, Base_class2....):

    class_suit

    ...........

    ..........








    مثال

    كود PHP:




    class My_Base_class():

    def my_base_class_method(self):

    print
    'Base calss method'

    class My_subclass(My_Base_class):

    def my_subclass_method(self):

    print
    'subclass method'








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

    كود PHP:




    ins=My_subclass()

    ins.my_subclass_method()

    ins.my_base_class_method()








    فهنا الكلاس البنت او subclass تستطيع ان تستعمل كل خصائصها و كل خصائص الكلاس الأم base class لأنها ترث منها و لكن العكس غير صحيح
    حاول مثلا ان تكتب السطر التالي

    كود PHP:




    s=My_Base_class()

    s.my_subclass_method()








    ستفشل في تنفيد الكود لوجود خطئ لأن الوارث هو فقط من يستطيع استعمال خصائص من ورث منه اما العكس فلا يصح

    **
    الوراثة الجماعية Multi inheritence
    تستطيع اي كلاس ان ترث الخصائص عن عدة اصناف اخرى و هذا يسمى بالوراثة الجماعية
    مثال

    كود PHP:




    class My_Base_class():

    def my_base_class_method(self):

    print
    'Base calss method'

    class My_subclass(My_Base_class):

    def my_subclass_method(self):

    print
    'subclass method'

    class My_third_class(My_Base_class, My_subclass):

    def My_third_class_method(self):

    print
    'third class method'

    ins=My_third_class()

    ins.my_base_class_method()

    ins.my_subclass_method()

    ins.My_third_class_method()









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


    **
    Polyphormisme

    يعتبر Polyphormisme خطوة واعدة في مجال البرمجة و نقلة نوعية مما يعد بالكثير في المستقبل
    قلنا سابقا ان الوراثة و تعدد الأشكال مرتبطان ببعضهما البعض
    نفرض ان كلاس A ورثت من كلاس B
    طبعا لكل كلاس عدة ميثود خاصة بها يمنحنا Polyphormisme امكانية استعمال
    اسماء متشابهة للميثود فتكون الكلاس Base class وsubclass تحتوي على ميثود
    بنفس الإسم و هذا بعني ان الكلاس subclass تحتوى على 2 ميثود بنفس الإسم
    مثال

    كود PHP:




    class My_class_A():

    def class_a_method(self):

    print
    ' classA method'


    class My_class_B(My_class_A):

    def class_b_method(self):

    print
    'classB method'


    class My_class_C(My_class_A, My_class_B):

    def class_a_method(self):

    print
    'classC method'

    def class_b_method(self):

    print
    'classC 2 method'



    ins=My_class_A()

    s=My_class_B()

    y=My_class_C()


    ins.class_a_method()

    s.class_b_method()

    y.class_a_method()

    y.class_b_method()








    لدينا في المثال 3 كلاس
    الكلاس الأخيرة My_class_C ترث من كلتى الكلاس الاخر و تحتوى بداخلها على 2 ميثود بنفس اسم ميثود الكلاس التي ورثت منهم
    و مع التطابق في اسماء الميثود لم يفشل تنفيد الكود و استطاع المفسر ان يفرق بين الميثود
    و هذا هو مفهوم تعدد الأشكال او Poly

    هذا ما ينبغي علينا معرقته حول Poly حتى الآن كالعادة سنتوق بالشرح عند كل
    جديد في دروسنا القادمة فمن لم يفهم الـOOp جيدا فلا يخف لأن كل دروسنا
    القادمة بإذن الله مبنية على OOP

    هذات كل شيئ في هذا الدرس ارجوا ان اكون قد وفقت في شرح OOP
    الدرس القادم سيكون كالعادة مثال او مثالين شاملين نطبق فيهما كل ما رأيناه في هذا الدرس و الدرس الماضي



    تم بحمد الله
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:11



    بسم الله الرحمن
    الرحيم و الصلاة و السلام على اشرف المرسلين سيدنا محمد و آل بيته
    الطّاهرين و صحبه اجمعين و تابعيه و من تبعهم بإحسان الى يوم الدين

    الإخوة الأفاضل اتيتكم اليوم بمثال شامل بإذن الله هو عبارة عن مشروعه للمكتبة Library
    يعطي المستعمل الكثير من الخيارات للتعامل مع البيانات المدخلة

    ***************************************

    المشروع مكون من اربع كلاس 4 classes
    و هي




    كما نلاحظ في الصورة مشروعنا متكون من 4 كلاس
    الكلاس الأم هي Libarary و ترث منها الكلاس Book و الكلاس Software
    الكلاس الرابعة تدعى Root و ترث من Book و Software

    **
    عمل البرنامج

    **
    المشروع عبارة عن برنامج لمكتبة يقوم المستخدم بحجز الكتب او السيديهات
    الموجودة في المكتبة بواسطة البرنامج فالمستعمل يدخل البيانات الكاملة
    للكتاب او السيدي ثم يقوم البرنامج بحفظها كما يمكنه الرنامج من البحث عن
    البيانات المحفوظة في البرنامج و حذفها
    البرنامج يحتوي ايضا على ميزة مدير النظام اذ ان مدير البنامج root يستطيع
    الدخول بواسطة كلمة مرور للبرنامج و يحذف كل البيانات المدخلة كما يستطيع
    ان ينسخ قاعدة البيانات في ملف احتياطي

    في هذا البرنامج استعملت مجموعة من الملفات تلعب دور قاعدة البيانات و
    عندما اقول قاعدة البيانات فأنا اعني الملف الذي تحفظ في المعلومات

    **
    شرح كود البرنامج

    **
    سنشرح الكود المصدري للبرنامج و ذلك بشرحنا لكل كلاس على حدى

    ** 1- Library class
    هي الكلاس الأم للبرنامج و يرث منها كل الكلاسات الأخرى تحتوي هذه الكلاس على 3 ميثود بالإضافة لـ constructor
    فاجمال الميثود التي تحتويها هذه الكلاس 4 ميثود

    ** الكود الكامل للكلاس Library


    كود PHP:




    class Library:

    'Library class'

    def __init__(self):

    'Library class constructor'

    LibCode=Title=Price='' #Initializes the attributes of Library class

    FileName=''



    def lib_method(self):

    'Enter common details for books and software'

    LibCode=raw_input('Enter the library code :')

    Title=raw_input('Enter the title :')

    Price=raw_input('Enter the price :')

    return
    LibCode, Title, Price



    def empty_file_method
    (self, FileName):

    'delete all books and software records'

    File=open(FileName, 'a')

    File.seek(0,2) #Goes to the end of file

    FileLen=File.tell() #stor the length of file

    if FileLen== 0L:

    print

    print
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print '************* FILE ALREADY EMPTY ******************'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print



    else:

    File.truncate(0) #Empty the file, if the length of file is not zero



    if FileName=='BookDetails': #Checks if the filename is BookDetails

    print

    print
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print '***********ALL BOOK RECORDS DELETED **************'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print



    else:

    print

    print
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print '********** ALL SOFTWARE RECORDS DELETED ***********'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print



    File.close()



    def clear_screen_method(self):

    'Clear Screen method =>> Clear the screen '

    KeyInput=0

    while not KeyInput:

    print

    ch=raw_input('Press Entry to continue ... ')

    if
    ch!='':

    print

    print

    print
    'Wrong Key pressed!! pleas press Entry key'

    else:

    ClearScreen=os.system('clear')

    KeyInput=1








    بسم الله

    في الـ constructor قمنا بتعريف 4 صفات و هي
    LibCode Title Price FileName
    هذه الصفات سنستعملها فيما بعد لحجز بيانات المستعمل و هذه الصفاة هي
    المشتركة بين الكتب Book و السيدسهات او البرامج Software و لهذا قمنا
    بوضعها في الكلاس
    الأم و فيما بعد كل كلاس نضيف فيها الصفات التي تنفرد بها لوحدها

    **
    lib_method() تقوم بأخذ البينات من المستخدم ثم تجز هذه البانات في الصفات الخاصة بالكلاس

    **
    empty_file_method() هذه الميثود تقوم بحذف كل البيانات المجوزة في الملف و هي ميثود المدري فقط من يستطيع استعمالها كما سنرى
    عملها بسيط جدا تقوم بفتح الملف ثم نذهب لآخر الملف بواسطة seek
    FileLen=File.tell() هنا نقوم بحجز طول السلسلة الحرفية المحجوزة داخل الملف و هذا بواسطة الدالة tell
    اذا كانت FileLen تساوي الصفر فهذا يعني ان الملف فارغ اصلا و اذا كانت
    تختلف عن الصفر نقوم بافراغ الملف و الاحظوا جيدا افراغ و ليس حذف
    و الإفراغ يتم بواسطة الدالة truncate الصفر بين القوسين معناه افراغ السلسلة الحرفية التي يحتويها الملف حتى تساوي الصفر
    اخواتني عندما اقول هنا دالة اعني بها دالة محجوزة اي تابعة للبايثون فـ seek و tell و truncate هي دوال محجوزة للغة

    **
    clear_screen_method(): تقوم هذه الميثود
    بافراغ الشاشة clear نفس الأمر في سطر الأوامر الخاص بالينيكس او الويندوز
    و استعملنا في هذه الميثود مكتبة os.system و تتيح لنا هذه المكتبة ان
    نستعمل اوامر خاصة بالنظام و في هذا البرنامج استعملنا الأمر clear
    فعند ضغط المستعمل على entry تقوم الميثود بافراغ الشاشة اي حذف كل
    الكاتابات الظاهرة على شاشة الجهاز و هذا طبعا لراحة مستعمل البرنامج و
    لكي يجد سهولة في التعامل معه

    **

    2- Book class

    هذه الكلاس تستكلف بالكتب فقط فكما قلنا ان البرنامج يفصل بين الكتب و
    البرامج او السيديهات و نستطيع ان نجمعهما في كلاس واحدة و لكن سيصبح
    البرنامج مقيد و سنخسر الكثير من الميزات و هذه هي فائدة الـ OOP اجمع كل
    البيانات المتشابهة في كلاس واحدة ثم اعمل علاقة بين مختلف الكلاس التي
    يحتويها البرنامج
    نحن هنا قمنا بجمع كل البيانات و الوظائف الخاصة بفئة الكتب في كلاس واحدة اسمها Book هذه الكلاس ترث من Library


    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:15

    [size=16]
    الكود الكامل للكلاس Book


    كود PHP:




    class Books(Library):

    'books class'

    def __init__(self):

    'class books constructor'

    Author=Publisher=PageCount=ISBN='' # Initialise attributes of the books



    def bks_method(self): # Takes input for book details

    'Entry books details'

    BKFile=open('BookDetails', 'a') # Creat and open a file in append mode

    libM=self.lib_method() # Calls the method of the base class, which takes input for three attributes

    # LibCode, Title and Price

    BKFile.write(libM[0] + ',')

    BKFile.write(libM[1] + ',')

    Author=raw_input('Enter the name of author :')

    BKFile.write(Author + ',')

    Publisher=raw_input('Enter the name of publisher :')

    BKFile.write(Publisher + ',')

    ISBN=raw_input('Enter the ISBN :')

    BKFile.write(ISBN + ',')

    PageCount=raw_input('Enter the page count :')

    BKFile.write(PageCount + ',')

    BKFile.write(libM[2]+ '\\n')

    BKFile.close()

    print
    '''

    you have entered the following details for a book :

    ====================================================

    Library code : %s

    Title : %s

    Author : %s

    Publisher : %s

    ISBN : %s

    Page count : %s

    Price : %s'''
    %(libM[0], libM[1], Author, Publisher, ISBN, PageCount, libM[2])





    def book_search(self):

    'sreach for book record '

    BKDet=open('BookDetails', 'r')

    BKDet.seek(0,2)

    BKFileLen=BKDet.tell()

    if
    BKFileLen ==0L :

    print

    print
    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print '************** NO RECORDS AVAILABLE ***************'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    print



    BKDet.close()

    else:

    BKDet=open('BookDetails', 'r')

    lines=BKDet.readlines()

    size=len(lines)

    name=raw_input('enter name of book ')

    i=0

    reco
    =""

    while i<size:

    line=lines[i]

    fd=line.find(name)

    if
    fd>0:

    reco=line.split(',')

    print
    '''

    View details for a book :

    ====================================================

    Library code : %s

    Title : %s

    Author : %s

    Publisher : %s

    ISBN : %s

    Page count : %s

    Price : %s'''
    %(reco[0], reco[1], reco[2], reco[3], reco[4], reco[5], reco[6])

    i+=1



    else:

    print
    'no record avalibale '



    def book_delete(self):

    'delete entry from book library'

    BKDet=open('BookDetails', 'r')

    lines=BKDet.readlines()

    BKDet.close()

    name=raw_input('Enter name of book')

    i=0

    size
    =len(lines) #get size lines length

    while i < size :

    fd=lines[i].find(name) # search in line

    if fd>0:

    del lines[i] #delete the line from file

    break

    else:

    if
    i == size-1 :

    print
    ' no record availibal '

    i+=1

    BKDet
    =open('BookDetails' ,'w')

    BKDet.writelines(lines)

    BKDet.close()




    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:17






    **

    Constructor

    يحتوي بنّاء هذه الكلاس على كل الصفات التي تنفرد بها هذه الكلاس و هي
    Author Publisher PageCount ISBN
    و هذه الصفات خاصة بالكتاب فقط و للكلاس Book صفات اخرى و هي التي
    ادرجناها في Library class و نعيد ذكرها : LibCode Title Price FileName

    و هنا نقف مرة اخرى مع فائد استعمال الـ OOP فبدل ان ندرج لكل كلاس الصفات الكلية لها نختصر على انفسنا الجهد و الوقت و نقوم بادراج الصفات المشتركة بين مجموعة الكلاس داخل الكلاس الأم و في كل كلاس ندرج الصفاة الخاصة بها هي فقط
    فهنا مثلا الصفة PageCount صفة خاصة بالكاتب فقط لأن السيدي لا يحتوي على صفحات
    اما الصفات المشتركة فمثلا Price للكتاب ثمن كما ان للسيدي ثمن فبدل ان
    ندرج هذه الصفة في كلاس Book و كلاس Software نقوم بادراجها في الكلاس
    الأم Library و بفضل الوراثة تستطيع كل كلاس استغلال او استعملا هذه الصفة

    اظن ان الفكرة وصلت الآن

    **
    bks_method():
    تقوم هذه الميثود باخذ البيانات من المستعمل ثم تحفظها داخل الملف
    BookDetails وهو الملف الخاص بحفظ بيانات الكتب اي انه يلعب دور قاعدة
    البيانات الخاصة بالكتب
    و نلاحظ اننا لم نكتب المسار الكامل عند فتح او حفظ الملف و لهذا سيقوم المفسر بحفظه داخل ملف المشروع الذي انشأناه

    لاحظو معي السطرين التاليين

    كود PHP:




    libM=self.lib_method() # Calls the method of the base class, which takes input for three attributes

    # LibCode, Title and Price

    BKFile.write(libM[0] + ',')

    BKFile.write(libM[1] + ',')








    هنا قمنا بانشاء مشتق للميثود lib_method الخاصة بالكلاس الأم لكي
    نحفظ في الملف البيانات المشتركة بين كل كلاس و هي LibCode و Title و
    Price
    بعد ذلك نقوم بحجز البيانات الخاصة بالكتاب فقط

    **
    book_search()
    تقوم هذه الميثود بعملية البحث داخل الملف عن كتاب معين بقوم المستخدم بادخال اسم هذا الكتاب
    اول شيئ عادي جدا نقوم بفتح الملف نقيس طول الملف اذا كان الطول مساوي للصفر نشير للمستخدم ان القاعدة فارغة المحتوى
    في حالة العكس

    كود PHP:




    else:

    BKDet=open('BookDetails', 'r')

    lines=BKDet.readlines()

    size=len(lines)

    name=raw_input('enter name of book ')

    i=0

    reco
    =""

    while i<size:

    line=lines[i]

    fd=line.find(name)

    if
    fd>0:

    reco=line.split(',')








    نقوم بفتح الملف و يقوم المتغير lines بحجز كل السطور التي يحتويها
    الملف و يجب ان اذكركم هنا ان البرنامج يقوم بحجز المعلومات كل في سطر على
    حدى اي ان كل المعلومات الخاصة بالكتاب الواحد تحجز في سطر واحد و هكذا
    ....
    بعد ذلك ننشئ حلقة تقوم بالمرور على كل سطور الملف فكل مرة يقوم المتغير
    line بحجز سطر واحد من lines و في نفس الوقت نبحث عن الإسم المدخل في
    السطر
    ان وجد الإسم و هذا معناه ان المتغير fd سيكون اكبر من الصفر لأننا رأينا
    في درس السلاسل الحرفية ان الدالة find تعطينا موضع بداية الكلمة المبحوث
    عنها
    عند وجود الإسم نقسم line الى عدة اقسام بواسطة الدالة split -درسناها هي الأخرى-
    ثم نقوم بنسخ بيانات الكتاب على الشاشة

    كود PHP:




    reco=line.split(',')

    print
    '''

    View details for a book :

    ====================================================

    Library code : %s

    Title : %s

    Author : %s

    Publisher : %s

    ISBN : %s

    Page count : %s

    Price : %s'''
    %(reco[0], reco[1], reco[2], reco[3], reco[4], reco[5], reco[6])

    i+=1









    **
    book_delete():
    تقوم هذه الميثود بحذف بيانات كتاب معين يقوم المستخدم بادخال اسمه
    تعمل هذه الميثود كالميثود التي رأيناها الآن book_search
    نقوم اولا بفتح الملف ثم يقوم المتغير lines بحجز كل سطور الملف
    فتبحث عن الكتاب ان كان موجود داخل lines ان وجد الإسم نقوم بحذف السطر كاملا و ذلك بواسط del

    كود PHP:




    if fd>0:

    del lines[i] #delete the line from file

    break








    و del محجوزة و مهمتها حذف سلسلة من ملف
    طيب بعد حذف السطر نعيد فتح الملف مرة اخرى و ننسخ داخل كل محتوى lines
    يعني ببساطة قمنا بفتح الملف و حجزت lines كل السطور التي يحتويها الملف
    ثم قمنا بحذف السطر الذي يحتوي على كل بيانات الملف ثم فتحنا الملف مرة
    اخرى و اعدنا نسخ محتوى lines داخل الملف و لاحظو جيدا لقد فتحنا الملف
    بصيغة W اي ان كل محتواه السابق سيمحى


    3- Software class

    هذه الكلاس خاصة ببيانات البرامج و اللسيديهات التي تحتويها المكتبة و هي مشابهة جدا لكلاس Book

    **[/size]


    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:21

    **
    change_pass()

    تقوم هذه الميثود بتغير كلمة المرور مثلا اذا اراد المدري ان يغير كلمة
    المرور نفتح الملف الخاص بكلمة المرور نطلب من المدير ان يدخل الكلمة
    المرور القديمة فان تطابقت مع كلمة المرور في الملف نقوم بافراغ الملف ثم
    نحجز كلمة المرور الجديدة

    **
    backup():

    تقوم هذه الميثود بانشاء بنسخ محتوى الملف الذي يحتوى على بيانات الكتب او البرامج في ملف جديد فهي عبارة عن عملية copy past
    اول شيئ نطلب من المدير ان يختار اي ملف يريد ان ينسخه و بعد الإختيار
    نذهب لذلك الملف و نقوم بحجز مسار الملف كاملا في المتغير dst و هذا
    بواسطة الدالة os.getcwd() التي رأيناها في درس الملفات
    بعد ذلك نطلب من المدير ان يدخل اسم المسار الكامل اين يريد انشاء الملف الجديد
    و بواسطة الدالة coptfile التابعة للمكتبة shutil نقوم بنسخ الملف الى المسار الذي ادخله المدير


    هذه هي كل الكلاس التابعة للبرنامج بقي علينا الآن ان ننشئ Menu يتعامل مع المستخدم

    Menu

    كود الخاص بالـ Menu


    كود PHP:






    def MainMenu
    ():

    # display the mani menu, takes input for choiceself

    # and calls an appropriate method based on the choice

    MenuItems ='''



    <#><#><#><#><#><#><#><#><#><#><#><#><#><#><#><#>

    <#><#><#><#><#><#><#><#><#><#><#><#><#><#><#><#>

    <#><#> <#><#>

    <#><#> <#><#>

    <#><#> LIBRARY PROGRAM <#><#>

    <#><#> <#><#>

    <#><#> <#><#>

    <#><#><#><#><#><#><#><#><#><#><#><#><#><#><#><#>

    <#><#><#><#><#><#><#><#><#><#><#><#><#><#><#><#>



    * Main Menu *

    =========

    1- Enter details for books

    2- Enter details for software

    3- View details of books

    4- View details of software

    5- Delete a record -book-

    6- Delete a record -software-

    7- :-.* Root *.-:

    8- Quit





    Enter choice (1 - Cool : '''



    done=0

    while not done:

    MenuChoice=raw_input(MenuItems)

    ClearScreen=os.system('clear')

    print
    'you entred : %s' %(MenuChoice)

    if
    MenuChoice not in '12345678' :

    print

    print
    'wrong choice . Enter 1, 2, 3, 4, 5, 6, 7 or 8 '

    print

    else:

    if
    MenuChoice =='8':

    done=1

    if MenuChoice =='1':

    print

    print
    '*********** ENTER BOOK DETAILS **************'

    print

    bk.bks_method()

    bk.clear_screen_method()



    if
    MenuChoice == '2' :

    print

    print
    '*********** ENTER SOFTWARE DETAILS **************'

    print

    sw.softw_method()

    sw.clear_screen_method()



    if
    MenuChoice == '3' :

    bk.book_search()

    bk.clear_screen_method()



    if
    MenuChoice == '4' :

    sw.sfw_search()

    sw.clear_screen_method()



    if
    MenuChoice == '5' :

    bk.book_delete()

    bk.clear_screen_method()



    if
    MenuChoice == '6' :

    sw.sfw_delete()

    sw.clear_screen_method()



    if
    MenuChoice == '7' :

    root.pass_method()

    if
    root.pass_method()==1:

    menu_root = '''

    1- Delete all book records

    2- Delete all software records

    3- Creat a backup copy

    4- Change your password

    Enter your choice :

    '''



    ch=raw_input(menu_root)

    if
    ch == '1':

    bk.empty_file_method('BookDetails')

    root.clear_screen_method()

    if
    ch == '2':

    sw.empty_file_method('SoftwareDetails')

    root.clear_screen_method()

    if
    ch == '3' :

    root.backup()

    root.clear_screen_method()

    if
    ch == '4' :

    root.change_pass()

    root.clear_screen_method()





    bk=Books()

    sw=Software()

    root=Root()

    MainMenu()








    اللائحة كما نلاحظ بسيطة جدا فكلما اختار المستخدم رقما نقوم باستدعاء الميثود الخاصة للقيام بالعمل فقط اريد ان انوه للسطر التالي

    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:30

    اللائحة كما نلاحظ بسيطة جدا فكلما اختار المستخدم رقما نقوم باستدعاء الميثود الخاصة للقيام بالعمل فقط اريد ان انوه للسطر التالي


    كود PHP:




    if MenuChoice == '7' :

    root.pass_method()

    if
    root.pass_method()==1:

    menu_root = '''

    1- Delete all book records

    2- Delete all software records

    3- Creat a backup copy

    4- Change your password

    Enter your choice :

    '''








    عندما يدخل مدير النظام نقوم باستدعاء mpass_method فان عادت هذه
    الأخيرة على قيمة 1 فهذا معناه ان كلمة المرور صحيحة فنعرض له اللائحة
    الخاصة به


    *










    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:36










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


    تم بحمد الله
    avatar
    MOTASEM
    عضو بفريق عمل الموقع
    عضو بفريق عمل الموقع

    ذكر
    عدد الرسائل : 57
    العمر : 28
    الجنسية : فلسطيني
    السٌّمعَة : 1
    نقاط : 3484
    تاريخ التسجيل : 08/07/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف MOTASEM في الإثنين 9 مارس - 17:41

    السلام عليكم و رحمة الله و براكاته .
    قد استفدنا كثيرا من هذه الدورة التي اشتقنا لإكمالها . نرجو أن تكون في صحة و عافية لتنهي ما شغلت فكرنا به يا أخ DJONI .
    بارك الله فيك مرة أخرى .
    أرسل لك هذا الجزء من
    برنامج المكتبة Library مع تعديل على مستوى البحث عن كتاب و إضافة طريقة
    البحث ( بالكود code_library أو عنوان الكتاب او مؤلف الكتاب).
    أرجو أن أكون أثريت الموضوع و لو بفكرة للبحث و المشاركة . ننتظر نقدك و إصلاحك لأخطائنا .
    الكود
    import os
    import shutil
    ClearScreen=os.system('clear')


    class Library:
    def __init__(self,LibCode='',Titre='',Prix='',FileName =''):
    self.LibCode=LibCode
    self.Titre=Titre
    self.Prix=Prix
    self.FileName=FileName

    def lib_method(self):
    LibCode=raw_input('Enter the library code :')
    Titre=raw_input('Enter the titre :')
    Prix=raw_input('Enter the prix :')
    return LibCode , Titre , Prix

    def clear_screen_method(self):
    KeyInput=0
    while not KeyInput:
    ch=raw_input('Press Entry to continue ... ')
    if ch!='':
    print
    print 'Wrong key oressed !! pleas press Entry key '
    else:
    ClearScreen=os.system('clear')
    KeyInput=1

    def search_method(self):
    global k
    print '''
    entrez votre chois 1 ,2 ou 3 :
    ##############################
    1* cherche par code
    2* cherche par Titre
    3* cherche par auteur '''
    chois=raw_input('Entrez votre chois 1 , 2 ou 3 : ')
    if chois not in ('1','2','3'):
    print ' recommencez s.v.p '
    chois=raw_input('Entrez votre chois 1 , 2 ou 3 : ')
    if chois=='1':
    k=0
    if chois=='2':
    k=1
    if chois=='3':
    k=2


    class Books(Library):
    def __init__(self,Auteur='',Maison='',PageCount=''):
    self.Auteur=Auteur
    self.Maison=Maison
    self.PageCount=PageCount

    def bks_method(self):
    BookFile=open('BookDetails','a')
    B_libM=self.lib_method()


    Auteur=raw_input('Enter the name of auteur : ')
    Maison=raw_input('Enter the name of Maison : ')
    PageCount=raw_input('Enter the name of pagecount : ')

    BookFile.write(B_libM[0] + ',')
    BookFile.write(B_libM[1] + ',')
    BookFile.write(Auteur + ',')
    BookFile.write(Maison + ',')
    BookFile.write(PageCount + ',')
    BookFile.write(B_libM[2] + '\n')

    BookFile.close()
    print '''
    You have entered the following details for abook :
    ==================================================
    Library code : %s
    Titre : %s
    Auteur : %s
    Maison : %s
    PageCount : %s
    Prix : %s''' %(B_libM[0], B_libM[1], Auteur, Maison, PageCount, B_libM[2])

    def books_method(self):
    BookDet=open('BookDetails','r')
    BookDet.seek(0,2)
    BDFile=BookDet.tell()
    if BDFile==0L:
    print
    print 'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW'
    print '********** No records avalibale **********'
    print 'wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww'
    print
    BookDet.close()
    else:
    SB_Method=self.search_method()
    BookDet=open('BookDetails','r')
    lines=BookDet.readlines()
    size=len(lines)
    name=raw_input('enter code ,Titre or Auteur book :')
    i=0
    reco=""
    while i < size:
    line=lines[i]
    reco=line.split(',')
    #fd=line.find(name)
    if reco[k]==name :
    print'''
    View details for the book :
    $$$$$$$$$$$$$$$$$$$$$$$$$$$

    Library code : %s
    Titre : %s
    Auteur : %s
    Maison : %s
    PageCount : %s
    Prix : %s''' %(reco[0], reco[1], reco[2], reco[3], reco[4], reco[5])
    i=i+1
    else:
    print ' no records avalibale '




    class Root(Books):
    def __init__(self):
    mpass=''
    def pass_method(self):
    rootfile=open('root_sys','a')
    rootfile.seek(0,2)
    flen=rootfile.tell()
    if flen==0L:
    print '******** NEW PASSWORD *********'
    mpass=raw_input('Enter a password :')
    rootfile.write(mpass)
    rootfile.close()
    return 1
    else:
    rootfile=open('root_sys',a,)
    ps=rootfile.read()
    rpass=raw_input('Enter the password :')
    rootfile.close()
    if rpass==ps:
    return 1
    else:
    print 'Wrong password'




    def MainMenu():
    # display the main menu, takes input for chiceself
    # and calls an appropriate method based on the choice
    MenuItems='''
    <#>############################################< #>
    <#>############################################< #>
    <#>## LIBRARY PROGRAM ##<#>
    <#>############################################< #>

    * Main Menu *
    ===============
    1- Enter Details for books
    2- Enter details for software
    3- View details of books
    4- View details of software
    5- Delete a record - book -
    6- Delete a record - software -
    7- -.* Root *.-
    8-Quit

    Enter chice (1 - Cool: '''

    done=0
    while not done:
    MenuChoice=raw_input(MenuItems)
    ClearScreen=os.system('clear')
    print 'you entred : %s' %(MenuChoice)
    if MenuChoice not in '12345678':
    print
    print 'wrong choice . Enter 1, 2, 3, 4, 5, 6, 7 or 8'
    print
    else:
    if MenuChoice=='8':
    done=1
    if MenuChoice=='1':
    print
    print '*************** Enter Book Details ****************'
    print
    bk.bks_method()
    root.clear_screen_method()
    if MenuChoice=='3':
    print
    bk.books_method()
    root.clear_screen_method()

    bk=Books()
    root=Root()
    MainMenu()
    التغيير أشرت إلية باللون الأزرق . لم أستطع أن أرسل الكود بألوانه التي كتب بها كما تفعل أنت لأني أجهل الطريقة .
    نحن ننتظر ما دامت الحياة بها متسع لنا .


    _________________
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:48



    مشكور على مجهود معتصم
    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:55

    بسم الله الرحمن الرحيم
    و الصلاة و السلام على اشرف المرسلين سيدنا محمد و صحبه اجمعين و تابعيه و تابعيهم بإحسان الى يوم الدين
    الإخوة الأفاضل السلام عليكم و رحمة الله و بركاته
    درسنا اليوم يا اخوة هو آخر درس في الـOOP قبل الإنطلاق للواجهات الرسومية
    و يعتبر هذا الدرس تكملة و بعض الإضافات التي ربما تحتاجها في المستقبل
    سنرى بعض الميثود الخاصة
    special method تقدم لنا خدمات قد نحتاج لها في حالا ت كثيرة

    قبل ان نبدء في الspecial method نمر بسرعة على الbuilt-in function
    و هي الأخرى دوال خاصة تتعامل مع الكلاس او الinstance او object و
    خاصيتها انها تبنى داخل ما ذكرناه الآن و تقدم لنا بعض المعلومات او
    الخصائص
    و لهذا سميت built-in function لأننا نقوم باستعمالها مع instance للكلاس
    مثالا فتقوم هذه الدوال ببنيان نفسها داخل الكلاس ثم تقوم بالعمل المرجو
    منها

    سيكون الدرس عبارة عن تعريف مثال و شرح بدون اطالة كثيرة

    issubclass()
    هي عبارة عن built-in function تخبرنا هل الكلاس عبراة عن sub-class او لا

    و تكون الصيغة الكتابية كالتالي
    issubclass(sub, sup)

    مثال

    كود PHP:




    class A:

    pass

    class B(A):

    pass

    print issubclass(B,A)








    سيكون الناتج طبعا True


    isinstance()
    نفس الدالة السابقة تقريبا لكن هذه الأخيرة تخبرنا هل مابين القوسين instance او لا
    مثال

    كود PHP:




    class A:

    pass

    class B(A):

    pass

    a
    =A()

    b=B()

    print
    isinstance(a,A)

    print
    isinstance(b,B)








    الناتج ايضا عبارة عن True True


    hasattr()
    هذه ايضا تعتبر دالة بوليين و تعود تستعمل لمعرفة الـattribut بحيث تعود على True او False حسب الحالة
    مثال

    كود PHP:




    class A:

    def __init__(self):

    self.name="chouaib"


    a=A()

    print
    hasattr(a, 'name')








    getattr()
    تقوم هذه الدالة بطباعة قيمة attribut
    ففي نفس المثال السابق نطبق هذه الدالة و سنرى الناتج

    كود PHP:




    a=A()

    print
    getattr(a, 'name')








    سيكون الناتج القيمة التي المسندة الـattribut name


    setattr()
    تقوم هذه الدالة كما يدل اسمها بوضع attribut جديد للinstance و تضيف لهذا الأخير القيمة التي سيحجزها
    و تكون صيغتها كالتالي
    setattr(instance, new_attr, value_attr)
    مثال

    كود PHP:




    class A:

    def __init__(self):

    self.name="chouaib"


    a=A()

    setattr(a, 'age', '22')








    و عند استعمال getattr


    كود PHP:




    print getattr(a, 'age')








    سيكون الناتج 22

    delattr()
    تقوم هذه الدالة بحذفattribut معين

    كود PHP:




    class A:

    def __init__(self):

    self.name="chouaib"


    a=A()

    setattr(a, 'age', '22')

    print
    getattr(a, 'age')

    delattr(a, 'age')

    print
    dir(a)








    هذه هي اهم الـbuilt-in function مازالت اخرى لم نراها اليوم لأن المجال لا سيمح بهذا

    avatar
    DJONI
    المدير العام على مجموعة مواقع STARMEDIA
    المدير العام على مجموعة مواقع STARMEDIA

    ذكر
    عدد الرسائل : 358
    العمر : 33
    الجنسية : Tunisien
    السٌّمعَة : 1
    نقاط : 16059
    تاريخ التسجيل : 22/06/2008

    رد: أول دورة من نوعهــا على صعيد المواقع العربية : دورة Python

    مُساهمة من طرف DJONI في الإثنين 9 مارس - 17:56



    customising class

    طيب الآن رأينا فيما سبق الدوال built-in و رأينا كيفية عملها مذا لو
    اردنا ان نستعملها داخل الكلاس نفسها مثلا setattr() استعملناها قبل قليل
    مع instance فهل نستطيع استعمالها داخل الكلاس الاصلية ؟؟
    كما عودتنا هذه اللغة الرائة نستطيع فعل هذا بكل سلاسة و هذا سيمنحنا فائدة كبيرة جدا
    مثلا انت امام مشروع او كود لحل مشكل معين و لم تحدد مسبقا مالذي ستستعمله بالضبط من الأتريبيت
    او اذا كانت لديك عدة احتمالات او تريد ان تتيح للمستعمل برنامجك عدة
    خيارات في هذه الحالة تقدم لك لغة البايثون امكانية استعمال مجموعة هائلة
    من special methodلتخصيص الكلاس التي ستستعملها في اكوادك حسب الحالات
    التي سيواجهها البرنامج
    و لهذا يسمى هذا بالـ customizing class اي انك تخصص الكلاس او تشخصها حسب حالتك
    و شكل هذه الـ special method كالتالي
    ___اسم الميثود___
    اي الإسم يتوسط الخطان
    سنخصص الدرس على اهم هذه الميثود و كيفية استعمالها طبعا

    __str__

    عبارة عن ميثود خاصة توفرها لنا البايثون تقوم هذه الميثود بالعودة على قيمة (---سترينق)

    مثال

    كود PHP:




    class Login:

    def __init__(self, name):

    self.login=name[0:2]+'_'+name



    def __str__
    (self):

    return
    " login : %s"%(self.login)


    user=raw_input('enter your name :')

    login=Login(user)

    print
    login








    كما نلاحظ في المثال تقوم الميثود __init__ باستقبال الـattribut ثم تكون attribut login من قطعتين
    و الميثود الخاصة __str__ تعود على قيمة login
    و ما يثبت هذه العودة الكلاس return على سلسلة اننا لو قمنا باستعمال
    print للكلاس ستظهر لنا السلسلة التي تعود عليها __str__ كالمثال التالي

    كود PHP:




    class A:

    def __init__(self):

    self.name="My name "

    def __str__(self):

    return
    self.name


    print A()








    ا
    طيب نفرض انك انشأت كلاس و لا تريد ان تحدد مسبقا قيم attribut أو أنك
    تريد ان تحدد القيم التي ستسند للـattribut اي انك لا تريده ان تقبل كل
    القيم في هذا الحالة يتوجب عليك استعمال
    __setattr__ و __getattr__

    مثال
    في المثال التالي لدينا كلاس اسمها CLient
    تحتوي هذه الكلاس بالإضافة للبناء __init__ على 3 special method اخرى
    للكلاس صفتان و هما name و age
    و نظرا لأهمية مشروعنا لا نريد ان يكون اسم العمليل (name) يحتوي على
    ارقام حتى يكون اسم رسمي و معتمد و لا نريد ايضا ان يكون عمر العميل اقل
    من 20 سنة
    و هنا وصلنا للبيت القصيد لدينا صفتان و لا نريد ان تقبل الكلاس كل القيم المسندة لهذه الصفات عن طريق instance
    فنريد ان نحدد القيم و نعمل كما سمينا هذا اول الدرس customizing للكلاس

    كود المثال

    كود PHP:




    class Client:

    def __init__(self, name, age):

    self.name=name

    self
    .age=age



    def __setattr__
    (self, att, val):

    if
    att == "name":

    if
    val.isalpha():

    self.__dict__[ "_name" ] = val

    else :

    print
    "Invalid name"



    elif att == "age":

    if
    val >= 20:

    self.__dict__[ "_age" ] = val

    else :

    print
    " sorry !! age must be > than 20 "



    def __getattr__(self, att):

    if
    att == "name":

    return
    self._name

    elif att
    == "age":

    return
    self._age



    def __str__
    (self):

    return
    " %s : %s " %(self._name, self._age)








    تقوم الميثود __setattr__ بإسناد قيمة للـattribut خاص بـ object معين
    الميثود تحتوي على 3 argument الreferenc self و اسم الـ attribut و
    المعبر عنه بـ att و القيمة التي ستسند له (val) و بعدها نقوم بمقارنة
    اسمattribut
    if att == "name":
    إذا كان اسم الـattribut مطابق لـ name
    و
    if val.isalpha():
    إذا كانت القيمة التي ستسند للattribut عبارة عن سلسلة حرفية بحثة اي لا تحتوي على ارقام او اشارات خاصة
    اذا تحقق كل هذا
    self.__dict__[ "_name" ] = val

    سنسند هذه القيمة للattribut _name
    و ذلك بالدخول لمفتاح هذا الattribut بواسطة __dict__
    و هنا ينتهي عمل __setattr__
    طيب اذا لم تكن القيمة صحيحة و لم يتحقق الشرط ستظهر للمستخدم رسالة تنبؤه ان الإسن الذي ادخله غير صحيح
    فلو انشأنا instance كالتالي

    كود PHP:




    user=Client('chouaib', 19)








    مباشرتا سيطبع لنا االمفسر الرسالة التالية
    sorry !! age must be > than 20

    او اذا ادخلنا الإسم خاطئ

    كود PHP:




    user=Client('chouaib2008', 22)








    ستكون الرسالة
    Invalid name

    و هذه هي الفائدة المرجوة من الميثود الخاصة نحدد بها مسبقا اسنادات الـattribut

    **********
    للتوضيح
    تحتوي الميثود__dict__ على مجموعة attribut و القيمة التي اسندت لها
    مثال

    كود PHP:




    class A:

    def __init__(self):

    self.a='aaaaaaa'

    self.b='bbbbbbb'


    inst=A()

    print
    inst.__dict__








    سيكون الناتج

    كود PHP:




    {'a': 'aaaaaaa', 'b': 'bbbbbbb'}








    *******
    __getattr__


    كود PHP:




    def __getattr__(self, att):

    if
    att == "name":

    return
    self._name

    elif att
    == "age":

    return
    self._age








    تعمل هذه الميثود عندما يطلب اوبجيكت او instance قيمة attribut معين
    ففي المثال الذي لدينا نقوم اولا بمقارنة اسم الattribut فاذا تطابق مع
    المستدعي تقوم الميثود __getattr__ بالبحث في __dict__ عن اسم الattribut
    فان وجد سيعود هذا الattribut على هذه القيمة
    مثلا

    كود PHP:




    user=Client('chouaib', 22)

    print
    user.name








    هنا تقوم __getattr__ بالبحث عن هذاattribut داخل __dict__ فإن وجدته ستسند له القيمة الخاصة به و هي في المثال " chouaib"

    طيب ان لم تجده في حالة مثلا لو ادخلنا العمر خاطئ

    كود PHP:




    user=Client('chouaib', 2)

    print
    user.age








    ستكون قيمتهNone

    هذا شرح لأهم الميثود الخاصة و اكثرها استعمالا نوعا ما مازال هناك عدد
    هائل منها يلزمنا كتاب لشرحها كلها و لكن لمن اراد الإستزادة سيجد مبتغاه
    في الرابط التالي
    http://www.python.org/doc/2.3.5/ref/...te-access.html

    تم بحمد الله

      الوقت/التاريخ الآن هو الثلاثاء 16 يناير - 16:39