بايثون

دورة تعليمية كاملة للغة بايثون

شرح بايثون الكامل والمفصل بالعربية | تعلم البرمجة من الصفر
أساسيات بايثون · دورة المبتدئين

شرح بايثون الكامل والمفصل

من أول أمر print() إلى بناء برامج حقيقية — هذا الدليل يأخذ المبتدئين المطلقين عبر كل المفاهيم الأساسية بشرح عربي واضح، كود قابل للنسخ، وسياق عملي لتطوير الويب وعلم البيانات والأتمتة.

14 محورًا
بدون خبرة سابقة
كود قابل للنسخ
نصائح عملية
01 مقدمة

لماذا تتعلّم بايثون؟

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

تطوير الويب — Django وFlask يشغّلان مواقع من الشركات الناشئة إلى منصات ضخمة.
علم البيانات والذكاء الاصطناعي — NumPy وpandas وPyTorch كلها بايثون أولًا.
الأتمتة — إعادة تسمية الملفات، جمع بيانات المواقع، إرسال بريد — سكربتات في دقائق.
التعليم — صياغة نظيفة تتيح التركيز على المنطق لا على الأقواس والفواصل.
الأساسياتمتغيرات، حلقات الهياكلقوائم، قواميس كائنات وملفاتOOP، I/O النظام البيئيpip، وحدات مشاريع
مسار التعلّم في هذا الدليل — كل قسم يفتح الطريق للذي يليه
ما يميّز بايثون

بايثون تستخدم المسافة البادئة بدل الأقواس المعقوفة لتحديد الكتل. وهي ديناميكية النوع — لا تعلن أنواع المتغيرات. ولديها مكتبة قياسية ضخمة وأكثر من 500,000 حزمة على PyPI. تكتب كودًا أقل وتنفّذ أفكارك أسرع.

02 البداية

الإعداد وأول برنامج

قبل كتابة الكود، ثبّت بايثون من python.org (الإصدار 3.11 أو أحدث مُوصى به). على ويندوز، فعّل خيار "Add Python to PATH" أثناء التثبيت. على macOS/Linux غالبًا مثبت مسبقًا — تحقق بـ python3 --version.

ثلاث طرق لتشغيل بايثون

الطريقةمتى تُستخدم
الصدفة التفاعلية (REPL)تجارب سريعة — اكتب python في الطرفية
ملف سكربت (.py)برامج حقيقية — احفظ وشغّل بـ python myfile.py
محرر / IDEVS Code، PyCharm — تلوين، تصحيح، إضافات
# hello.py — أول برنامج بايثون print("مرحبًا بالعالم!") print("إصدار بايثون:", __import__("sys").version.split()[0]) # التشغيل في الطرفية: # python hello.py
تجربة REPL سريعة

افتح الطرفية، اكتب python، ثم جرّب: 2 + 24. اكتب exit() للخروج. REPL مثالي لاختبار سطر واحد قبل وضعه في ملف.

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

المتغيرات وأنواع البيانات

المتغير هو اسم مرتبط بقيمة في الذاكرة. بايثون تستنتج النوع تلقائيًا — لا تكتب int age = 30 كما في C أو Java.

name = "خالد أحمد" # str — نص age = 28 # int — عدد صحيح salary = 4500.75 # float — عدد عشري is_married = True # bool — صح أو خطأ print("الاسم:", name) print("العمر:", age) print(type(name)) # <class 'str'> print(type(age)) # <class 'int'> # تعيين متعدد في سطر واحد x, y, z = 10, 20.5, "بايثون" print(x, y, z) # تحويل الأنواع score_str = "95" score_int = int(score_str) # "95" → 95 price = float("19.99") # "19.99" → 19.99

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

  • استخدم snake_case: user_name وليس userName.
  • الأسماء حساسة لحالة الأحرف: count وCount متغيران مختلفان.
  • لا تبدأ برقم ولا تستخدم كلمات محجوزة مثل class أو for.
  • اختر أسماء وصفية — total_price أفضل من tp.
شرح عميق

متغيرات بايثون هي مراجع لكائنات وليست صناديق تحتوي قيمًا. عند كتابة a = [1, 2, 3] وb = a، يشير الاسمان لنفس القائمة — تغيير b يؤثر على a. للنسخ المستقل استخدم copy.deepcopy() أو التقطيع.

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

العمليات ومعالجة النصوص

العمليات تتيح الحساب والمقارنة ودمج القيم. النصوص (strings) هي تسلسلات أحرف — من أكثر الأنواع استخدامًا في البرامج الحقيقية.

# العمليات الحسابية a, b = 17, 5 print(a + b) # 22 print(a // b) # 3 — القسمة الصحيحة print(a % b) # 2 — الباقي (modulo) print(a ** b) # 1419857 — الأس # المقارنات → True أو False print(10 > 5) # True print(10 == 10) # True (تساوي) print(10 != 5) # True (لا يساوي) # عمليات النصوص greeting = "مرحبًا" name = "نورة" message = greeting + "، " + name + "!" # الربط print(message) print(message.upper()) print(len(message)) # عدد الأحرف print(message[0:5]) # التقطيع # f-strings — التنسيق المفضّل age = 25 print(f"{name} عمرها {age} سنة.") print(f"العام القادم: {age + 1}")
مثال محلول

منتج بسعر 24.99 دولار مع ضريبة 8%. المجموع = 24.99 * 1.08 = 26.99. في الكود: total = round(24.99 * 1.08, 2) — استخدم round() دائمًا للعملات لتجنب مفاجآت الفاصلة العائمة.

05 التحكم بالتدفق

الشروط واتخاذ القرار

الشروط تتيح للبرنامج التفرّع — تنفيذ كود مختلف حسب كون الشرط True أو False.

score = 82 if score >= 90: grade = "ممتاز" elif score >= 75: grade = "جيد جدًا" elif score >= 60: grade = "جيد" else: grade = "ضعيف" print(f"الدرجة: {score} → التقدير: {grade}") # العوامل المنطقية: and, or, not age = 20 nationality = "سعودي" if age >= 18 and nationality == "سعودي": print("مسموح بالتصويت") else: print("غير مسموح") # شرط مختصر في سطر واحد status = "بالغ" if age >= 18 else "قاصر"
نقطة مهمة

المسافة البادئة جزء من الصياغة في بايثون — 4 مسافات لكل مستوى. عوامل المقارنة: ==، !=، >، <، >=، <=. قيم صادقة: أرقام غير صفرية، نصوص/قوائم غير فارغة، True. قيم كاذبة: 0، ""، []، None، False.

06 التحكم بالتدفق

الحلقات — for و while

الحلقات تكرّر الكود. for تمر على تسلسلات؛ while تستمر حتى يصبح الشرط خاطئًا.

# حلقة for مع range — stop غير مشمول for number in range(1, 6): print(number) # 1, 2, 3, 4, 5 # المرور على قائمة fruits = ["تفاح", "موز", "عنب"] for fruit in fruits: print(f"أحب {fruit}") # حلقة while — تأكد أن الشرط يصبح False eventually counter = 0 while counter < 4: print(f"العداد: {counter}") counter += 1 # break (خروج) و continue (تخطي) for i in range(10): if i == 3: continue if i == 7: break print(i) # enumerate — الفهرس + القيمة for index, fruit in enumerate(fruits): print(f"{index}: {fruit}")
نمط شائع

جمع قائمة بدون sum(): ابدأ بـ total = 0، ثم for n in numbers: total += n. هذا النمط — مُجمّع + حلقة — يظهر في الإحصاء والألعاب وغيرها.

07 التنظيم

الدوال — كتل كود قابلة لإعادة الاستخدام

الدوال تغلّف المنطق في وحدات مسماة قابلة للاستدعاء. تقلّل التكرار وتسهّل الاختبار والقراءة.

def greet(name): """إرجاع تحية شخصية.""" # docstring return f"أهلاً وسهلاً، {name}!" print(greet("نورة")) def calculate_area(length, width=5): """العرض الافتراضي 5 إن لم يُمرَّر.""" return length * width print(calculate_area(10)) # 50 print(calculate_area(10, 8)) # 80 # *args — معاملات موضعية متغيرة def sum_all(*args): return sum(args) print(sum_all(1, 2, 3, 4, 5)) # 15 # **kwargs — معاملات بمفاتيح def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="أحمد", age=30, city="الرياض") # lambda — دالة صغيرة مجهولة square = lambda x: x ** 2 print(square(7)) # 49
أفضل الممارسات

دالة واحدة، مهمة واحدة. استخدم أسماء فعلية: calculate_tax()، load_users(). وثّق بـ docstring. أرجع مبكرًا عند إدخال غير صالح. الدوال النقية (بدون آثار جانبية) أسهل في الاختبار.

08 هياكل البيانات

القوائم والـ Tuples

القوائم مجموعات مرتبة قابلة للتعديل بين أقواس []. الـ tuples مرتبة وغير قابلة للتعديل — بين أقواس ().

numbers = [1, 2, 3, 4, 5] mixed = ["نص", 42, 3.14, True, [1, 2]] numbers.append(6) # إضافة للنهاية numbers.insert(0, 0) # إدراج عند الفهرس 0 numbers.remove(3) # إزالة أول 3 last = numbers.pop() # إزالة وإرجاع الأخير numbers.sort(reverse=True) # ترتيب تنازلي print("القائمة:", numbers) print("تقطيع [:3]:", numbers[:3]) print("الطول:", len(numbers)) # List comprehension — إنشاء مختصر squares = [x**2 for x in range(1, 6)] evens = [x for x in range(20) if x % 2 == 0] print("المربعات:", squares) print("الزوجية:", evens) # Tuple — غير قابل للتعديل point = (10, 20) x, y = point # فكّ التعبئة print(f"النقطة: ({x}, {y})")
متى تستخدم أيهما

استخدم قائمة عند الحاجة لإضافة أو حذف أو تغيير عناصر. استخدم tuple عندما لا يجب أن تتغير المجموعة — مفاتيح قواميس، إرجاع قيم متعددة من دالة، أو حماية البيانات من التعديل العرضي.

09 هياكل البيانات

القواميس والمجموعات (Sets)

القواميس تربط مفاتيح فريدة بقيم — كالقاموس الحقيقي يربط الكلمات بتعريفاتها. المجموعات تحتوي عناصر فريدة غير مرتبة — مثالية لإزالة التكرار.

student = { "name": "سلمى", "age": 21, "major": "علوم حاسب", "courses": ["رياضيات", "برمجة", "فيزياء"], "graduated": False } print(student["name"]) print(student.get("GPA", "غير متوفر")) # وصول آمن student["GPA"] = 3.8 student.update({"age": 22, "graduated": True}) for key, value in student.items(): print(f"{key}: {value}") # Dictionary comprehension squares_dict = {x: x**2 for x in range(1, 6)} print(squares_dict) # Sets — عناصر فريدة، بحث سريع tags = {"python", "tutorial", "beginner", "python"} print(tags) # بدون تكرار print("python" in tags) # True a = {1, 2, 3, 4} b = {3, 4, 5, 6} print(a | b) # اتحاد print(a & b) # تقاطع
استخدام عملي

واجهات JSON تُرجع قواميس. ملفات الإعدادات تربط إعدادات بقيم. المجموعات تُزيل تكرار قوائم البريد. في علم البيانات، جداول pandas مبنية على قواميس الأعمدة.

10 الإدخال والإخراج

التعامل مع الملفات

بايثون تقرأ وتكتب نصوصًا وCSV وJSON بأدوات مدمجة. استخدم دائمًا with open(...) — يغلق الملف تلقائيًا حتى عند حدوث خطأ.

# كتابة ملف نصي with open("ملف_تجريبي.txt", "w", encoding="utf-8") as f: f.write("السطر 1: بايثون رائعة\n") f.write("السطر 2: التعلم ممتع\n") # قراءة الملف كاملًا with open("ملف_تجريبي.txt", "r", encoding="utf-8") as f: content = f.read() print(content) # قراءة سطرًا بسطر (موفّر للذاكرة) with open("ملف_تجريبي.txt", "r", encoding="utf-8") as f: for line_num, line in enumerate(f, start=1): print(f"سطر {line_num}: {line.strip()}") # وضع الإلحاق with open("ملف_تجريبي.txt", "a", encoding="utf-8") as f: f.write("سطر 3: أُضيف لاحقًا.\n") # JSON — بيانات منظمة import json data = {"name": "خالد", "scores": [95, 87, 92]} with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, indent=2, ensure_ascii=False) with open("data.json", "r", encoding="utf-8") as f: loaded = json.load(f) print(loaded["name"])
أوضاع الملفات
الوضعالمعنى
'r'قراءة — الملف يجب أن يوجد.
'w'كتابة — ينشئ أو يمسح المحتوى.
'a'إلحاق — يضيف في النهاية.
'r+'قراءة وكتابة.
'b'وضع ثنائي (صور، PDF) — يُجمع مع ما سبق.
11 متقدم أساسي

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

الـ OOP تمثّل كيانات العالم الحقيقي كـ كائنات لها صفات (بيانات) ودوال (سلوك). الكلاس هو المخطط؛ المثيل هو الكائن المبني.

class Car: """كلاس سيارة بسيط.""" def __init__(self, make, model, year): self.make = make self.model = model self.year = year self.odometer = 0 def description(self): return f"{self.make} {self.model} ({self.year})" def drive(self, km): self.odometer += km print(f"قُيِد {km} كم. الإجمالي: {self.odometer}") my_car = Car("تويوتا", "كامري", 2022) print(my_car.description()) my_car.drive(50) # الوراثة class ElectricCar(Car): def __init__(self, make, model, year, battery_kwh): super().__init__(make, model, year) self.battery_kwh = battery_kwh def charge(self): print(f"جاري شحن بطارية {self.battery_kwh} كيلوواط...") def description(self): return f"{super().description()} ⚡ كهربائية" tesla = ElectricCar("تسلا", "Model 3", 2023, 75) print(tesla.description()) tesla.drive(120) tesla.charge()

أركان الـ OOP الأربعة

التغليف — دمج البيانات والدوال؛ إخفاء التفاصيل بـ _private.
الوراثة — كلاسات فرعية تعيد استخدام سلوك الأب عبر super().
تعدد الأشكال — نفس اسم الدالة، سلوك مختلف لكل كلاس.
التجريد — إظهار ما يحتاجه المستخدم فقط وإخفاء التعقيد.
12 المتانة

معالجة الأخطاء والاستثناءات

البرامج تواجه إدخالًا سيئًا وملفات مفقودة وأعطال شبكة. try-except تلتقط الأخطاء بأناقة بدل التعطّل.

try: number = int(input("أدخل رقمًا: ")) result = 10 / number print(f"10 / {number} = {result}") except ValueError: print("إدخال غير صالح! أدخل عددًا صحيحًا.") except ZeroDivisionError: print("لا يمكن القسمة على صفر!") except Exception as e: print(f"خطأ غير متوقع: {e}") else: print("نجحت العملية.") # فقط إن لم يحدث استثناء finally: print("انتهى التنفيذ.") # دائمًا # رفع استثناءاتك الخاصة def withdraw(balance, amount): if amount > balance: raise ValueError("رصيد غير كافٍ") return balance - amount
برمجة دفاعية

التقط استثناءات محددة (ValueError، FileNotFoundError) وليس except: العاري. سجّل الأخطاء في الإنتاج. تحقق من إدخال المستخدم عند الحدود — لا تدع بيانات سيئة تتسلل عميقًا في المنطق.

13 النظام البيئي

الوحدات و pip والبيئات الافتراضية

قوة بايثون من نظامها البيئي. المكتبة القياسية تغطي HTTP والتواريخ والرياضيات. الحزم الخارجية تُثبَّت عبر pip. البيئات الافتراضية تعزل تبعيات كل مشروع.

# استيراد وحدة كاملة import math print(math.sqrt(144)) # 12.0 print(math.pi) # استيراد أسماء محددة from datetime import datetime now = datetime.now() print(now.strftime("%Y-%m-%d %H:%M")) # أوامر الطرفية: # pip install requests # تثبيت حزمة # pip list # الحزم المثبتة # python -m venv myenv # إنشاء بيئة افتراضية # myenv\Scripts\activate # تفعيل على ويندوز # source myenv/bin/activate # تفعيل على macOS/Linux
الحزمةالغرض
requestsطلبات HTTP وواجهات API
pandasتحليل البيانات والجداول
flask / djangoتطبيقات الويب
pytestاختبارات آلية
14 التطبيق

مشروع مصغّر — مدير مهام في الطرفية

اجمع كل شيء: قوائم، دوال، ملفات JSON، وحلقات. مدير مهام بسيط يحفظ المهام في ملف.

import json from pathlib import Path FILE = Path("tasks.json") def load_tasks(): if FILE.exists(): return json.loads(FILE.read_text(encoding="utf-8")) return [] def save_tasks(tasks): FILE.write_text(json.dumps(tasks, indent=2, ensure_ascii=False), encoding="utf-8") def add_task(tasks, description): tasks.append({"id": len(tasks) + 1, "text": description, "done": False}) save_tasks(tasks) print(f"أُضيفت: {description}") def list_tasks(tasks): if not tasks: print("لا مهام بعد.") return for t in tasks: mark = "✓" if t["done"] else " " print(f"[{mark}] {t['id']}. {t['text']}") def main(): tasks = load_tasks() while True: cmd = input("\n(add/list/quit): ").strip().lower() if cmd == "add": add_task(tasks, input("المهمة: ")) elif cmd == "list": list_tasks(tasks) elif cmd == "quit": print("مع السلامة!") break if __name__ == "__main__": main()
الخطوات التالية

طوّر المشروع: أضف done <id> لإتمام مهمة، أو delete <id> للحذف، أو غلّفه بواجهة Flask. ثم استكشف أتمتة المهام الروتينية، أو ابنِ REST API، أو ادخل علم البيانات مع pandas.

تهانينا

أنت الآن تمتلك أساسًا متينًا في بايثون — المتغيرات، التحكم بالتدفق، هياكل البيانات، OOP، الملفات، الأخطاء، والحزم. تدرّب يوميًا: حل مسائل على Exercism، اقرأ كود الآخرين على GitHub، وابنِ مشروعًا صغيرًا أسبوعيًا. الاستمرارية أهم من الكثافة.