من أول أمر print() إلى بناء برامج حقيقية — هذا الدليل يأخذ المبتدئين المطلقين عبر كل المفاهيم الأساسية بشرح عربي واضح، كود قابل للنسخ، وسياق عملي لتطوير الويب وعلم البيانات والأتمتة.
14 محورًا
بدون خبرة سابقة
كود قابل للنسخ
نصائح عملية
01 مقدمة
لماذا تتعلّم بايثون؟
بايثون من أكثر لغات البرمجة شيوعًا في العالم — ليس لأنها موضة، بل لأنها سهلة القراءة ومتعددة الاستخدامات وقوية. لغة واحدة يمكن أن تأخذك من أتمتة جداول Excel مملة إلى تدريب نماذج تعلم آلي، أو بناء مواقع ويب، أو تحليل ملايين نقاط البيانات.
تطوير الويب — Django وFlask يشغّلان مواقع من الشركات الناشئة إلى منصات ضخمة.
علم البيانات والذكاء الاصطناعي — NumPy وpandas وPyTorch كلها بايثون أولًا.
الأتمتة — إعادة تسمية الملفات، جمع بيانات المواقع، إرسال بريد — سكربتات في دقائق.
التعليم — صياغة نظيفة تتيح التركيز على المنطق لا على الأقواس والفواصل.
مسار التعلّم في هذا الدليل — كل قسم يفتح الطريق للذي يليه
ما يميّز بايثون
بايثون تستخدم المسافة البادئة بدل الأقواس المعقوفة لتحديد الكتل. وهي ديناميكية النوع — لا تعلن أنواع المتغيرات. ولديها مكتبة قياسية ضخمة وأكثر من 500,000 حزمة على PyPI. تكتب كودًا أقل وتنفّذ أفكارك أسرع.
02 البداية
الإعداد وأول برنامج
قبل كتابة الكود، ثبّت بايثون من python.org (الإصدار 3.11 أو أحدث مُوصى به). على ويندوز، فعّل خيار "Add Python to PATH" أثناء التثبيت. على macOS/Linux غالبًا مثبت مسبقًا — تحقق بـ python3 --version.
ثلاث طرق لتشغيل بايثون
الطريقة
متى تُستخدم
الصدفة التفاعلية (REPL)
تجارب سريعة — اكتب python في الطرفية
ملف سكربت (.py)
برامج حقيقية — احفظ وشغّل بـ python myfile.py
محرر / IDE
VS Code، PyCharm — تلوين، تصحيح، إضافات
# hello.py — أول برنامج بايثون print("مرحبًا بالعالم!") print("إصدار بايثون:", __import__("sys").version.split()[0]) # التشغيل في الطرفية: # python hello.py
تجربة REPL سريعة
افتح الطرفية، اكتب python، ثم جرّب: 2 + 2 ← 4. اكتب 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
لا تبدأ برقم ولا تستخدم كلمات محجوزة مثل 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 التنظيم
الدوال — كتل كود قابلة لإعادة الاستخدام
الدوال تغلّف المنطق في وحدات مسماة قابلة للاستدعاء. تقلّل التكرار وتسهّل الاختبار والقراءة.
دالة واحدة، مهمة واحدة. استخدم أسماء فعلية: 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 تمثّل كيانات العالم الحقيقي كـ كائنات لها صفات (بيانات) ودوال (سلوك). الكلاس هو المخطط؛ المثيل هو الكائن المبني.
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، وابنِ مشروعًا صغيرًا أسبوعيًا. الاستمرارية أهم من الكثافة.