🐍 دليل تعليمي شامل لبرمجة Python

كورس الأستاذ أحمد بكر - من المبتدئ إلى المتقدم


**ملاحظة مهمة:** هذا الدليل مصمم للتحويل إلى PDF مع خلفية داكنة (Dark Mode) لراحة العينين.

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

  1. المقدمة
  2. المحاضرة 3: المتغيرات وأنواع البيانات
  3. المحاضرة 4: السلاسل النصية و Escape Sequences
  4. المحاضرة 5: دوال السلاسل النصية والتنسيق
  5. المحاضرة 6: القوائم والمجموعات والمصفوفات والقواميس
  6. المحاضرة 7: المقارنات والمنطق
  7. المحاضرة 8: الجمل الشرطية
  8. المحاضرة 9: الحلقة while
  9. المحاضرة 10: الحلقة for
  10. المحاضرة 11: الدوال Functions
  11. المحاضرة 12: الدوال المدمجة
  12. المحاضرة 13: البرمجة الكائنية OOP - الأساسيات
  13. المحاضرة 14: OOP - Class Attributes
  14. المحاضرة 15: OOP - الوراثة Inheritance
  15. المحاضرة 16: OOP - التغليف Encapsulation
  16. المحاضرة 17: OOP - الكلاسات المجردة Abstract Classes
  17. المحاضرة 18: المكتبات القياسية - random
  18. المحاضرة 19-20: المكتبات المحلية
  19. نصائح Clean Code
  20. الخلاصة النهائية

المقدمة

ما هي البرمجة؟

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

لماذا Python (بايثون)؟

  1. سهلة التعلم: صياغتها قريبة من اللغة الطبيعية
  2. قوية ومتعددة الاستخدامات: تستخدم في تطوير الويب، الذكاء الاصطناعي، تحليل البيانات، وغيرها
  3. مجتمع كبير: ملايين المطورين حول العالم يستخدمونها
  4. مكتبات ضخمة: آلاف المكتبات الجاهزة لتسهيل عملك

ما ستتعلمه في هذا الكورس


المحاضرة 3: المتغيرات وأنواع البيانات

ما هو المتغير (Variable)؟

المتغير هو صندوق تخزين تحفظ فيه بيانات. كل متغير له اسم ونوع وقيمة.

أنواع البيانات الأساسية في Python

1. النص (String - str)

first_name = "ahmed"  # إنشاء متغير نصي يحتوي على الاسم الأول
last_name = "bakr"  # إنشاء متغير نصي يحتوي على الاسم الأخير
full_name = first_name + " " + last_name  # دمج الاسم الأول مع الأخير في متغير واحد
print(full_name)  # طباعة الاسم الكامل

النتيجة: ahmed bakr

2. الأرقام الصحيحة (Integer - int)

age = 25  # إنشاء متغير عددي صحيح يمثل العمر
print(age)  # طباعة قيمة العمر

النتيجة: 25

3. الأرقام العشرية (Float)

pi = 3.14  # إنشاء متغير عشري float لتمثيل قيمة تقريبية للعدد π
print(pi)  # طباعة قيمة المتغير pi

النتيجة: 3.14

4. معرفة نوع المتغير (type)

print(type(first_name))  # طباعة نوع المتغير first_name (str)
print(type(age))  # طباعة نوع المتغير age (int)
print(type(pi))  # طباعة نوع المتغير pi (float)

النتيجة:

<class 'str'>
<class 'int'>
<class 'float'>

📝 ملاحظات مهمة


المحاضرة 4: السلاسل النصية و Escape Sequences

ما هي Escape Sequences؟

هي رموز خاصة تبدأ بعلامة \ لتمثيل أحرف خاصة في النص.

أمثلة على Escape Sequences

print("hello python")  # طباعة نص بسيط

print("ahmed bakr 'hello'")  # استخدام علامات تنصيص مفردة داخل نص مزدوج
print("ahmed bakr \"hello\"")  # استخدام \" لطباعة علامة التنصيص المزدوجة داخل النص
print("I like \\")  # استخدام \\ لطباعة علامة \ نفسها

print("I like \nyoutube")  # استخدام \n لطباعة كل كلمة/جملة في سطر جديد
print("I like \nyoutube \nand facebook \nand telegram")  # طباعة النص على عدة أسطر

التقطيع (Slicing) في السلاسل النصية

user = "ahmed bakr"  # نص لاختبار التقطيع (Slicing)
print(user[0])  # طباعة أول حرف a
print(user[4])  # طباعة الحرف الخامس d
print(user[6])  # طباعة الحرف السابع b
print(user[-1])  # طباعة آخر حرف r (العدد السالب يبدأ من النهاية)
print(user[1])  # طباعة الحرف الثاني h

النتيجة:

a
d
b
r
h

التقطيع المتقدم (Advanced Slicing)

user = "ahmedbakr"  # نص بدون مسافات
print(user[0:5])  # طباعة الحروف من الأندكس 0 حتى قبل 5 (ahmed)
print(user[0:6])  # طباعة الحروف من 0 إلى 6 (ahmedb)
print(user[0:-1])  # طباعة من البداية حتى قبل الأخير (ahmedbak)
print(user[0:])  # طباعة من البداية للنهاية (ahmedbakr)
print(user[5:])  # طباعة من الأندكس 5 للنهاية (bakr)
print(user[0:6:1])  # طباعة من 0 إلى 6 بخطوة 1 (ahmedb)
print(user[0:6:2])  # طباعة من 0 إلى 6 بخطوة 2 (تخطي حرف) (amd)
print(user[0:10:3])  # طباعة من 0 إلى 10 بخطوة 3 (aea)
print(user[::-1])  # طباعة النص بالعكس (rkbademha)

دوال السلاسل النصية الأساسية

msg = "hello Qais, and AHMED, and mahmoud"  # نص مختلط الأحرف
print(len(msg))  # معرفة عدد الأحرف (34)
print(msg.lower())  # تحويل النص إلى حروف صغيرة
print(msg.upper())  # تحويل النص إلى حروف كبيرة

دمج السلاسل النصية (Concatenation)

one = "ahmed"  # نص أول
two = "bakr"  # نص ثاني
age = 25  # رقم (لا يمكن دمجه مباشرة مع النص)

print(one + two)  # دمج بدون مسافات (ahmedbakr)
print("hello" + one + two)  # دمج مع كلمة hello (helloahmedbakr)
print("hello " + one + two)  # دمج مع مسافة بعد hello (hello ahmedbakr)
print("hello " + one + " " + two)  # دمج مع مسافات بين الكلمات (hello ahmed bakr)

📝 ملاحظات مهمة


المحاضرة 5: دوال السلاسل النصية والتنسيق

دوال تنظيف النص

name = "          mester perfect          "  # نص يحتوي على مسافات في البداية والنهاية
print(name.strip())  # إزالة المسافات من البداية والنهاية

النتيجة: mester perfect

دوال التنسيق

centered = "mester".center(20, "*")  # محاذاة النص في المنتصف داخل عرض 20 مع ملء الفراغ بـ *
print(centered)  # طباعة النص بعد المحاذاة

النتيجة: *******mester*******

دوال البحث والاستبدال

msg = "I love python , python is very easy"  # نص لتجربة الدوال المختلفة
print(msg.replace("python", "PHP"))  # استبدال كلمة python بكلمة PHP في النص
print(msg.count("python"))  # عدّ عدد مرات تكرار كلمة python في النص

النتيجة:

I love PHP , PHP is very easy
2

طرق التنسيق (Formatting) في Python

الطريقة القديمة (Old Style - %)

name = "ahmed baker"  # اسم المستخدم
age = 25  # عمر المستخدم
rank = 10.5  # ترتيب أو تقييم المستخدم
print("hello my name is: %s and my age is: %d and my rank is: %.1f" % (name, age, rank))  # تنسيق باستخدام % القديم

النتيجة: hello my name is: ahmed baker and my age is: 25 and my rank is: 10.5

شرح الرموز: - %s = نص (string) - %d = رقم صحيح (integer) - %.1f = رقم عشري بمنزلة عشرية واحدة (float)

الطريقة الحديثة (f-string) - الأفضل ⭐

print(f"hello my name is {name} and my age is {age} and my rank is {rank}")  # تنسيق باستخدام f-string الحديث

النتيجة: hello my name is ahmed baker and my age is 25 and my rank is 10.5

📝 لماذا f-string أفضل؟

  1. أسهل في القراءة: الكود أوضح
  2. أسرع في التنفيذ: أداء أفضل
  3. أكثر مرونة: يمكن وضع تعبيرات داخل {}

المحاضرة 6: القوائم والمجموعات والمصفوفات والقواميس

1. القائمة (List) - قابلة للتعديل

tech_window_team = ["hero", "ahmed", "qais"]  # إنشاء قائمة تحتوي على أسماء الفريق
tech_window_team.append("ali")  # إضافة اسم جديد إلى القائمة
print(tech_window_team)  # طباعة القائمة بعد الإضافة

النتيجة: ['hero', 'ahmed', 'qais', 'ali']

خصائص List: - ✅ قابلة للتعديل (Mutable) - ✅ تقبل التكرار - ✅ مرتبة (Ordered) - ✅ تستخدم []

2. المجموعة (Set) - لا تقبل التكرار

team_set = {"hero", "ahmed", "qais"}  # إنشاء مجموعة set لا تقبل التكرار
team_set.add("ali")  # إضافة عنصر جديد إلى المجموعة
print(team_set)  # طباعة المجموعة بعد الإضافة

النتيجة: {'hero', 'ahmed', 'qais', 'ali'}

خصائص Set: - ✅ لا تقبل التكرار (Unique) - ❌ غير مرتبة (Unordered) - ✅ قابلة للتعديل - ✅ تستخدم {}

3. المصفوفة (Tuple) - ثابتة

team_tuple = ("hero", "ahmed", "qais")  # إنشاء مصفوفة tuple ثابتة لا يمكن تعديل عناصرها
print(team_tuple[0])  # طباعة أول عنصر في المصفوفة

النتيجة: hero

خصائص Tuple: - ❌ غير قابلة للتعديل (Immutable) - ✅ تقبل التكرار - ✅ مرتبة - ✅ تستخدم ()

4. القاموس (Dict) - مفاتيح وقيم

user = {"user_name": "ahmed", "age": 25}  # إنشاء قاموس يحتوي على مفتاحين وقيمتين
print(user["user_name"])  # طباعة اسم المستخدم من القاموس
print(user.get("age", 0))  # طباعة العمر باستخدام get مع قيمة افتراضية

النتيجة:

ahmed
25

خصائص Dict: - ✅ قابلة للتعديل - ✅ مرتبة (من Python 3.7+) - ✅ لا تقبل تكرار المفاتيح - ✅ تستخدم {} مع key: value

التحويل بين الأنواع (Type Casting)

phone_number = 7594322297  # رقم هاتف كنص أو رقم
phone_str = str(phone_number)  # تحويل الرقم إلى نص str
print(phone_str)  # طباعة الرقم بعد تحويله لنص
print(type(phone_str))  # طباعة نوع المتغير بعد التحويل

النتيجة:

7594322297
<class 'str'>

📊 جدول مقارنة

النوع قابلة للتعديل تقبل التكرار مرتبة الرمز
List []
Set {}
Tuple ()
Dict ❌ (مفاتيح) {key: value}

المحاضرة 7: المقارنات والمنطق

عمليات المقارنة (Comparison Operators)

print(50 < 40)  # مقارنة: هل 50 أصغر من 40؟ النتيجة False
print(50 > 40)  # مقارنة: هل 50 أكبر من 40؟ النتيجة True
print(50 <= 50)  # مقارنة: هل 50 أصغر من أو يساوي 50؟ النتيجة True
print(50 == 50)  # مقارنة: هل 50 يساوي 50؟ النتيجة True
print(50 != 49)  # مقارنة: هل 50 لا يساوي 49؟ النتيجة True

النتيجة:

False
True
True
True
True

العمليات المنطقية (Logical Operators)

AND (و) - كل الشروط يجب أن تكون True

print(50 == 50 and 50 > 48)  # استخدام and: الشرطان صحيحان، النتيجة True

النتيجة: True

قاعدة AND: النتيجة True فقط إذا كان كل الشروط True

OR (أو) - يكفي شرط واحد True

print(50 == 50 or 50 < 48)  # استخدام or: شرط واحد صحيح يكفي، النتيجة True

النتيجة: True

قاعدة OR: النتيجة True إذا كان أي شرط True

NOT (ليس) - عكس النتيجة

print(not 50 == 50)  # استخدام not: عكس نتيجة الشرط، النتيجة False

النتيجة: False

قاعدة NOT: يعكس النتيجة (TrueFalse و FalseTrue)

📝 جدول الحقيقة (Truth Table)

A B A AND B A OR B NOT A
True True True True False
True False False True False
False True False True True
False False False False True

المحاضرة 8: الجمل الشرطية

if / elif / else

name = "ahmed"  # اسم المستخدم
country = "egypt"  # دولة المستخدم
course = "Python Course"  # اسم الكورس
price = 100  # السعر الأساسي للكورس

if country == "egypt":  # إذا كانت الدولة هي مصر
    final_price = price - 90  # خصم 90 دولار للمستخدم من مصر
elif country == "ksa":  # إذا كانت الدولة هي السعودية
    final_price = price - 50  # خصم 50 دولار للمستخدم من السعودية
else:  # في باقي الدول لا يوجد خصم
    final_price = price  # السعر بدون خصم

print(f"hello {name}, this is {course}, your final price is: ${final_price}")  # طباعة رسالة السعر النهائي

النتيجة: hello ahmed, this is Python Course, your final price is: $10

if القصيرة (Ternary Operator)

movie = "القناص"  # اسم الفلم
movie_rate = 18  # العمر المناسب للفلم
age = 15  # عمر المستخدم
print("the movie is not good for u!" if age < movie_rate else "the movie is good for u!")  # if قصيرة داخل print

النتيجة: the movie is not good for u!

الصيغة: النتيجة_إذا_True if الشرط else النتيجة_إذا_False

📝 ملاحظات مهمة


المحاضرة 9: الحلقة while

الحلقة while الأساسية

a = 0  # متغير لبدء العد من الصفر
while a <= 10:  # تكرار حتى يصل a إلى 10
    print(a)  # طباعة القيمة الحالية
    a += 1  # زيادة قيمة a بمقدار 1 في كل دورة

النتيجة:

0
1
2
3
4
5
6
7
8
9
10

while مع القوائم

friends = ["Ahmed", "Bakr", "Mohammed", "Ali"]  # قائمة بأسماء الأصدقاء
index = 0  # مؤشر البداية
while index < len(friends):  # التكرار على جميع عناصر القائمة
    print(f"#{index + 1} {friends[index]}")  # طباعة رقم وترتيب الصديق
    index += 1  # زيادة المؤشر بمقدار 1

النتيجة:

#1 Ahmed
#2 Bakr
#3 Mohammed
#4 Ali

مشروع: جمع المواقع المفضلة ⭐

my_fav_web = []  # قائمة فارغة لحفظ روابط المواقع المفضلة
max_web = 3  # عدد المرات المتاحة للمستخدم لإضافة مواقع (عدد المواقع المسموح به)
while max_web > 0:  # طالما ما زالت هناك محاولات متبقية، استمر في طلب المواقع
    web = input('ادخل الموقع بدون "https://": ').strip().lower()  # طلب رابط الموقع من المستخدم، إزالة الفراغات من البداية والنهاية، وتحويله لحروف صغيرة
    web = web.replace(" ", "")  # إزالة أي مسافات داخل الرابط نفسه حتى لا تسبب مشاكل في الرابط
    my_fav_web.append(f"https://{web}")  # إضافة الرابط بعد تركيب https:// في بداية الرابط وتخزينه في القائمة
    max_web -= 1  # تقليل عدد المحاولات المتبقية بمقدار 1 بعد كل إدخال
    print(f"تم إضافة الموقع، عدد الأماكن المتبقية: {max_web}")  # إظهار رسالة للمستخدم بعد الإضافة توضح عدد الأماكن المتبقية

print("قائمة المواقع المفضلة:", my_fav_web)  # في النهاية طباعة جميع المواقع المفضلة التي أدخلها المستخدم

📝 ملاحظات مهمة


المحاضرة 10: الحلقة for

for مع القوائم

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # قائمة أرقام من 1 إلى 10
for num in numbers:  # التكرار على جميع الأرقام في القائمة
    if num == 5:  # إذا وصلنا للرقم 5
        continue  # تخطي هذا الرقم وعدم طباعته
    print(num)  # طباعة الرقم الحالي

النتيجة:

1
2
3
4
6
7
8
9
10

for مع القواميس المتداخلة

tec_window_team = {  # قاموس يحتوي على مستخدمين ومهاراتهم
    "ahmed": {"HTML": "90%", "CSS": "70%"},
    "perfect": {"JavaScript": "85%", "Ruby": "75%"},
}

for user in tec_window_team:  # التكرار على أسماء المستخدمين
    for skill in tec_window_team[user]:  # التكرار على مهارات كل مستخدم
        level = tec_window_team[user][skill]  # مستوى المهارة للمستخدم الحالي
        print(f"المستخدم {user} يجيد {skill} بمستوى {level}")  # طباعة اسم المستخدم ومهارته ومستواه

النتيجة:

المستخدم ahmed يجيد HTML بمستوى 90%
المستخدم ahmed يجيد CSS بمستوى 70%
المستخدم perfect يجيد JavaScript بمستوى 85%
المستخدم perfect يجيد Ruby بمستوى 75%

📝 الفرق بين while و for

while for
تستخدم عندما لا تعرف عدد التكرارات تستخدم عندما تعرف عدد التكرارات
تحتاج تحديث المتغير يدويًا تحديث تلقائي
أكثر مرونة أكثر بساطة

المحاضرة 11: الدوال Functions

ما هي الدالة؟

الدالة هي كتلة من الكود يمكن استدعاؤها عدة مرات دون إعادة كتابتها.

دالة بسيطة

def say_hello(name):  # تعريف دالة تأخذ الاسم وتطبع رسالة ترحيب
    print(f"hello {name}")  # طباعة رسالة ترحيب مع الاسم

say_hello("ahmed")  # استدعاء الدالة مع تمرير اسم ahmed

النتيجة: hello ahmed

دالة مع return

def calculator(n1, n2):  # تعريف دالة تجمع رقمين
    print(n1 + n2)  # طباعة ناتج جمع الرقمين

calculator(10, 20)  # استدعاء الدالة لحساب 10 + 20

النتيجة: 30

دالة مع قيمة افتراضية (Default Value)

def full_name(first, last, age=18):  # تعريف دالة تحتوي على قيمة افتراضية للسن
    print(f"hello {first} {last}, your age is: {age}")  # طباعة الاسم بالكامل والعمر

full_name("ahmed", "bakr")  # استدعاء الدالة بدون تمرير العمر (يستخدم القيمة الافتراضية)

النتيجة: hello ahmed bakr, your age is: 18

دالة lambda (دالة مجهولة)

my_function = lambda: "hello ahmed"  # دالة lambda بسيطة ترجع نصًا
print(my_function())  # طباعة ناتج دالة lambda

النتيجة: hello ahmed

📝 ملاحظات مهمة


المحاضرة 12: الدوال المدمجة Built-in Functions

all() - التحقق من كل العناصر

nums = [1, 2, 3, 4]  # قائمة أرقام صحيحة
print(all(nums))  # التحقق هل جميع العناصر تعتبر True؟ (القائمة بدون أصفار أو فراغ = True)

النتيجة: True

any() - التحقق من وجود عنصر واحد على الأقل

nums_with_zero = [1, 2, 0, 4]  # قائمة تحتوي على صفر
print(any(nums_with_zero))  # التحقق هل يوجد عنصر واحد على الأقل True؟ (النتيجة True)

النتيجة: True

sum(), min(), max()

total = sum(nums)  # جمع جميع الأرقام داخل القائمة
print(total)  # طباعة مجموع الأرقام

print(min(nums))  # طباعة أصغر رقم في القائمة
print(max(nums))  # طباعة أكبر رقم في القائمة

النتيجة:

10
1
4

map() - تطبيق دالة على كل عنصر

def format_name(text):  # دالة تنسيق نصي للاستخدام مع map
    return f"# {text.capitalize()} #"  # إرجاع النص مع أول حرف كبير وبداخل إطار #

names = ["mahmoud", "qais", "ahmed"]  # قائمة أسماء صغيرة الأحرف
formatted_names = map(format_name, names)  # تطبيق الدالة format_name على كل عنصر
for name in formatted_names:  # التكرار على النتائج
    print(name)  # طباعة الاسم بعد التنسيق

النتيجة:

# Mahmoud #
# Qais #
# Ahmed #

filter() - تصفية العناصر

def is_start_with_a(word):  # دالة للتحقق من بداية الكلمة بحرف a
    return word.startswith("a")  # إرجاع True إذا كانت الكلمة تبدأ بـ a

words = ["Ahmed", "ali", "amer"]  # قائمة كلمات لاختبار filter
filtered = filter(is_start_with_a, words)  # تصفية الكلمات التي تبدأ بحرف a
for w in filtered:  # التكرار على النتائج
    print(w)  # طباعة الكلمات التي تبدأ بحرف a

النتيجة:

ali
amer

المحاضرة 13: البرمجة الكائنية OOP - الأساسيات

ما هي البرمجة الكائنية (OOP)?

البرمجة الكائنية هي طريقة برمجة تعتمد على إنشاء كائنات (Objects) تحتوي على بيانات ووظائف.

المفاهيم الأساسية

مثال عملي: كلاس SiteMember

class SiteMember:  # تعريف كلاس يمثل عضو في الموقع
    def __init__(self, first_name, middle_name, last_name, gender):  # دالة البناء لاستقبال بيانات العضو
        self.first_name = first_name  # حفظ الاسم الأول كـ attribute
        self.middle_name = middle_name  # حفظ الاسم الأوسط كـ attribute
        self.last_name = last_name  # حفظ الاسم الأخير كـ attribute
        self.gender = gender  # حفظ نوع الجنس (ذكر/أنثى)

    def full_name(self):  # دالة لإرجاع الاسم الثلاثي كاملًا
        return f"{self.first_name} {self.middle_name} {self.last_name}"  # دمج الاسم الثلاثي في نص واحد

    def hello_user(self):  # دالة لطباعة رسالة ترحيب حسب الجنس
        if self.gender == "male":  # إذا كان المستخدم ذكر
            return f"hello Mr: {self.first_name}"  # ترحيب ب Mr
        elif self.gender == "female":  # إذا كانت أنثى
            return f"hello Ms: {self.first_name}"  # ترحيب ب Ms
        return self.first_name  # في حال لم يتم تحديد الجنس نرجع الاسم فقط

member1 = SiteMember("أحمد", "محمد", "بكر", "male")  # إنشاء عضو جديد ذكر
member2 = SiteMember("زينب", "محمد", "بكر", "female")  # إنشاء عضوة جديدة أنثى

print(member1.hello_user())  # طباعة رسالة الترحيب للعضو الأول
print(member2.hello_user())  # طباعة رسالة الترحيب للعضوة الثانية
print(member1.full_name())  # طباعة الاسم الثلاثي للعضو الأول

النتيجة:

hello Mr: أحمد
hello Ms: زينب
أحمد محمد بكر

📝 ملاحظات مهمة


المحاضرة 14: OOP - Class Attributes

Class Attributes vs Instance Attributes

class SiteMember:  # تعريف كلاس يمثل عضو في الموقع
    not_allowed_users = ["hell", "shit", "nacer", "perfect"]  # أسماء غير مسموح بها للتسجيل (Class Attribute)
    users_count = 0  # عدّاد لعدد المستخدمين الذين تم إنشاؤهم (Class Attribute)

    def __init__(self, first_name, middle_name, last_name, gender):  # دالة البناء للعضو
        self.first_name = first_name  # حفظ الاسم الأول للعضو (Instance Attribute)
        self.middle_name = middle_name  # حفظ الاسم الأوسط للعضو (Instance Attribute)
        self.last_name = last_name  # حفظ الاسم الأخير للعضو (Instance Attribute)
        self.gender = gender  # حفظ نوع جنس العضو (Instance Attribute)
        SiteMember.users_count += 1  # زيادة عدّاد المستخدمين عند إنشاء كل عضو جديد

    def full_name(self):  # دالة لإرجاع الاسم الثلاثي
        return f"{self.first_name} {self.middle_name} {self.last_name}"  # دمج الاسم الثلاثي

    def get_full_info(self):  # دالة لإرجاع معلومات كاملة عن العضو
        if self.first_name in SiteMember.not_allowed_users:  # التحقق إذا كان الاسم الأول في قائمة الممنوعين
            return f"هذا الاسم {self.first_name} غير مسموح به"  # رسالة توضح أن الاسم غير مسموح
        return f"مرحبًا {self.full_name()}، نوعك هو {self.gender}"  # إرجاع رسالة تحتوي على الاسم والنوع

    @classmethod
    def show_users_count(cls):  # دالة كلاس لعرض عدد المستخدمين
        return f"عدد المستخدمين الحاليين هو: {cls.users_count}"  # إرجاع عدد المستخدمين

member1 = SiteMember("أحمد", "محمد", "بكر", "male")  # إنشاء عضو جديد
member2 = SiteMember("زينب", "محمد", "بكر", "female")  # إنشاء عضوة جديدة

print(member1.get_full_info())  # طباعة معلومات العضو الأول
print(member2.get_full_info())  # طباعة معلومات العضوة الثانية
print(SiteMember.show_users_count())  # طباعة عدد المستخدمين الكلي

النتيجة:

مرحبًا أحمد محمد بكر، نوعك هو male
مرحبًا زينب محمد بكر، نوعك هو female
عدد المستخدمين الحاليين هو: 2

📝 الفرق بين Class Attribute و Instance Attribute

Class Attribute Instance Attribute
مشترك بين كل الكائنات خاص بكل كائن
يُعرّف خارج __init__ يُعرّف داخل __init__
يُصل إليه بـ ClassName.attr يُصل إليه بـ self.attr

المحاضرة 15: OOP - الوراثة Inheritance

ما هي الوراثة؟

الوراثة تسمح لـ كلاس ابن أن يرث خصائص ووظائف من كلاس أب.

مثال: كلاس الأب والابن

class Father:  # تعريف كلاس الأب
    def __init__(self, name, age):  # دالة البناء التي تستقبل الاسم والعمر
        self.name = name  # حفظ اسم الأب
        self.age = age  # حفظ عمر الأب

    def full_info(self):  # دالة لطباعة معلومات الأب
        print(f"اسمي هو: {self.name} وعمري هو: {self.age} عامًا (رسالة من الكلاس الأب)")  # طباعة رسالة معلومات

class Son(Father):  # تعريف كلاس الابن يرث من Father
    def __init__(self, name, age, website):  # دالة البناء للابن تستقبل اسم وعمر وموقع
        super().__init__(name, age)  # استدعاء دالة البناء من الكلاس الأب
        self.website = website  # حفظ موقع الابن الشخصي

    def full_info(self):  # إعادة تعريف الدالة (Override) في كلاس الابن
        print(f"اسمي هو: {self.name} وعمري هو: {self.age} عامًا وموقعي هو: {self.website}")  # طباعة معلومات الابن

father = Father("بكر", 61)  # إنشاء كائن من كلاس الأب
son = Son("ahmed", 25, "https://tecwindow.net")  # إنشاء كائن من كلاس الابن

father.full_info()  # استدعاء دالة المعلومات من كلاس الأب
son.full_info()  # استدعاء دالة المعلومات من كلاس الابن (المعاد تعريفها)

النتيجة:

اسمي هو: بكر وعمري هو: 61 عامًا (رسالة من الكلاس الأب)
اسمي هو: ahmed وعمري هو: 25 عامًا وموقعي هو: https://tecwindow.net

📝 ملاحظات مهمة


المحاضرة 16: OOP - التغليف Encapsulation

ما هو التغليف؟

التغليف هو إخفاء البيانات والسماح بالوصول إليها فقط من خلال واجهات محددة.

مستويات الوصول

class Member:  # تعريف كلاس يمثل عضو
    def __init__(self, name, age):  # دالة البناء تستقبل الاسم والعمر
        self.name = name  # متغير عام Public يمكن الوصول إليه من خارج الكلاس
        self._country = "Egypt"  # متغير محمي Protected (اتفاقيًا للاستخدام الداخلي أو في الكلاسات الوريثة)
        self.__age = age  # متغير خاص Private لا يمكن الوصول إليه مباشرة من خارج الكلاس

    def get_age(self):  # دالة Getter لجلب قيمة العمر الخاص
        return self.__age  # إرجاع قيمة المتغير الخاص

    def set_age(self, new_age):  # دالة Setter لتعديل العمر الخاص
        self.__age = new_age  # تعديل قيمة المتغير الخاص

    @property
    def age_in_days(self):  # خاصية property لحساب العمر بالأيام
        return self.__age * 365  # ضرب العمر بالسنوات في 365 لإرجاع العمر بالأيام

one = Member("ahmed", 25)  # إنشاء كائن جديد من الكلاس Member
print(one.name)  # طباعة الاسم العام
print(one.get_age())  # طباعة العمر باستخدام Getter
one.set_age(30)  # تعديل العمر عبر Setter إلى 30
print(one.get_age())  # طباعة العمر بعد التعديل
print(one.age_in_days)  # طباعة العمر بالأيام باستخدام property

النتيجة:

ahmed
25
30
10950

📝 مستويات الوصول

المستوى الرمز الوصول
Public بدون رمز من أي مكان
Protected _ من الكلاس نفسه والكلاسات الوريثة
Private __ من الكلاس نفسه فقط

المحاضرة 17: OOP - الكلاسات المجردة Abstract Classes

ما هي الكلاسات المجردة؟

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

مثال: كلاس مجرد للغات البرمجة

from abc import ABC, abstractmethod  # استيراد الأساسيات لبناء كلاس مجرد

class APCLanguage(ABC):  # كلاس مجرد يمثل لغة برمجة
    def __init__(self, name):  # دالة البناء تستقبل اسم اللغة
        self.name = name  # حفظ اسم اللغة في خاصية

    @abstractmethod
    def has_oop(self):  # دالة مجردة توضح هل اللغة تدعم OOP
        pass  # لا يوجد تنفيذ هنا في الكلاس المجرد

    @abstractmethod
    def is_interpreted(self):  # دالة مجردة توضح هل اللغة مفسرة
        pass  # التنفيذ يكون في الكلاس الابن

    @abstractmethod
    def is_compiled(self):  # دالة مجردة توضح هل اللغة مترجمة
        pass  # التنفيذ يكون في الكلاسات الأبناء

class Python(APCLanguage):  # كلاس فرعي يمثل لغة Python
    def __init__(self):  # دالة البناء بدون معاملات خارجية
        super().__init__("Python")  # استدعاء دالة البناء من الكلاس المجرد مع اسم اللغة

    def has_oop(self):  # تنفيذ الدالة المجردة has_oop
        return True  # لغة Python تدعم OOP

    def is_interpreted(self):  # تنفيذ الدالة المجردة is_interpreted
        return True  # Python لغة مفسرة

    def is_compiled(self):  # تنفيذ الدالة المجردة is_compiled
        return False  # Python ليست مترجمة بشكل تقليدي

langs = [Python()]  # إنشاء قائمة تحتوي على كائن واحد من كلاس Python
for lang in langs:  # التكرار على جميع اللغات في القائمة
    print(f"Language: {lang.name}")  # طباعة اسم اللغة
    print(f"  Has OOP: {lang.has_oop()}")  # طباعة هل تدعم OOP
    print(f"  Is Interpreted: {lang.is_interpreted()}")  # طباعة هل هي مفسرة
    print(f"  Is Compiled: {lang.is_compiled()}")  # طباعة هل هي مترجمة

النتيجة:

Language: Python
  Has OOP: True
  Is Interpreted: True
  Is Compiled: False

📝 ملاحظات مهمة


المحاضرة 18: المكتبات القياسية - random

ما هي المكتبات؟

المكتبات هي أكواد جاهزة يمكن استيرادها واستخدامها في برامجك.

مكتبة random

import random  # استيراد مكتبة random المدمجة في بايثون لتوليد أرقام عشوائية

print(random.random())  # طباعة رقم عشوائي عشري بين 0 و 1
print(random.randint(10, 600))  # طباعة رقم عشوائي صحيح بين 10 و 600

استيراد بأسماء مختصرة

from random import random as r_random, randint as r_int  # استيراد دوال معينة بأسماء مختصرة

print(r_random())  # استخدام الاسم المختصر للدالة random()
print(r_int(1, 100))  # استخدام الاسم المختصر للدالة randint() للحصول على رقم بين 1 و 100

📝 طرق الاستيراد

  1. import library: استيراد المكتبة كاملة
  2. from library import function: استيراد دالة محددة
  3. import library as alias: استيراد باسم مختصر
  4. from library import function as alias: استيراد دالة باسم مختصر

المحاضرة 19-20: المكتبات المحلية

إنشاء مكتبة محلية (tecwindow.py)

# ملف tecwindow.py
import random  # استيراد مكتبة random لاستخدامها داخل الدالة show_random_num

def say_hello(name):  # دالة ترحيب بسيطة تأخذ اسمًا واحدًا
    print(f"hello {name}")  # طباعة رسالة ترحيب مع الاسم

def say_hi(name):  # دالة ترحيب رسمية تضيف mr قبل الاسم
    print(f"hi mr {name}")  # طباعة رسالة ترحيب رسمية

def show_random_num():  # دالة لعرض رقمين عشوائيين
    print(random.random())  # طباعة رقم عشري عشوائي بين 0 و 1
    print(random.randint(10, 600))  # طباعة رقم صحيح عشوائي بين 10 و 600

استخدام المكتبة المحلية

import tecwindow as tw  # استيراد المكتبة المحلية tecwindow باسم مختصر tw

tw.say_hello("ahmed")  # استدعاء دالة say_hello لطباعة ترحيب بسيط بالاسم
tw.say_hi("ahmed")  # استدعاء دالة say_hi لطباعة تحية رسمية مع mr
tw.show_random_num()  # استدعاء دالة show_random_num لعرض أرقام عشوائية

النتيجة:

hello ahmed
hi mr ahmed
0.123456789
456

📝 ملاحظات مهمة


نصائح Clean Code

1. استخدم أسماء واضحة

سيء:

x = 25
n = "ahmed"

جيد:

age = 25
name = "ahmed"

2. أضف تعليقات مفيدة

سيء:

def calc(a, b):
    return a + b

جيد:

def calculate_sum(first_number, second_number):
    """دالة لجمع رقمين وإرجاع الناتج"""
    return first_number + second_number

3. تجنب الكود المكرر

سيء:

print("hello ahmed")
print("hello ahmed")
print("hello ahmed")

جيد:

def say_hello(name):
    print(f"hello {name}")

say_hello("ahmed")
say_hello("ahmed")
say_hello("ahmed")

4. استخدم المسافات بشكل صحيح

سيء:

if x==5:
    print("yes")

جيد:

if x == 5:
    print("yes")

5. قسم الكود إلى دوال صغيرة

سيء:

# 100 سطر من الكود في دالة واحدة

جيد:

# تقسيم الكود إلى دوال صغيرة وواضحة
def function1():
    pass

def function2():
    pass

الخلاصة النهائية

ما تعلمناه في هذا الكورس

  1. المتغيرات وأنواع البيانات (str, int, float, bool)
  2. السلاسل النصية والتقطيع (Slicing)
  3. دوال السلاسل النصية والتنسيق (f-string)
  4. القوائم والمجموعات والمصفوفات والقواميس
  5. العمليات المنطقية (and, or, not)
  6. الجمل الشرطية (if, elif, else)
  7. الحلقات (while و for)
  8. الدوال (Functions) والمعاملات والقيم الافتراضية
  9. الدوال المدمجة (all, any, sum, min, max, map, filter)
  10. البرمجة الكائنية OOP (Classes, Inheritance, Encapsulation, Abstract Classes)
  11. المكتبات القياسية (random)
  12. المكتبات المحلية (tecwindow)

الخطوات التالية

  1. تمرن: اكتب برامج صغيرة باستخدام ما تعلمته
  2. اقرأ: اقرأ أكواد الآخرين على GitHub
  3. شارك: انضم لمجتمعات Python العربية
  4. استمر: تعلم مواضيع متقدمة (Decorators, Generators, Async)

رسالة نهائية

🎓 تهانينا! لقد أكملت كورس Python الأساسي بنجاح. أنت الآن جاهز لبدء رحلتك في عالم البرمجة. تذكر: الممارسة هي المفتاح!


**تم إنشاء هذا الدليل بواسطة:** مساعد الذكاء الاصطناعي **بناءً على:** كورس الأستاذ أحمد بكر **التاريخ:** 2024

CSS للتحويل إلى PDF (Dark Mode)

<style>
body {
    background-color: #1e1e1e;
    color: #d4d4d4;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    line-height: 1.6;
    padding: 20px;
}

h1, h2, h3 {
    color: #4ec9b0;
}

code {
    background-color: #252526;
    color: #ce9178;
    padding: 2px 6px;
    border-radius: 3px;
}

pre {
    background-color: #252526;
    color: #d4d4d4;
    padding: 15px;
    border-radius: 5px;
    overflow-x: auto;
}

blockquote {
    border-left: 4px solid #4ec9b0;
    padding-left: 15px;
    color: #b5cea8;
}

table {
    border-collapse: collapse;
    width: 100%;
    margin: 20px 0;
}

th, td {
    border: 1px solid #3e3e42;
    padding: 10px;
    text-align: left;
}

th {
    background-color: #2d2d30;
    color: #4ec9b0;
}

tr:nth-child(even) {
    background-color: #252526;
}
</style>

نهاية الدليل