PyDA Course
📋 ملخصات بايثون

ملخصات بايثون

المقتطفات التي ستلجأ إليها في كل درس. الكود أعلاه يعمل في الخلايا؛ هذه هي الأنماط الجاهزة للنسخ.

  • المتغيرات

    • الإسناد والقراءة

      x = 5
      x = x + 1   # 6
      print(x)    # 6

      علامة = تحفظ قيمة تحت اسمٍ ما. إعادة الإسناد تعيد ربط الاسم بالقيمة الجديدة فحسب.

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

      score = 10      # snake_case ✅
      age_2 = 3       # digits ok after first char
      age 2 = 3       # ❌ space & leading digit
      Score = 10      # works, but remember: case-sensitive

      الأسماء حسّاسة لحالة الأحرف. استخدم snake_case وأسماءً وصفية وتجنّب الكلمات المدمجة مثل print.

    • التبديل والتفكيك

      a, b = 1, 2
      a, b = b, a   # swap in one line
      first, *rest = [1, 2, 3]  # first=1, rest=[2, 3]

      تسنِد Python عدة أسماء دفعة واحدة — وهذا أسلوب التبديل الأفضل على الإطلاق.

  • الإخراج

    • print

      print('Hello, world!')
      print(2 + 3)      # 5, values print automatically

      الدالة الوحيدة التي ستستخدمها في كل درس على الإطلاق.

    • بدون فاصلة زائدة

      print('a', 'b', sep='-')   # a-b

      تتحكم sep في الفاصل؛ والافتراضي هو مسافة.

  • الإدخال

    • قراءة المطالَب

      name = input('Your name: ')
      print('Hi', name)

      تتوقف input() وتنتظر؛ وهي تُرجع نصًّا دائمًا.

    • تحويل الناتج

      age = int(input('Age: '))
      price = float(input('Price: '))

      حوّل عند القراءة باستخدام int()/float()، وإلا فستفشل كل خطوة حسابية لاحقة.

  • الأرقام

    • العمليات الحسابية الأساسية

      x = 7
      x // 2   # 3  integer division
      x % 2    # 1  remainder
      x ** 2   # 49 exponent

      // و % شريكان في القسمة — تجيبان عن «كم مرة» و«كم يتبقى».

    • type()

      type(3)     # <class 'int'>
      type(3.0)   # <class 'float'>
      type("3")   # <class 'str'>

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

    • التحويل

      int('42')   # 42
      float('4.2')
      str(42)     # '42'

      تُرجع input() دائمًا نصًّا — حوّل قبل إجراء أي عملية حسابية.

  • النصوص

    • f-string (تنسيق النصوص)

      name = 'PyDA'
      print(f'{name} → {len(name)} letters')

      الحرف f قبل علامة الاقتباس يجعل {…} تُدخِل القيم. استخدم هذا بدل الدمج بالـ +.

    • الأساليب (Methods)

      '  hi  '.strip()   # 'hi'
      'hello'.upper()   # 'HELLO'
      'a,b'.split(',')   # ['a', 'b']

      الأساليب تُرجع نصًّا جديدًا — فالنصوص (السلاسل) غير قابلة للتعديل.

    • التقطيع

      word = 'python'
      word[0]    # 'p'
      word[-1]   # 'n'
      word[1:4]  # 'yth'

      البداية شاملة والنهاية مستبعدة. المؤشرات السالبة تُعدّ من النهاية.

    • الدمج والتكرار والبحث

      'py' + 'thon'    # 'python'
      'ha' * 3        # 'hahaha'
      'py' in 'python'  # True
      len('abc')        # 3

      + تلصق النصوص، و* يكرّرها، و in يفحص نصًّا فرعيًّا، و len() تعدّ الأحرف.

    • الهروب بالشرطة المائلة الخلفية

      print('she\'s fine')   # she's fine
      print('line1\nline2')  # two lines
      print('tab\there')      # tab       here

      \' علامة اقتباس، و\n سطر جديد، و\t تبويب. استخدم النصوص الخام r"…" عندما يحتوي المسار على شرطات مائلة كثيرة.

  • القوائم

    • الإنشاء والإضافة

      nums = [1, 2, 3]
      nums.append(4)      # [1, 2, 3, 4]
      nums + [5]        # [1, 2, 3, 4, 5]

      append تعدّل القائمة في موضعها؛ بينما + تنشئ قائمة جديدة.

    • القراءة

      nums[0]      # 1
      len(nums)    # 4
      nums[-1]     # 4
      3 in nums    # True

      in و not in هما معاملا فحص العضوية.

    • التكرار

      for n in nums:
          print(n * 2)

      حلقة for تمرّ على كل عنصر واحدًا تلو الآخر.

    • الترتيب والنسخ

      nums.sort()          # in place
      sorted(nums)         # NEW sorted list
      copy = nums[:]       # real copy, not the same list

      sort() تعدّل القائمة وتُعيد None؛ بينما sorted() تُعيد قائمة جديدة. استخدم nums[:] للعمل على نسخة.

    • حيل التقطيع

      nums = [0, 1, 2, 3, 4]
      nums[1:]    # [1, 2, 3, 4]  drop the head
      nums[:-1]   # [0, 1, 2, 3]  drop the tail
      nums[::-1]  # [4, 3, 2, 1, 0]  reversed

      صيغة [start:end:step] هي جراحة القوائم — حذف ونسخ وعكس في سطر واحد.

  • الصفوف والمجموعات

    • الصفوف (Tuples)

      t = (1, 2, 3)
      t[0]        # 1
      x, y = t        # unpack
      # t[0] = 9      # ❌ tuples can't change

      قائمة ثابتة — استخدمها عندما يجب ألا يتغيّر الشكل: الإحداثيات، أزواج الإعدادات، البيانات للقراءة فقط.

    • المجموعات (Sets)

      s = {1, 2, 2, 3}   # {1, 2, 3} — duplicates dropped
      s.add(4)
      4 in s        # True
      s.remove(4)

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

    • عمليات المجموعات

      a = {1, 2, 3}
      b = {3, 4}
      a | b       # {1, 2, 3, 4}  union
      a & b       # {3}           intersection
      a - b       # {1, 2}        difference
      a ^ b       # {1, 2, 4}     symmetric

      | و& و- و^ تحوّل المجموعات إلى حساب في سطر واحد — قارن مجموعات دون حلقات متداخلة.

    • أي حاوية تختار؟

      list    # ordered, editable, keeps order
      tuple   # ordered, read-only
      set     # unordered, unique, fast in
      dict    # key → value lookup

      اختر حسب ما تحتاجه الشيفرة: الترتيب، أو التفرد، أو إيجاد الأشياء بالاسم.

  • القواميس

    • الإنشاء والقراءة

      ages = {'ada': 36, 'bob': 41}
      ages['ada']        # 36
      ages.get('zoe')    # None (safe "missing")
      ages.get('zoe', 0) # 0 (with default)

      استخدام [key] مع مفتاح مفقود يرفع KeyError — فضّل .get() عندما لا تكون متأكدًا.

    • الكتابة

      ages['ada'] = 37
      ages['zoe'] = 22
      del ages['bob']

      الإسناد يضيف أو يحدّث؛ بينما del يزيل مفتاحًا.

    • التكرار

      for k, v in ages.items():
          print(k, v)

      .items() تعطي أزواج (مفتاح، قيمة)؛ بينما يعطي .keys() و .values() جانبًا واحدًا فقط.

  • الشروط

    • if / elif / else

      if score >= 90:
          print("A")
      elif score >= 80:
          print("B")
      else:
          print("C")

      elif يتوقف بمجرد تحقق أحد الشروط — الترتيب مهم.

    • المقارنات

      ==  !=  <  <=  >  >=

      == يفحص التساوي؛ بينما = يسند. تذكّر هذا ليصلّح معظم أخطاء «لماذا هو True» لدى المبتدئين.

    • العوامل المنطقية

      a and b    # both truthy
      a or b     # at least one
      a and not b

      and / or / not — كلمات عادية، وليست && و ! كما في اللغات الأخرى.

    • الصدق (Truthiness)

      if x:             # 'is x non-empty?'
          print(x)
      # Falsy: 0, 0.0, '', [], {}, None
      # Everything else is truthy

      «if x:» هي الفحص الاصطلاحي «هل يوجد x؟» — الحاويات الفارغة و0 تفشل، وكل ما عدا ذلك ينجح.

    • الشرط الثلاثي في سطر واحد

      'pass' if score >= 50 else 'fail'

      if/else مختصر يُرجع قيمة — رائع داخل f-strings والـ print().

  • الحلقات التكرارية

    • range

      for i in range(3):   # 0, 1, 2
          print(i)
      for i in range(1, 4): # 1, 2, 3
          print(i)

      range يتوقف قبل الرقم الثاني — نفس قاعدة استبعاد النهاية كما في التقطيع.

    • enumerate / zip

      for i, item in enumerate(['a','b']):
          print(i, item)
      for x, y in zip([1,2],[3,4]):
          print(x, y)

      enumerate يضيف عدّادًا؛ بينما zip يزاوج تسلسلَين عنصرًا بعنصر.

    • break / continue

      for n in range(10):
          if n == 3:
              break      # stop the loop
      for n in range(10):
          if n % 2:
              continue   # skip this one
          print(n)

      break يخرج من الحلقة كليًا؛ بينما continue يقفز إلى التكرار التالي.

    • while

      n = 3
      while n > 0:
          print(n)
          n -= 1   # don't forget: while needs progress

      while تتكرر حتى يصبح شرطها False — حلقة لا تحدّث شرطها لن تنتهي أبدًا.

    • else مع الحلقة (اختياري)

      for n in nums:
          if n == target:
              break
      else:
          print("not found")

      كتلة else تعمل فقط إذا انتهت الحلقة دون break — علمٌ مدمجٌ «هل وُجد؟».

  • الدوال

    • التعريف والاستدعاء

      def double(x):
          return x * 2
      
      y = double(21)   # 42

      نص def… يجب أن يكون مُزاحًا بمسافة بادئة. return تُعيد قيمة؛ وبدونه تحصل على None.

    • القيم الافتراضية والوسائط المفتاحية

      def greet(name, exclaim=True):
          s = f"Hello {name}"
          return s + ("!" if exclaim else "")
      
      greet("ada")        # Hello ada!
      greet("ada", False) # Hello ada

      المعلمات التي لها = تحصل على قيم افتراضية؛ ويمكن للمتصل تمريرها بالاسم (keyword).

    • إرجاع قيم متعددة

      def minmax(nums):
          return min(nums), max(nums)
      
      lo, hi = minmax([3, 1, 4])  # lo=1, hi=4

      يمكن للدالة أن تُرجع صفًّا (tuple) ويفككه المتصل في عدة أسماء دفعة واحدة.

    • النطاق وprint مقابل return

      x = 10            # global
      
      def show(y):
          x = 5         # local — different x!
          print(x, y)   # side effect, returns None
      
      result = show(1)  # result is None

      print يعرض القيمة في الطرفية؛ أما return فتُرجِعها فعلًا. الإسناد داخل دالة يُظلّل المتغير العام.

    • لامدا (الصيغ القصيرة)

      double = lambda x: x * 2
      sorted(nums, key=lambda n: -n)

      استخدم lambdas للدوال المؤقتة المكوَّنة من سطر واحد وتُمرَّر إلى sort/max/map.

  • الاستيعاب

    • قائمة

      [n * 2 for n in nums]              # [2, 4, 6]
      [n for n in nums if n > 1]      # [2, 3]
      {n * 2 for n in nums}           # set

      حلقة for داخل أقواس مربعة — الأسلوب الاصطلاحي لتحويل قائمة.

    • قاموس

      {n: n ** 2 for n in range(4)}   # {0: 0, 1: 1, 2: 4, 3: 9}

      نفس الشكل، مع نقطتين بين المفتاح والقيمة.

  • الملفات وCSV

    • قراءة ملف

      text = open("file.txt").read()
      lines = text.splitlines()

      أسهل طريقة للقراءة؛ استخدم with open(...) as f عندما تحتاج القراءة بالتدرج (streaming).

    • صفوف CSV

      import csv
      with open('data.csv') as f:
          rows = list(csv.reader(f))

      rows[0] هو الترويسة (header)؛ وكل صف لاحق هو قائمة نصوص — حوّلها إلى أرقام قبل أي حساب.

  • pandas (تحليل البيانات)

    • التحميل والنظرة الأولى

      import pandas as pd
      df = pd.read_csv('data.csv')
      df.head()      # first 5 rows
      df.describe()  # numeric summary

      الصيغة القياسية — pd.read_csv هي طريقة بدء كل درس بيانات.

    • الأعمدة والصفوف

      df['name']          # one column
      df[['a', 'b']]      # several
      df.loc[0]           # first row
      df[df['age'] > 30]  # filter rows

      أقواس مربعة على اسم العمود؛ وأقنعة منطقية (boolean masks) للفلترة.

    • التجميع والإجمال

      df.groupby('city')['sales'].sum()
      df.groupby('city').mean()

      groupby + طريقة تلخيص واحدة هي محور قسم تحليل البيانات.

  • معالجة الأخطاء

    • اقرأ السطر الأخير

      TypeError: unsupported operand type(s) for +: 'int' and 'str'

      السطر الأخير يسمّي الخطأ والقيم المخالفة — إنها الرسالة التي تخبرك بماذا تُصلح.

    • try / except

      try:
          total = int(user_input) * 2
      except ValueError:
          print('That was not a number')

      التقط فقط الخطأ المحدد الذي تتوقعه؛ فالتقاط كل شيء يخفي أخطاءً حقيقية.