Skip to content · ⁨الانتقال إلى المحتوى⁩
Subjects · ⁨المواد⁩
  • 1 Getting started · ⁨بدء الاستخدام⁩
    1.1

    أول برنامج لك

    English

    Python runs your code one line at a time. Each line is a statement 语句. A program 程序 is just a list of statements that run from top to bottom.

    The print() function shows text on the screen. This is called output 输出. Text inside quotes is a string 字符串.

    • Each print() starts a new line.
    • Quotes can be "double" or 'single' — both make a string.
    • A program does nothing until you run it.
    العربية

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

    دالة print() تعرض النص على الشاشة. هذا يسمى الإخراج. النص داخل علامات الاقتباس هو نصي (سلسلة)

    print("Hello, world!")
    print("I am learning Python")
    
    • كل print() يبدأ سطرًا جديدًا.
    • يمكن أن تكون علامات الاقتباس "double" أو 'single' — كلاهما يُنتج نصًا.
    • لا يقوم البرنامج بأي شيء حتى تقوم بتشغيله.
    الكود المصدري يمر عبر المفسر لإنتاج إخراج
    الكود المصدري يمر عبر المفسر لإنتاج إخراج
    1.2

    التعليقات ونمط الكود

    English

    A comment 注释 starts with #. Python ignores everything after the # on that line. Comments explain your code to people; they do not change what the code does.

    Good style makes code easy to read:

    • Use clear names that say what a value means.
    • Put one statement on each line.
    • Do not add spaces at the start of a normal line. In Python, spacing at the start (indentation 缩进) has a special meaning, so a wrong space gives an error 错误.
    العربية

    التعليق يبدأ بـ #. يتجاهل بايثون كل ما بعد # في ذلك السطر. التعليقات تشرح كودك للناس؛ وهي لا تغير ما يفعله الكود.

    # This line is a note for humans
    print("Hi")        # you can also comment at the end of a line
    

    النمط الجيد يجعل الكود سهل القراءة:

    • استخدم أسماء واضحة تعبر عن معنى القيمة.
    • ضع تعليمة واحدة في كل سطر.
    • لا تضيف مسافات في بداية السطر العادي. في بايثون، المسافات في البداية (المسافة البادئة) لها معنى خاص، لذا فإن المسافة الخاطئة تسبب خطأ.
    1.3

    الإدخال، المعالجة، الإخراج

    English

    Many programs follow a simple plan: input 输入 → process → output. You get some data, do something with it, then show a result.

    The input() function reads text that the user types. It always gives back a string.

    • input() waits for the user to type and press Enter.
    • Store the typed text in a variable 变量 so you can use it later.
    • Because input() returns a string, change it with int(...) first if you need a number.

    Common mistakes

    • Forgetting the quotes: print(Hello) looks for a variable named Hello and raises a NameError. Text needs quotes: print("Hello").
    • A stray space at the start of a line: Python reads indentation as structure, so it raises an IndentationError.
    • Assuming input() returns a number. It always returns a string, so wrap it in int(...) before doing any maths.
    العربية

    تتبع العديد من البرامج خطة بسيطة: إدخال → معالجة → إخراج. تحصل على بعض البيانات، تقوم بشيء ما بها، ثم تعرض النتيجة.

    دالة input() تقرأ النص الذي يكتبه المستخدم. تُرجع دائمًا نصًا (string).

    name = input("What is your name? ")
    print("Hello, " + name)
    
    • input() ينتظر المستخدم ليقوم بالكتابة والضغط على Enter.
    • احفظ النص المكتوب في متغير لتتمكن من استخدامه لاحقًا.
    • نظرًا لأن input() تُرجع نصًا، قم بتحويلها باستخدام int(...) أولًا إذا كنت بحاجة إلى رقم.

    أخطاء شائعة

    • نسيان علامات التنصيص: print(Hello) تبحث عن متغير باسم Hello وتُثير NameError. النص يحتاج إلى تنصيص: print("Hello").
    • مسافة زائدة في بداية السطر: بايثون يقرأ المسافة البادئة كهيكل، لذا تُثير IndentationError.
    • افتراض أن input() تُرجع رقمًا. إنها تُرجع دائمًا نصًا، لذا غلفها بـ int(...) قبل إجراء أي عمليات حسابية.
  • 2 Variables, types & operators · ⁨المتغيرات، الأنواع والعمليات⁩
    2.1

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

    English

    A variable 变量 is a name for a value 值. You make one with =, which is called assignment 赋值. The name goes on the left; the value goes on the right.

    Now age holds 17. Use the name anywhere you need the value, and change it later:

    • The = sign does not mean "equal". It means "store the right side under the left name".
    • To test if two values are equal, use == (see below).
    العربية

    المتغير هو اسم للقيمة. تنشئه باستخدام =، والذي يُسمى التعيين. الاسم يكون على اليسار؛ القيمة تكون على اليمين.

    age = 17
    name = "Mei"
    price = 9.99
    print(age, name, price)
    

    الآن age يحتوي على 17. استخدم الاسم أينما تحتاج القيمة، وغيّرها لاحقًا:

    age = 17
    age = age + 1   # age is now 18
    print(age)
    
    المتغير هو اسم مرتبط بقيمة مخزنة
    يشير كل اسم متغير إلى قيمة في الذاكرة
    • علامة = لا تعني "يساوي". بل تعني "احفظ الجانب الأيمن تحت الاسم الأيسر".
    • لاختبار ما إذا كانت قيمتان متساويتين، استخدم == (أنظر أدناه).
    2.2

    الأرقام: int & float

    English

    Python has two main number types. An integer 整数 (int) is a whole number like 17. A float 浮点数 (float) has a decimal point like 9.99.

    These operators 运算符 work on numbers:

    Operator Meaning Example Result
    + add 3 + 2 5
    - subtract 3 - 2 1
    * multiply 3 * 2 6
    / divide (always float) 7 / 2 3.5
    // integer divide 7 // 2 3
    % remainder (modulo) 7 % 2 1
    ** power 2 ** 3 8
    • / always gives a float, so 4 / 2 is 2.0.
    • // and % go together: 17 // 5 is 3, and 17 % 5 is 2.
    العربية

    يحتوي بايثون على نوعين رئيسيين للأرقام. العدد الصحيح (int) هو عدد صحيح مثل 17. الكسر العشري (float) يحتوي على نقطة عشرية مثل 9.99.

    تعمل هذه العمليات الحسابية على الأرقام:

    العملية المعنى المثال النتيجة
    + إضافة 3 + 2 5
    - طرح 3 - 2 1
    * ضرب 3 * 2 6
    / قسمة (دائماً كسر عشري) 7 / 2 3.5
    // قسمة صحيحة 7 // 2 3
    % باقي القسمة (modulo) 7 % 2 1
    ** أس (قوة) 2 ** 3 8
    • / تُرجع دائمًا كسرًا عشريًا، لذا 4 / 2 هي 2.0.
    • // و% يعملان معًا: 17 // 5 هي 3، و17 % 5 هي 2.
    2.3

    التعبيرات وتحويل النوع

    English

    An expression 表达式 is anything that has a value, like 3 + 4 * 2. Python uses normal maths order (* and / before + and -); add brackets to make the order clear.

    input() gives a string, so convert it before doing maths. Changing a value from one type to another is type conversion 类型转换:

    • int("abc") fails, so only convert text that looks like a number.
    • Mixing types fails too: "age: " + 17 is an error; write "age: " + str(17).
    العربية

    التعبير هو أي شيء له قيمة، مثل 3 + 4 * 2. يستخدم بايثون ترتيب العمليات الحسابية الطبيعي (* و/ قبل + و-)؛ أضف أقواس لجعل الترتيب واضحًا.

    input() تُرجع نصًا، لذا حولها قبل إجراء العمليات الحسابية. تغيير قيمة من نوع إلى آخر هو تحويل النوع (type conversion):

    age = int("17")        # text "17" -> number 17
    price = float("9.99")  # text -> 9.99
    label = str(17)        # number -> text "17"
    print(age, price, label)
    
    • int("abc") تفشل، لذا حوّل فقط النصوص التي تشبه الأرقام.
    • خلط الأنواع يفشل أيضًا: "age: " + 17 هو خطأ؛ اكتب "age: " + str(17).
    2.4

    المنطق والمقارنة

    English

    A Boolean 布尔值 is one of just two values: True or False. A comparison 比较 gives back a Boolean.

    Operator Meaning
    == equal to
    != not equal to
    < > less than / greater than
    <= >= less / greater than or equal to

    Join comparisons with and, or, not:

    Common mistakes

    • / always gives a float, even 4 / 2 is 2.0. Use // when you want a whole number.
    • Using = where you mean ==: = assigns a value, == tests whether two values are equal.
    • Joining a string and a number: "age: " + 5 raises a TypeError. Convert first with str(5).
    • Floats are not exact, so 0.1 + 0.2 is not exactly 0.3 — avoid == on float results.
    العربية

    القيمة المنطقية (Boolean) هي واحدة من قيمتين فقط: True أو False. المقارنة تُرجع قيمة منطقية.

    العملية المعنى
    == يساوي
    != لا يساوي
    < > أصغر من / أكبر من
    <= >= أصغر من أو يساوي / أكبر من أو يساوي
    print(7 > 2)        # True
    print(3 == 3.0)     # True
    age = 20
    print(age >= 18)    # True
    

    اجمع المقارنات باستخدام and، or، not:

    age = 20
    print(age >= 13 and age <= 19)   # True only for a teenager
    

    أخطاء شائعة

    • / تُرجع دائمًا كسرًا عشريًا، حتى لو كان 4 / 2 هو 2.0. استخدم // عندما تريد عددًا صحيحًا.
    • استخدام = بدلاً من ==: = يعيّن قيمة، بينما == يختبر ما إذا كانت قيمتان متساويتين.
    • دمج نص ورقم: "age: " + 5 تُثير TypeError. حوّل أولاً باستخدام str(5).
    • الكسور العشرية ليست دقيقة تمامًا، لذا 0.1 + 0.2 ليست بالضبط 0.3 — تجنب == على نتائج الكسور العشرية.
  • 3 Strings · ⁨النصوص⁩
    3.1

    الفهرسة

    English

    A string 字符串 is text inside quotes. Each character 字符 has a position, called its index 索引. The first index is 0, not 1.

    Read one character with square brackets:

    • Counting starts at 0, so the last index is len(word) - 1.
    • A negative index counts back from the end: word[-1] is the last character.
    • An index that is too large gives an error 错误 (an IndexError).
    العربية

    النص هو نص داخل علامات تنصيص. لكل حرف موقع، يُسمى فهرسه. الفهرس الأول هو 0، وليس 1.

    اقرأ حرفًا واحدًا باستخدام الأقواس المربعة:

    word = "Python"
    print(word[0])    # P  (the first character)
    print(word[2])    # t
    print(len(word))  # 6  (how many characters)
    
    • يبدأ العد من 0، لذا الفهرس الأخير هو len(word) - 1.
    • الفهرس السالب يعدّ للخلف من النهاية: word[-1] هو الحرف الأخير.
    word = "Python"
    print(word[-1])   # n
    print(word[-2])   # o
    
    • الفهرس الذي يكون كبيرًا جدًا يسبب خطأ (وهو IndexError).
    s[start:stop] هي نافذة مفتوحة جزئيًا من الأحرف
    s[start:stop] هي نافذة مفتوحة جزئيًا من الأحرف
    3.2

    التقطيع (Slicing)

    English

    A slice 切片 takes a part of a string. Write word[start:end]. The slice keeps start but stops before end.

    • Leave out start to begin at 0; leave out end to go to the end.
    • A third number is the step 步长. word[::-1] reverses 反转 the string.
    العربية

    الشرطة تأخذ جزءًا من النص. اكتب word[start:end]. تحافظ الشريحة على start but تتوقف قبل end.

    word = "Python"
    print(word[0:3])   # Pyt   (positions 0, 1, 2)
    print(word[2:5])   # tho
    
    • تخطِّ start للبدء من 0؛ تخطِّ end للذهاب إلى النهاية.
    word = "Python"
    print(word[:3])    # Pyt
    print(word[3:])    # hon
    
    • الرقم الثالث هو الخطوة. word[::-1] يعكس النص.
    print("Python"[::-1])   # nohtyP
    
    3.3

    دوال النص وطوله

    English

    A method 方法 is a function that belongs to a value. You call it with a dot:

    Strings are immutable 不可变: a method returns a new string and never changes the original 原始 one.

    Common methods (each returns a new value):

    Method Meaning Example Result
    .upper() / .lower() change case "Hi".lower() hi
    .strip() remove edge spaces " hi ".strip() hi
    .replace(a, b) swap text "cat".replace("c", "b") bat
    .split(sep) break into a list "a,b".split(",") ['a', 'b']

    Join strings with +. This is called concatenation 拼接:

    العربية

    الدالة (method) هي دالة تتبع قيمة. استدعيها بنقطة:

    name = "mei chen"
    print(name.upper())     # MEI CHEN
    print(name.title())     # Mei Chen
    print(len(name))        # 8
    

    النصوص غير قابلة للتغيير: الدالة تُرجع نصًا جديدًا ولا تغير النص الأصلي أبدًا.

    name = "mei"
    print(name.upper())     # MEI  (the returned value)
    print(name)             # mei  (the original is unchanged)
    

    دوال شائعة (كل منها يُرجع قيمة جديدة):

    الدالة المعنى المثال النتيجة
    .upper() / .lower() تغيير الحالة "Hi".lower() hi
    .strip() إزالة المسافات الهامشية " hi ".strip() hi
    .replace(a, b) تبديل النص "cat".replace("c", "b") bat
    .split(sep) تفكيك إلى قائمة "a,b".split(",") ['a', 'b']

    اجمع النصوص باستخدام +. هذا يسمى الوصل (concatenation):

    first = "Mei"
    last = "Chen"
    print(first + " " + last)   # Mei Chen
    
    3.4

    n-strings

    English

    An f-string 格式化字符串 builds text from values. Put f before the quote, then write {...} around a value.

    • Any expression 表达式 can go inside the braces.
    • {value:.2f} rounds to 2 decimal places 小数位.

    Common mistakes

    • Strings cannot be changed in place: s[0] = "x" raises an error. Build a new string instead.
    • Indexing starts at 0; the last character is s[-1], and s[len(s)] is out of range.
    • A slice s[a:b] includes a but stops before b.
    • String methods return a NEW string: s.upper() does nothing unless you store the result.
    العربية

    n-string يبني نصًا من القيم. ضع f قبل علامة التنصيص، ثم اكتب {...} حول قيمة.

    name = "Mei"
    age = 17
    print(f"{name} is {age} years old")   # Mei is 17 years old
    
    • يمكن وضع أي تعبير داخل الأقواس.
    • {value:.2f} يُقرب إلى 2 منازل عشرية.
    price = 9.5
    print(f"Two cost {price * 2}")        # Two cost 19.0
    print(f"Pi is about {3.14159:.2f}")   # Pi is about 3.14
    

    أخطاء شائعة

    • لا يمكن تغيير النصوص في مكانها: s[0] = "x" تُثير خطأ. قم بإنشاء نص جديد بدلاً من ذلك.
    • تبدأ الفهرسة من 0؛ الحرف الأخير هو s[-1]، وs[len(s)] خارج النطاق.
    • تقطيع s[a:b] يتضمن a ويتوقف قبل b.
    • دوال النص تُرجع نصًا جديداً: s.upper() لن يفعل شيئًا إلا إذا قمت بتخزين النتيجة.
  • 4 Selection · ⁨الاختيار⁩
    4.1

    if / elif / else

    English

    A program chooses what to do with if. It runs an indented 缩进 block only when a condition 条件 is true. The if line ends with a colon 冒号.

    Add elif (else-if) for more cases and else for "anything else". Python runs the first true branch 分支 only, then skips the rest.

    • Compare values with == (equal to), != (not equal to), <, >, <=, >=.
    • A comparison 比较 gives a Boolean 布尔值 — either True or False.
    العربية

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

    score = 72
    if score >= 60:
        print("pass")
    # pass
    

    أضف elif (إلا إذا) لحالات أكثر وأضف else لـ "أي حالة أخرى". تقوم Python بتنفيذ الفرع الصحيح الأول فقط، ثم تتخطى الباقي.

    score = 72
    if score >= 80:
        print("A")
    elif score >= 60:
        print("B")
    else:
        print("fail")
    # B
    
    • قارن القيم باستخدام == (يساوي)، != (لا يساوي)، <، >، <=، >=.
    • تعطي المقارنة قيمة منطقية — إما True أو False.
    if / elif / else: يتم تنفيذ فرع واحد فقط
    if / elif / else: يتم تنفيذ فرع واحد فقط
    4.2

    دمج الشروط

    English

    Join conditions with and, or, not. and needs both sides true; or needs either side true; not flips a Boolean.

    • Use brackets to make the order clear: (a or b) and c.

    Common mistakes

    • Write elif, not else if.
    • Every if / elif / else line ends with a colon :, and its body must be indented.
    • if x = 5: is an error — use == to compare.
    • else takes no condition; only if and elif do.
    العربية

    اجمع الشروط باستخدام and، or، not. يحتاج and أن تكون كلا الطرفين صحيحين؛ يحتاج or أن يكون أحد الطرفين صحيحًا؛ يعكس not القيمة المنطقية.

    age = 16
    has_ticket = True
    if age >= 18 and has_ticket:
        print("entry allowed")
    else:
        print("entry refused")
    # entry refused
    
    • استخدم الأقواس لتوضيح الترتيب: (a or b) and c.
    temp = 30
    if temp > 25 and not temp > 35:
        print("warm but ok")
    # warm but ok
    

    أخطاء شائعة

    • اكتب elif، لا else if.
    • كل سطر if / elif / else ينتهي بفاصلة منقوطة :، ويجب تنسيق جسمه بالمسافة البادئة.
    • if x = 5: خطأ — استخدم == للمقارنة.
    • لا يأخذ else شرطًا؛ بل if وelif فقط.
  • 5 Iteration · ⁨التكرار⁩
    5.1

    حلقات for ونطاق range

    English

    A loop 循环 repeats code. A for loop repeats once for each item in a sequence 序列. range(n) gives the numbers 0 up to n - 1.

    • range(a, b) goes from a up to (but not including) b.
    • range(a, b, step) adds a step 步长 each time.
    العربية

    الحلقة تكرر الكود. حلقة for تكرر مرة واحدة لكل عنصر في تسلسل. تُعطي range(n) الأرقام من 0 إلى n - 1.

    for i in range(5):
        print(i)
    # 0, then 1, 2, 3, 4 (each on its own line)
    
    • يذهب range(a, b) من a إلى (ولكن دون تضمين) b.
    • يضيف range(a, b, step) خطوة في كل مرة.
    for n in range(2, 11, 2):
        print(n)        # 2 4 6 8 10
    
    for i in range(n): يعمل الجسم مع i = 0 … n-1
    for i in range(n): يعمل الجسم مع i = 0 … n-1
    5.2

    نمط المجمع

    English

    To build a result across a loop, start a variable before the loop, then update 更新 it each turn. This is the accumulator 累加器 pattern.

    • The same idea counts how many items match a test.
    العربية

    لبناء نتيجة عبر حلقة، ابدأ متغيرًا قبل الحلقة، ثم قم بتحديثه في كل دورة. هذا هو نمط المجمع.

    total = 0
    for n in range(1, 6):
        total = total + n
    print(total)        # 15
    
    • نفس الفكرة يحسب عدد العناصر التي تطابق اختبارًا معينًا.
    count = 0
    for letter in "banana":
        if letter == "a":
            count = count + 1
    print(count)        # 3
    
    5.3

    حلقات while

    English

    A while loop repeats as long as a condition stays true. Change something inside, or it never stops — an infinite loop 无限循环.

    • break leaves the loop straight away.
    العربية

    تكرّر حلقة while طالما يبقى الشرط صحيحًا. غيّر شيئًا بداخلها، وإلا فلن تتوقف أبدًا — حلقة لا نهائية.

    n = 1
    while n <= 3:
        print(n)
        n = n + 1
    # 1 2 3
    
    • يُخرجك break من الحلقة فورًا.
    total = 0
    while True:
        total = total + 10
        if total >= 30:
            break
    print(total)        # 30
    
    5.4

    الحلقات المتداخلة

    English

    A loop inside another loop is a nested loop 嵌套循环. The inner loop 内层循环 runs fully for each turn of the outer loop 外层循环.

    Common mistakes

    • range(n) goes from 0 to n - 1, not 1 to n — the classic off-by-one error.
    • Changing a list while looping over it skips items; loop over a copy if you must remove things.
    • Forgetting to change the loop variable in a while makes it run forever.
    • Indentation decides what is inside the loop; a wrongly-indented line runs only once, after the loop.
    العربية

    الحلقة داخل حلقة أخرى هي حلقة متداخلة. تعمل الحلقة الداخلية بالكامل في كل دورة للحلقة الخارجية.

    for row in range(3):
        line = ""
        for col in range(3):
            line = line + "*"
        print(line)
    # ***
    # ***
    # ***
    

    أخطاء شائعة

    • يذهب range(n) من 0 إلى n - 1، وليس من 1 إلى n — الخطأ الكلاسيكي بإزاحة بمقدار واحد.
    • تغيير قائمة أثناء المرور عليها يتجاوز بعض العناصر؛ مرر على نسخة إذا كان عليك إزالة أشياء.
    • نسيان تغيير متغير الحلقة في while يجعلها تعمل إلى ما لا نهاية.
    • المسافة البادئة تحدد ما هو داخل الحلقة؛ السطر الخاطئ المسافة البادئة يعمل مرة واحدة فقط، بعد الحلقة.
  • 6 Lists & 2-D lists · ⁨القوائم وقوائم 2-D⁩
    6.1

    القوائم

    English

    A list 列表 holds many values in order, inside []. Each item 元素 has an index (from 0).

    • Change an item by its index: scores[1] = 100.
    • A list can grow and shrink; a string cannot.

    The everyday list tools:

    Tool Does
    a.append(x) adds x at the end
    a.insert(i, x) inserts x at position i
    a.remove(x) removes the first x
    a.pop() / a.pop(i) removes and returns the last item / item i
    a.sort() sorts the list in place
    sorted(a) returns a NEW sorted list
    x in a is x in the list?
    len(a), sum(a), max(a), min(a) size and quick maths
    العربية

    تحفظ القائمة قيمًا عديدة بالترتيب، داخل []. لكل عنصر فهرس (من 0).

    scores = [88, 71, 95]
    print(scores[0])      # 88
    print(len(scores))    # 3
    scores.append(60)     # add to the end
    print(scores)         # [88, 71, 95, 60]
    
    • غيّر عنصرًا بفهرسه: scores[1] = 100.
    • يمكن للقائمة أن تكبر وتصغر؛ ولا يمكن للنص ذلك.

    أدوات القوائم اليومية:

    الأداة تفعل
    a.append(x) تضيف x في النهاية
    a.insert(i, x) يُدخل x عند الموضع i
    a.remove(x) يزيل أول x
    a.pop() / a.pop(i) تزيل وتُرجع آخر عنصر / العنصر i
    a.sort() ترتب القائمة محليًا
    sorted(a) تُرجع قائمة مُرتبة جديدة
    x in a هل x موجود في القائمة؟
    len(a)، sum(a)، max(a)، min(a) الحجم والحساب السريع
    فهارس القائمة تبدأ من 0
    فهارس القائمة تبدأ من 0
    6.2

    المرور على قائمة

    English

    To traverse 遍历 a list is to visit each item. A for loop does this with no index needed.

    • Use enumerate when you also need the index.
    العربية

    المرور على القائمة يعني زيارة كل عنصر. تقوم حلقة for بذلك بدون الحاجة لفهرس.

    scores = [88, 71, 95]
    total = 0
    for s in scores:
        total = total + s
    print(total)          # 254
    
    • استخدم enumerate عندما تحتاج أيضًا إلى الفهرس.
    for i, name in enumerate(["a", "b"]):
        print(i, name)    # 0 a  /  1 b
    
    6.3

    قوائم متعددة الأبعاد 2 (شبكات)

    English

    A 2-D list 二维列表 is a list of lists — a grid 网格 of rows and columns. Use two indexes: grid[row][col].

    • A nested loop 嵌套循环 visits every cell.
    العربية

    القائمة متعددة الأبعاد 2 هي قائمة من القوائم — شبكة من الصفوف والأعمدة. استخدم مؤشرين: grid[row][col].

    grid = [[1, 2, 3],
            [4, 5, 6]]
    print(grid[0][2])     # 3
    print(grid[1][0])     # 4
    
    • حلقة متداخلة تزور كل خلية.
    grid = [[1, 2], [3, 4]]
    for row in grid:
        for value in row:
            print(value, end=" ")
    print()               # 1 2 3 4
    
    6.4

    استيعاب القوائم

    English

    A list comprehension 列表推导式 builds a new list in one line: [expression for item in sequence].

    • Add if to keep only some items.
    العربية

    استيعاب القائمة يبني قائمة جديدة في سطر واحد: [expression for item in sequence].

    squares = [x * x for x in range(5)]
    print(squares)        # [0, 1, 4, 9, 16]
    
    • أضف if للاحتفاظ ببعض العناصر فقط.
    evens = [n for n in range(10) if n % 2 == 0]
    print(evens)          # [0, 2, 4, 6, 8]
    
    6.5

    المجموعات الثابتة والمجموعات

    English

    A tuple 元组 is a fixed sequence in round brackets. It cannot be changed after it is made — use one for values that belong together, and unpack 解包 it into names.

    A function that needs to hand back two results returns a tuple:

    A set 集合 stores each value once, with no order. It is perfect for removing duplicates and for fast membership tests 成员测试.

    Common mistakes

    • b = a does not copy a list: both names point to the same list, so changing one changes the other. Use a.copy() or a[:].
    • The last item is a[-1]; a[len(a)] is out of range.
    • append adds ONE item; use extend or + to join another list.
    • Building a grid with [[0]*3]*3 makes three copies of the same row. Build the rows in a loop instead.
    • A tuple with one item needs a comma: (5,), not (5).
    • A set has no order and no duplicates, so you cannot index it with s[0].
    العربية

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

    point = (3, 4)
    x, y = point            # unpacking
    print(x, y)             # 3 4
    

    الدالة التي تحتاج إلى إرجاع نتيجتين تُرجع مجموعة ثابتة:

    def min_max(nums):
        return min(nums), max(nums)
    
    lo, hi = min_max([5, 2, 9])
    print(lo, hi)           # 2 9
    

    تخزن المجموعة كل قيمة مرة واحدة، بدون ترتيب. إنها مثالية لإزالة التكرارات ولاختبارات الانتماء السريعة.

    votes = ["red", "blue", "red", "green", "red"]
    colours = set(votes)
    print(len(colours))         # 3  (duplicates removed)
    print("blue" in colours)    # True
    

    أخطاء شائعة

    • لا يقوم b = a بنسخ القائمة: كلا الاسمين يشيران إلى نفس القائمة، لذا فإن تغيير أحدهما يغير الآخر. استخدم a.copy() أو a[:].
    • العنصر الأخير هو a[-1]؛ a[len(a)] خارج النطاق.
    • يضيف append عنصرًا واحدًا؛ استخدم extend أو + لضم قائمة أخرى.
    • بناء شبكة باستخدام [[0]*3]*3 يجعل ثلاث نسخ من نفس الصف. قم بإنشاء الصفوف داخل حلقة بدلاً من ذلك.
    • العنصر الأحادي يحتاج فاصلة: (5,)، لا (5).
    • المجموعة ليس لها ترتيب ولا تكرارات، لذا لا يمكنك استخدام الفهرس بها مع s[0].
  • 7 Dictionaries · ⁨المفردات (Dictionaries)⁩
    7.1

    القواميس

    English

    A dictionary 字典 (dict) stores key 键 → value 值 pairs. You look up a value by its key, not by a number index.

    Add and update

    Assign to a key to add it, or to change an existing one.

    Check and loop

    Use in to test for a key. Loop over the keys, or over .items() to get both key and value.

    • .get(key, default) returns a default 默认值 when the key is missing — no error.

    The classic exam pattern — tally how often each value appears:

    • .get(letter, 0) supplies 0 the first time a key is seen, so there is no KeyError.

    Common mistakes

    • Reading a missing key with d[key] raises a KeyError; use d.get(key) or test if key in d first.
    • Assigning d[key] again overwrites the old value — keys are unique.
    • Keys must be immutable, such as a string or number — a list cannot be a key.
    العربية

    التحفظ القاموس (dict) أزواج مفتاح → قيمة. تبحث عن قيمة بواسطة مفتاحها، وليس بفهرس رقمي.

    student = {"name": "Mei", "score": 88}
    print(student["name"])     # Mei
    print(student["score"])    # 88
    

    الإضافة والتحديث

    أعِني لمفتاح لإضافته، أو لتغيير موجود.

    student = {"name": "Mei"}
    student["score"] = 88      # add a new key
    student["score"] = 90      # update the value
    print(student)             # {'name': 'Mei', 'score': 90}
    

    التحقق والتكرار

    استخدم in لاختبار وجود مفتاح. كرر فوق المفاتيح، أو فوق .items() للحصول على المفتاح والقيمة معًا.

    student = {"name": "Mei", "score": 90}
    print("score" in student)  # True
    for key, value in student.items():
        print(key, "=", value)
    # name = Mei
    # score = 90
    
    • يُرجع .get(key, default) افتراضيًا عند عدم وجود المفتاح — بدون خطأ.
    student = {"name": "Mei"}
    print(student.get("age", 0))   # 0
    

    النمط الكلاسيكي للامتحان — احسب كم مرة يظهر كل قيمة:

    word = "banana"
    counts = {}
    for letter in word:
        counts[letter] = counts.get(letter, 0) + 1
    print(counts)   # {'b': 1, 'a': 3, 'n': 2}
    
    • يُوفر .get(letter, 0) 0 عند ظهور المفتاح لأول مرة، لذا لا يحدث KeyError.

    أخطاء شائعة

    • قراءة مفتاح مفقود باستخدام d[key] ترفع KeyError؛ استخدم d.get(key) أو اختبر if key in d أولاً.
    • إعادة تعيين d[key] تستبدل القيمة القديمة — المفاتيح فريدة.
    • يجب أن تكون المفاتيح غير قابلة للتغيير، مثل النص أو الرقم — لا يمكن للقائمة أن تكون مفتاحًا.
    يُربط القاموس كل مفتاح بقيمة واحدة
    يُربط القاموس كل مفتاح بقيمة واحدة
  • 8 Functions & abstraction · ⁨الدوال والتجريد⁩
    8.1

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

    English

    A function 函数 is a named block of code you can reuse. Define 定义 it with def, then call 调用 it by name.

    • The code inside runs only when you call the function.
    العربية

    الدالة هي كتلة كود مسماة يمكنك إعادة استخدامها. عرّفها باستخدام def، ثم استدعها بالاسم.

    def greet():
        print("Hello!")
    
    greet()        # Hello!
    greet()        # Hello!
    
    • يعمل الكود بداخلها فقط عندما تستدعي الدالة.
    def يُعرّف؛ call يُنفذ؛ return يُرجع قيمة
    def يُعرّف؛ call يشغّل؛ return يرسل قيمة
    8.2

    إرجاع القيم

    English

    A function can return 返回 a value with return. The call then stands for that value.

    • return ends the function at once. A function with no return gives None.
    العربية

    يمكن للدالة إرجاع قيمة مع return. بعد ذلك، تمثل الدالة تلك القيمة.

    def square(n):
        return n * n
    
    print(square(5))          # 25
    print(square(3) + 1)      # 10
    
    • يُنهك return الدالة فوراً. أي دالة بدون return تُرجع None.
    8.3

    المعاملات، الحُجج والنطاق

    English

    A parameter 形参 is the name in the def. An argument 实参 is the value you pass in.

    A variable made inside a function is local 局部 — it exists only there. That region is its scope 作用域.

    A parameter can have a default value 默认值, used when the caller leaves it out:

    العربية

    المعامل هو الاسم في def. والحجة هي القيمة التي تمررها.

    def power(base, exp):         # base, exp are parameters
        return base ** exp
    
    print(power(2, 3))            # 8  (2 and 3 are arguments)
    

    المتغير الذي يتم إنشاؤه داخل دالة يكون محلياً — فهو موجود هناك فقط. هذه المنطقة هي نطاقه.

    def f():
        x = 10            # local to f
        return x
    
    print(f())            # 10
    # print(x) here would be an error: x is not defined outside f
    

    يمكن للمعامل أن يحتوي على قيمة افتراضية، تُستخدم عندما يترك المُدعيها:

    def greet(name, greeting="Hello"):
        return greeting + ", " + name
    
    print(greet("Mei"))              # Hello, Mei
    print(greet("Sam", "Welcome"))   # Welcome, Sam
    
    8.4

    التجريد الإجرائي

    English

    Procedural abstraction 过程抽象 means hiding details behind a name. You use a function by its name and what it does, not by how it works.

    • A good function does one job, has a clear name, and avoids repeating code.
    العربية

    التجريد الإجرائي يعني إخفاء التفاصيل خلف اسم. تستخدم الدالة باسمها وما تفعله، وليس بكيفية عملها.

    def area_of_rectangle(w, h):
        return w * h
    
    print(area_of_rectangle(4, 5))   # 20
    
    • الدالة الجيدة تقوم بوظيفة واحدة، لها اسم واضح، وتتجنب تكرار الكود.
    8.5

    الوحدات والاستيراد

    English

    A module 模块 is a file of ready-made functions. Bring one in with import 导入.

    Common mistakes

    • A function returns None unless you write return. Printing is not the same as returning.
    • Never use a mutable default like def f(x=[]) — the same list is shared between all calls.
    • A variable made inside a function is local and cannot be seen outside it.
    • Run a function with f(); writing f on its own only names it.
    العربية

    الوحدة هي ملف يحتوي على دوال جاهزة. استورد إحداها باستخدام import.

    import random
    random.seed(0)               # makes the result repeatable
    print(random.randint(1, 6))  # a dice roll
    
    import math
    print(math.sqrt(16))         # 4.0
    

    أخطاء شائعة

    • الدالة تُرجع None إلا إذا كتبت return. الطباعة ليست نفسها الإرجاع.
    • لا تستخدم أبداً قيمة افتراضية قابلة للتعديل مثل def f(x=[]) — نفس القائمة تُشارك بين جميع الاستدعاءات.
    • المتغير الذي يتم إنشاؤه داخل دالة يكون محلياً ولا يمكن رؤيته خارجها.
    • شغّل الدالة باستخدام f()؛ كتابة f وحدها تُسمّيه فقط.
  • 9 Errors, exceptions & testing · ⁨الأخطاء والاستثناءات والاختبار⁩
    9.1

    الأخطاء والتشخيص

    English

    Code can fail in three ways. A syntax error 语法错误 breaks Python's rules, so it never runs. A runtime error 运行时错误 happens while running, like dividing by zero. A logic error 逻辑错误 runs but gives the wrong answer.

    • Python prints a traceback 回溯 showing where it failed. Read it from the bottom up.
    العربية

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

    # A runtime error, caught so this block still finishes:
    try:
        print(10 / 0)
    except ZeroDivisionError:
        print("cannot divide by zero")
    # cannot divide by zero
    
    • يطبع بايثون مسار التتبع (traceback) يُظهر أين فشل. اقرأه من الأسفل إلى الأعلى.
    أخطاء بايثون الشائعة: بناء الجملة، الاسم، النوع، الفهرس
    أخطاء بايثون الشائعة: بناء الجملة، الاسم، النوع، الفهرس
    9.2

    try / except / raise

    English

    Wrap risky code in try. If it fails, except catches the exception 异常 and handles 处理 it, instead of crashing.

    • Catch a specific type (ValueError, ZeroDivisionError, …).
    • raise makes your own error on purpose.
    العربية

    حِضّن الكود الخطير في try. إذا فشل، except يلتقط الاستثناء ويتعامل معه بدلاً من انهيار البرنامج.

    def to_int(text):
        try:
            return int(text)
        except ValueError:
            return 0
    
    print(to_int("42"))    # 42
    print(to_int("abc"))   # 0
    
    • التقط نوعاً محدداً (ValueError، ZeroDivisionError، …).
    • raise يُنشئ خطأً خاصاً بك عن قصد.
    def set_age(age):
        if age < 0:
            raise ValueError("age cannot be negative")
        return age
    
    try:
        set_age(-1)
    except ValueError as err:
        print("error:", err)
    # error: age cannot be negative
    
    9.3

    الاختبار والصلابة

    English

    A test 测试 checks that code gives the right answer. Try normal cases and edge cases 边界情形 — empty input, zero, very large values.

    • Robust 健壮 code does not crash on strange input; it handles it gracefully.

    Common mistakes

    • Do not use a bare except: — catch the specific error, e.g. except ValueError:.
    • A syntax error stops the whole program before it runs, so fix those first.
    • Test the edge cases (empty input, zero, the largest value), not just the easy one.
    العربية

    الاختبار يتحقق من أن الكود يعطي الإجابة الصحيحة. جرب الحالات العادية و حالات الحواف — إدخال فارغ، صفر، قيم كبيرة جداً.

    def average(nums):
        if len(nums) == 0:        # edge case: empty list
            return 0
        return sum(nums) / len(nums)
    
    print(average([2, 4, 6]))     # 4.0
    print(average([]))            # 0
    
    • الكود الصلب لا ينهار عند إدخال غريب؛ بل يتعامل معه بروية.

    أخطاء شائعة

    • لا تستخدم except: عاري — التقط الخطأ المحدد، مثلاً except ValueError:.
    • خطأ بناء الجملة يوقف البرنامج بالكامل قبل أن يعمل، لذا إصلاحها أولاً.
    • اختبر حالات الحواف (الإدخال الفارغ، الصفر، أكبر قيمة)، ليس فقط الحالة السهلة.
  • 10 Files · ⁨الملفات⁩
    10.1

    قراءة وكتابة ملفات النص

    English

    A text file 文本文件 stores text on disk. Open it with open(name, mode) where mode 模式 says read or write. Always use with, which closes the file for you.

    Writing

    Mode "w" writes a new file and erases any old one.

    Reading

    Mode "r" (the default) reads. .read() returns the whole file as one string.

    Line by line

    Loop over the file to get one line at a time. .strip() removes 去除 the newline 换行符 at the end.

    Appending

    Mode "a" appends 追加 — it adds to the end without erasing.

    Mode Meaning
    "r" read (default)
    "w" write (erases first)
    "a" append (add to the end)

    Common mistakes

    • Always close a file, or use with open(...) as f: which closes it for you.
    • read() gives the whole file as one string, and each line still ends with \n.
    • Opening with "w" erases the file first; use "a" to add to the end.
    العربية

    ملف نصي يخزن النص على القرص. افتحه باستخدام open(name, mode) حيث يشير الوضع إلى القراءة أو الكتابة. استخدم دائماً with، الذي يغلق الملف عنك.

    الكتابة

    وضع "w" يكتب ملفاً جديداً ويمسح أي ملف قديم.

    with open("notes.txt", "w") as f:
        f.write("first line\n")
        f.write("second line\n")
    print("saved")            # saved
    

    القراءة

    وضع "r" (الافتراضي) يقرأ. .read() يُرجع الملف بأكمله كسلسلة واحدة.

    with open("notes.txt", "w") as f:
        f.write("hello\nworld\n")
    with open("notes.txt") as f:
        print(f.read().strip())   # hello / world
    

    سطراً بسطر

    مرر على الملف للحصول على سطر واحد في كل مرة. .strip() يزيل السطر الجديد في النهاية.

    with open("data.txt", "w") as f:
        f.write("Mei,88\nSam,71\n")
    with open("data.txt") as f:
        for line in f:
            name, score = line.strip().split(",")
            print(name, "scored", score)
    # Mei scored 88
    # Sam scored 71
    

    الإضافة

    وضع "a" يُضيف — يضيف في النهاية دون مسح.

    with open("log.txt", "w") as f:
        f.write("line 1\n")
    with open("log.txt", "a") as f:
        f.write("line 2\n")
    with open("log.txt") as f:
        print(f.read().strip())   # line 1 / line 2
    
    الوضع المعنى
    "r" قراءة (افتراضي)
    "w" كتابة (يمسح أولاً)
    "a" إضافة (إضافة في النهاية)

    أخطاء شائعة

    • أغلق الملف دائماً، أو استخدم with open(...) as f: الذي يغلقه عنك.
    • تُعيد read() الملف كاملاً كنص واحد، ولا تزال كل سطر ينتهي بـ \n.
    • فتحه بـ "w" يمسح الملف أولاً؛ استخدم "a" للإضافة في النهاية.
    open → read/write → close (with auto-closes)
    open → read/write → close (with auto-closes)
  • 11 Algorithm design · ⁨تصميم الخوارزمية⁩
    11.1

    الخوارزميات والتفكيك

    English

    An algorithm 算法 is a clear list of steps that solves a problem. Decomposition 分解 means breaking a big problem into smaller parts you can solve one at a time.

    • Abstraction 抽象 means ignoring detail: you use largest(...) without re-reading how it works.
    العربية

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

    # Algorithm: find the largest number in a list
    def largest(nums):
        best = nums[0]
        for n in nums:
            if n > best:
                best = n
        return best
    
    print(largest([3, 9, 2, 7]))   # 9
    
    • التجريد يعني تجاهل التفاصيل: تستخدم largest(...) دون إعادة قراءة كيفية عملها.
    11.2

    الكود الوهمي والمخططات الانسيابية

    English

    Pseudocode 伪代码 is plain, structured English for an algorithm, written before the real code. It is not run.

    A flowchart 流程图 draws the same plan: a box for each step, a diamond for each decision 判断, and arrows for the order.

    العربية

    الكود الوهمي هو لغة إنجليزية بسيطة ومنظمة لخوارزمية، تُكتب قبل الكود الحقيقي. لا يتم تشغيله.

    SET best TO first number
    FOR Each number n
        IF n > best
          THEN
            SET best TO n
            OUTPUT best
    

    المخطط الانسيابي يرسم نفس المخطط: مربع لكل خطوة، معين لكل قرار، وأسهم للترتيب.

    11.3

    الاستدعاء الذاتي ومكدس الاستدعاءات

    English

    Recursion 递归 is when a function calls itself. It needs a base case 基准情形 (a simple input that returns at once) and a recursive case 递归情形 (it calls itself on a smaller input).

    • Each paused call sits on the call stack 调用栈 until the call above it returns.

    Common mistakes

    • Recursion needs a base case, or it calls itself forever and crashes the call stack.
    • Pseudocode is for planning — it need not run, but every step must be unambiguous.
    • Break a big problem into small named steps before you write any code.
    العربية

    الاستدعاء الذاتي هو عندما تستدعي الدالة نفسها. تحتاج إلى حالة أساسية (مدخل بسيط يُرجع فوراً) وحالة استدعاء ذاتي (تستدعي نفسها على مدخل أصغر).

    مكدس الاستدعاء لـ factorial(3): كل استدعاء ينتظر، ثم يعود بالترتيب العكسي
    مكدس الاستدعاء لـ factorial(3): كل استدعاء ينتظر، ثم يعود بالترتيب العكسي
    def fact(n):
        return 1 if n <= 1 else n * fact(n - 1)
    
    print(fact(5))     # 120
    
    • كل استدعاء متوقف يجلس على مكدس الاستدعاءات حتى يرجع الاستدعاء الذي فوقه.

    أخطاء شائعة

    • الاستدعاء الذاتي يحتاج لحالة أساسية، وإلا يستدعي نفسه إلى ما لا نهاية ويُسبب انهيار مكدس الاستدعاءات.
    • الكود الوهمي للتخطيط — لا يجب أن يعمل، لكن كل خطوة يجب أن تكون غير غامضة.
    • قسّم مشكلة كبيرة إلى خطوات صغيرة مسماة قبل كتابة أي كود.
  • 12 Data structures · ⁨هياكل البيانات⁩
    12.1

    أنواع البيانات المجردة (ADTs)

    English

    An abstract data type 抽象数据类型 (ADT) describes some data plus the operations on it, separate from how it is built. You use it through its operations, not through its inner storage.

    العربية

    نوع بيانات تجريدي (ADT) يصف بعض البيانات بالإضافة إلى العمليات عليها، منفصلة عن كيفية بنائها. تستخدمه من خلال عملياته، وليس من خلال تخزينه الداخلي.

    # A stack ADT, built on a list
    s = []
    s.append(1)        # add
    s.append(2)
    print(s.pop())     # 2  (remove the most recent)
    
    12.2

    المكدسات

    English

    A stack 栈 is last-in, first-out (LIFO 后进先出). You push 压入 onto the top and pop 弹出 from the top.

    العربية

    المكدس هو آخر الداخل، أول الخارج (LIFO). تدفع للأعلى وتُخرج من الأعلى.

    A stack removes from the top (LIFO); a queue removes from the front (FIFO)
    A stack removes from the top (LIFO); a queue removes from the front (FIFO)
    stack = []
    stack.append("a")
    stack.append("b")
    print(stack.pop())   # b
    print(stack.pop())   # a
    
    12.3

    الطوابير

    English

    A queue 队列 is first-in, first-out (FIFO 先进先出). You enqueue 入队 at the back and dequeue 出队 from the front.

    العربية

    الطابور هو أول الداخل، أول الخارج (FIFO). تضيف في الخلف وتُخرج من الأمام.

    queue = []
    queue.append("a")     # enqueue
    queue.append("b")
    print(queue.pop(0))   # a  (dequeue the front)
    print(queue.pop(0))   # b
    
    12.4

    القوائم المترابطة

    English

    A linked list 链表 is a chain of nodes 节点. Each node holds data and a pointer 指针 to the next node; the last points to None.

    العربية

    قائمة مترابطة هي سلسلة من العقد. كل عقدة تحتوي على بيانات ومؤشر للعقدة التالية؛ الأخيرة تشير إلى None.

    A linked list: each node holds data and a pointer to the next node, ending at None
    A linked list: each node holds data and a pointer to the next node, ending at None
    n3 = {"data": 3, "next": None}
    n2 = {"data": 2, "next": n3}
    n1 = {"data": 1, "next": n2}
    node = n1
    while node is not None:      # traverse to the end
        print(node["data"])
        node = node["next"]
    # 1 2 3
    
    12.5

    الجداولIMATION

    English

    A hash table 哈希表 maps a key to a slot with a hash function 哈希函数. Two keys can land in the same slot — a collision 冲突. Python's dict is a hash table, so lookup is fast.

    العربية

    جدول الIMATION يربط مفتاحاً بمكان باستخدام دالة الIMATION. يمكن لمفتاحين أن يسقطا في نفس المكان — تصادم. dict الخاص ببايثون هو جدولIMATION، لذا البحث سريع.

    A hash function maps each key to a slot; two keys can collide in one slot
    دالة التجزئة تربط كل مفتاح بمكان؛ يمكن أن يتصادم مفتاحان في نفس المكان
    table = {}
    table["Mei"] = 88
    table["Sam"] = 71
    print(table["Mei"])   # 88  (fast lookup by key)
    
    12.6

    أشجار البحث الثنائية

    English

    A binary search tree 二叉搜索树 (BST) keeps order: every left child is smaller than its node, every right child is larger. Search stays fast.

    العربية

    شجرة البحث الثنائية (BST) تحافظ على الترتيب: كل ابن يسار أصغر من عقده، وكل ابن يمين أكبر. يبقى البحث سريعاً.

    شجرة بحث ثنائية: القيم الأصغر تذهب لليسار، والقيم الأكبر تذهب لليمين
    شجرة بحث ثنائية: القيم الأصغر تذهب لليسار، والقيم الأكبر تذهب لليمين
    def insert(root, val):
        if root is None:
            return {"val": val, "left": None, "right": None}
        if val < root["val"]:
            root["left"] = insert(root["left"], val)
        else:
            root["right"] = insert(root["right"], val)
        return root
    
    def inorder(root):
        if root is None:
            return []
        return inorder(root["left"]) + [root["val"]] + inorder(root["right"])
    
    tree = None
    for v in [5, 3, 8, 1, 4]:
        tree = insert(tree, v)
    print(inorder(tree))   # [1, 3, 4, 5, 8]
    
    12.7

    الرسوم البيانية

    English

    A graph 图 is a set of vertices 顶点 joined by edges 边. An adjacency list 邻接表 — a dict of neighbour lists — is a common way to store one.

    Common mistakes

    • A stack is last-in-first-out; a queue is first-in-first-out. Do not mix them up.
    • Check whether a structure is empty before you pop or dequeue from it.
    • In a linked list, losing the head pointer loses the whole list.
    العربية

    الرسم البياني هو مجموعة من الرؤوس متصلة بحواف. قائمة الجوار — وهي قاموس بقوائم للجيران — طريقة شائعة لتخزينه.

    رسم بياني للرؤوس والحواف، مع شكل قائمة الجوار الخاص به
    رسم بياني للرؤوس والحواف، مع شكل قائمة الجوار الخاص به
    graph = {"A": ["B", "D"], "B": ["A", "C"], "C": ["B", "D"], "D": ["A", "C"]}
    for vertex in graph:
        print(vertex, "->", graph[vertex])
    # A -> ['B', 'D']  (and so on for B, C, D)
    

    أخطاء شائعة

    • المكدس (Stack) مبدأه آخر يدخل أول يخرج؛ الطابور (Queue) مبدأه أول يدخل أول يخرج. لا تخلط بينهما.
    • تحقق مما إذا كانت البنية فارغة قبل إزالة عنصر منها أو إخراج العنصر الأول منها.
    • في القائمة المرتبطة، فقدان المؤشر head يعني فقدان القائمة بأكملها.
  • 13 Searching, sorting & efficiency · ⁨البحث، الفرز والكفاءة⁩
    13.1

    البحث الخطي ثنائي التفرع

    English

    A search 查找 finds where a value is. Linear search 线性查找 checks each item in turn, so it works on any list.

    Binary search 二分查找 is much faster but needs a sorted list. It halves the range each step.

    العربية

    البحث يعثر على مكان قيمة ما. البحث الخطي يفحص كل عنصر بالتتابع، لذا يعمل على أي قائمة.

    def linear_search(items, target):
        for i in range(len(items)):
            if items[i] == target:
                return i
        return -1     # not found
    
    print(linear_search([4, 8, 2, 9], 2))   # 2
    

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

    def binary_search(items, target):
        lo, hi = 0, len(items) - 1
        while lo <= hi:
            mid = (lo + hi) // 2
            if items[mid] == target:
                return mid
            elif items[mid] < target:
                lo = mid + 1
            else:
                hi = mid - 1
        return -1
    
    print(binary_search([1, 3, 5, 7, 9], 7))   # 3
    
    البحث الثنائي يقسم النطاق إلى نصفين في كل خطوة — O(log n) على قائمة مرتبة
    البحث الثنائي يقسم النطاق إلى نصفين في كل خطوة — O(log n) على قائمة مرتبة
    13.2

    الفرز (فقاعي وإدراج)

    English

    To sort 排序 is to put items in order. Bubble sort 冒泡排序 repeatedly swaps 交换 neighbours that are in the wrong order.

    Insertion sort 插入排序 builds a sorted part one item at a time, sliding each new item back into its place:

    • In real code, use Python's built-in sorted():
    العربية

    الفرز هو وضع العناصر في ترتيب. الفرز الفقاعي يقوم بتبديل الأقران المتتاليين اللذين ليسا في الترتيب الصحيح بشكل متكرر.

    def bubble_sort(a):
        a = a[:]                          # work on a copy
        for i in range(len(a)):
            for j in range(len(a) - 1 - i):
                if a[j] > a[j + 1]:
                    a[j], a[j + 1] = a[j + 1], a[j]
        return a
    
    print(bubble_sort([5, 2, 4, 1]))      # [1, 2, 4, 5]
    

    فرز الإدراج يبني جزءاً مرتباً عن طريق عنصر واحد في كل مرة، مزاحاً كل عنصر جديد للخلف إلى مكانه:

    def insertion_sort(a):
        a = a[:]                           # work on a copy
        for i in range(1, len(a)):
            key = a[i]
            j = i - 1
            while j >= 0 and a[j] > key:   # shift bigger values right
                a[j + 1] = a[j]
                j -= 1
            a[j + 1] = key                 # drop key into the gap
        return a
    
    print(insertion_sort([5, 2, 4, 1]))   # [1, 2, 4, 5]
    
    • في الكود الفعلي، استخدم الدالة المدمجة Python sorted():
    print(sorted([5, 2, 4, 1]))           # [1, 2, 4, 5]
    
    13.3

    كفاءة الخوارزميات

    English

    Efficiency 效率 asks how the work grows as the input grows. We describe it with Big-O 大O记号.

    Big-O Name Example
    $O(1)$ constant look up a dict key
    $O(\log n)$ logarithmic binary search
    $O(n)$ linear linear search
    $O(n^2)$ quadratic bubble sort
    العربية

    الكفاءة تسأل كيف ينمو العمل مع نمو المدخلات. نصفها باستخدام Big-O.

    كيف ينمو عدد الخطوات مع حجم المدخلات للتعقيدات الشائعة
    كيف ينمو عدد الخطوات مع حجم المدخلات للتعقيدات الشائعة
    Big-O الاسم مثال
    $O(1)$ ثابت البحث عن مفتاح في قاموس
    $O(\log n)$ لوغاريتمي البحث الثنائي
    $O(n)$ خطي البحث الخطي
    $O(n^2)$ تربيعي الفرز الفقاعي
    def steps(n):           # how many steps a linear scan takes
        count = 0
        for i in range(n):
            count = count + 1
        return count
    
    print(steps(100))       # 100  -> O(n)
    
    13.4

    العشوائية والمحاكاة

    English

    The random module makes random numbers. Use a seed 种子 to make results repeatable. A simulation 模拟 runs many random trials to estimate an answer.

    Common mistakes

    • Binary search only works on a sorted list.
    • Big-O tells you how the time GROWS, not the exact time; an O(n²) method beats O(n) only for tiny inputs.
    • Bubble sort is O(n²) — fine for learning, but slow on large lists.
    العربية

    وحدة random تولد أرقاماً عشوائية. استخدم بذرة لجعل النتائج قابلة للتكرار. المحاكاة تشغل تجارب عشوائية عديدة لتقدير إجابة.

    import random
    random.seed(0)
    rolls = [random.randint(1, 6) for _ in range(1000)]
    print(rolls.count(6))   # about 1/6 of 1000
    

    أخطاء شائعة

    • البحث الثنائي يعمل فقط على قائمة مرتبة.
    • Big-O يخبرك بكيفية نمو الوقت، وليس الوقت الدقيق؛ طريقة O(n²) تفوق O(n) فقط للمدخلات الصغيرة جداً.
    • الفرز الفقاعي هو O(n²) — جيد للتعلم، لكن بطيء على القوائم الكبيرة.
  • 14 OOP & paradigms · ⁨OOP والنماذج البرمجية⁩
    14.1

    الفئات والكائنات

    English

    A class 类 is a blueprint. An object 对象 is one thing built from it (an instance 实例). __init__ is the constructor 构造方法 that sets up each object; self is the object itself.

    • name is an attribute 属性 (data on the object); speak is a method 方法 (an action).

    Add __str__ to control what print(obj) shows:

    العربية

    الفئة هي مخطط. الكائن هو شيء مبني منها (مثيل). __init__ هو البناء الذي يُعدّ كل كائن؛ self هو الكائن نفسه.

    class Dog:
        def __init__(self, name):
            self.name = name            # an attribute
        def speak(self):
            return self.name + " says woof"
    
    d = Dog("Rex")
    print(d.speak())     # Rex says woof
    
    • name هو سمة (بيانات على الكائن)؛ speak هي دالة (عمل).

    أضف __str__ للتحكم في عرض print(obj):

    class Dog:
        def __init__(self, name):
            self.name = name
        def __str__(self):
            return f"Dog named {self.name}"
    
    print(Dog("Rex"))    # Dog named Rex
    
    الفئة هي مخطط؛ استدعاؤها تنشئ كائناً
    الفئة هي مخطط؛ استدعاؤها تنشئ كائناً
    14.2

    الوراثة، التغليف، والتعدد الشكل

    English

    Inheritance 继承 lets a subclass 子类 reuse a superclass 父类. Use super() to call the parent; override 重写 a method to change it.

    Encapsulation 封装 hides data behind methods; a leading underscore marks it private 私有.

    Polymorphism 多态 means one name, many behaviours — the right speak runs for each object.

    العربية

    الوراثة تسمح للفئة الفرعية بإعادة استخدام الفئة الأب. استخدم super() لاستدعاء الأب؛ عدّل دالة لتغييرها.

    class Animal:
        def speak(self):
            return "some sound"
    
    class Cat(Animal):
        def speak(self):                # override
            return "meow"
    
    print(Cat().speak())   # meow
    

    التغليف يخفي البيانات خلف الدوال؛ الشرطة السفلية الأولى تشير إلى أنها خاصة.

    class Account:
        def __init__(self):
            self._balance = 0           # private
        def deposit(self, n):
            self._balance += n
        def balance(self):
            return self._balance
    
    a = Account()
    a.deposit(50)
    print(a.balance())     # 50
    

    التعدد الشكل يعني اسماً واحداً، سلوكيات متعددة — الدالة speak الصحيحة تعمل لكل كائن.

    class Cat:
        def speak(self):
            return "meow"
    
    class Cow:
        def speak(self):
            return "moo"
    
    for animal in [Cat(), Cow()]:
        print(animal.speak())   # meow, then moo
    
    14.3

    نماذج البرمجة

    English

    A paradigm 范式 is a style of writing programs. Procedural 过程式 code is a sequence of steps and functions. Object-oriented 面向对象 code groups data and methods into objects. Declarative 声明式 code says what you want, not how (a list comprehension or SQL).

    Common mistakes

    • Every method needs self as its first parameter.
    • __init__ sets up a new object and runs automatically when you create one.
    • Two objects of the same class have separate attributes; changing one does not change the other.
    العربية

    النمط هو أسلوب في كتابة البرامج. الكود الإجرائي هو سلسلة من الخطوات والدوال. الكود الموجه للكائنات يجمع البيانات والدوال في كائنات. الكود التصريحي يقول ماذا تريد، لا كيف (استيعاب قائمة أو SQL).

    def total(nums):           # procedural
        t = 0
        for n in nums:
            t += n
        return t
    print(total([1, 2, 3]))    # 6
    
    print(sum([1, 2, 3]))      # 6  (declarative: same result)
    

    أخطاء شائعة

    • كل دالة تحتاج self كمعامل أول.
    • __init__ يُعدّ كائناً جديداً ويعمل تلقائياً عند إنشائه.
    • كائنان من نفس الفئة لديهما سمات منفصلة؛ تغيير أحدهما لا يغير الآخر.
  • 15 Data representation · ⁨تمثيل البيانات⁩
    15.1

    البتات والثنائية

    English

    A bit 比特 is a single 0 or 1. Binary 二进制 is the base-2 number system: each place is worth twice the one to its right (1, 2, 4, 8, …). Denary 十进制 (base-10) is our normal numbers.

    • 8 bits make a byte 字节. A fixed width can overflow 溢出 (wrap around) when the number is too big.

    Hexadecimal 十六进制 (base 16) is a compact way to read binary: one hex digit stands for exactly four bits. Python writes hex with 0x:

    العربية

    البيت هو 0 أو 1 فردي. النظام الثنائي هو نظام العد ذو الأساس 2: قيمة كل خانة ضعف ما على يمينها (1، 2، 4، 8، …). النظام العشري (الأساس 10) هو أرقامنا العادية.

    قيم خانات النظام الثنائي: 1101 تعني 8 + 4 + 1 = 13
    قيم خانات النظام الثنائي: 1101 تعني 8 + 4 + 1 = 13
    print(bin(13))         # 0b1101
    print(int("1101", 2))  # 13
    
    • 8 بتات تصنع بايت. العرض الثابت قد يتجاوز الحد (يدور حول) عندما يكون الرقم كبيراً جداً.
    x = 250
    x = (x + 10) % 256     # one byte wraps at 256
    print(x)               # 4
    

    الست عشرية (الأساس 16) هي طريقة مختصرة لقراءة النظام الثنائي: رقمة ست عشرية واحدة تقابل بالضبط أربعة بتات. Python يكتب الست عشرية باستخدام 0x:

    print(hex(255))        # 0xff
    print(0xFF)            # 255
    print(int("ff", 16))   # 255
    
    15.2

    الضغط

    English

    Compression 压缩 makes data smaller. Lossless 无损 compression keeps every bit, so you rebuild the original exactly. Lossy 有损 compression throws away detail — smaller but not exact — and is used for photos and music.

    Run-length encoding 游程编码 is a simple lossless method: store a run 游程 (a repeat) as a count plus the value.

    Common mistakes

    • n bits store 2**n different values, from 0 up to 2**n - 1.
    • Lossy compression throws away detail and cannot be undone; lossless can be reversed exactly.
    العربية

    الضغط يجعل البيانات أصغر. الضغط بدون فقدان يحفظ كل بت، لتعيد بناء الأصل بدقة. الضغط بفقدان يزيل التفاصيل — أصغر ولكن ليس دقيقاً — ويستخدم للصور والموسيقى.

    ترميز المسارات المتتالية هو طريقة ضغط بدون فقدان بسيطة: تخزن المسار (التكرار) كعدد تكرارات وقيمة.

    def rle(text):
        out = ""
        i = 0
        while i < len(text):
            run = 1
            while i + run < len(text) and text[i + run] == text[i]:
                run += 1
            out += str(run) + text[i]
            i += run
        return out
    
    print(rle("AAAABBBCCD"))   # 4A3B2C1D
    

    أخطاء شائعة

    • n بتات تخزن 2**n قيم مختلفة، من 0 حتى 2**n - 1.
    • الضغط بفقدان يزيل التفاصيل ولا يمكن عكسه؛ الضغط بدون فقدان يمكن عكسه بدقة.
  • 16 Computing concepts · ⁨مفاهيم الحوسبة⁩
    16.1

    ما هو الحاسوب ودورة التصميم

    English

    Computing 计算 means solving problems with computers: input, process, output. Good software is built in a design cycle 设计循环 — plan, write, test, improve — repeated many times.

    • Break a problem down, build a small part, test it, then add more.
    • Programmers work in teams and reuse each other's code.
    العربية

    الحوسبة تعني حل المشكلات باستخدام الحواسيب: إدخال، معالجة، إخراج. البرمجيات الجيدة تُبنى في دورة تصميم — تخطيط، كتابة، اختبار، تحسين — تتكرر مرات عديدة.

    • قسم المشكلة، بِنِ جزءاً صغيراً، اختبره، ثم أضف المزيد.
    • المبرمجون يعملون في فرق ويعيدون استخدام أكواد بعضهم البعض.
    16.2

    الإنترنت

    English

    The Internet 互联网 is a network 网络 of networks. Data is split into packets 数据包 that travel separately and are put back together at the other end. Shared rules called protocols 协议 (such as TCP/IP) make this work. If one path breaks, packets take another route — this is redundancy 冗余, which gives fault tolerance 容错.

    Layer Job
    HTTP request and send web pages
    TCP reliable delivery, in order
    IP addressing and routing
    العربية

    إنترنت هو شبكة شبكات. البيانات مقسمة إلى حزم تسافر بشكل منفصل وتُعاد تجميعها في الطرف الآخر. قواعد مشتركة تسمى بروتوكولات (مثل TCP/IP) تجعل هذا ممكنًا. إذا تعطل مسار، تأخذ الحزم طريقاً آخر — وهذا redundancy، والذي يمنح تحمل الأخطاء.

    خريطة للإنترنت: كل خط هو مسار بين شبكتين
    خريطة للإنترنت: كل خط هو مسار بين شبكتين
    الطبقة المهمة
    HTTP طلب وإرسال صفحات الويب
    TCP توصيل موثوق، بالترتيب
    عنوان IP والتوجيه
    16.3

    الحوسبة المتوازية والموزعة

    English

    Sequential 顺序 code does one step at a time. Parallel 并行 computing does several steps at once on many cores 核心, which can give a speedup 加速. Distributed 分布式 computing spreads the work across many computers, such as a cloud.

    • Not everything can run in parallel: some steps must wait for an earlier result.
    العربية

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

    • لا يمكن تشغيل كل شيء بالتوازي: بعض الخطوات يجب أن تنتظر نتيجة سابقة.
    16.4

    تأثير الحوسبة

    English

    Computing brings both benefits and harms. The digital divide 数字鸿沟 means not everyone has equal access to it. Software can carry bias 偏见 from the data it learns from. Respect intellectual property 知识产权 (licences), and protect people's personal data 个人数据 and privacy 隐私.

    Common mistakes

    • The Internet and the World Wide Web are not the same: the Web is one service that runs on top of the Internet.
    • More processor cores help only if the work can be split into parts that run at the same time.
    العربية

    تجلب الحوسبة فوائد وأضراراً معاً. يعني الفاصل الرقمي عدم امتلاك الجميع وصولاً متساوياً إليها. قد يحمل البرمجيات تحيزاً مستمداً من البيانات التي تتعلم منها. احترم الملكية الفكرية (التراخيص)، واحمِ البيانات الشخصية للأنظمة والخصوصية.

    أخطاء شائعة

    • الإنترنت وشبكة المعلومات العالمية (World Wide Web) ليسا نفس الشيء: الشبكة هي خدمة واحدة تعمل فوق الإنترنت.
    • زيادة عدد أنوية المعالج تساعد فقط إذا كان العمل قابلاً للتقسيم إلى أجزاء تعمل في نفس الوقت.
  • 17 Putting it together · ⁨دمج العناصر معًا⁩
    17.1

    مشاريع مصغرة شاملة

    English

    A mini-project 小项目 combines earlier ideas: data in a list, a function with selection inside a loop, and printed output. This is also the shape of the AP Create Performance Task.

    Project: average mark

    Project: count passes

    Project: filter to a new list

    The AP Create Task wants a list, a parameterised procedure 过程 that uses selection 选择 and iteration 迭代, and some input/output. Each project above is exactly that shape — build small pieces, then join them.

    Common mistakes

    • Build in small steps and test each part before moving on — do not write it all at once.
    • Read the whole task first, then plan the input → process → output before you code.
    العربية

    يجمع المشروع المصغر بين الأفكار السابقة: بيانات في قائمة، ودالة تحتوي على اختيار داخل حلقة، ومخرجات مطبوعة. هذا هو أيضاً شكل مهمة الأداء الإبداعي (AP Create Performance Task).

    مشروع: متوسط العلامات

    def average(marks):
        if len(marks) == 0:
            return 0
        return round(sum(marks) / len(marks), 1)
    
    print(average([88, 71, 95, 60]))   # 78.5
    

    مشروع: عد النجاحات

    def count_passes(marks, pass_mark=60):
        passes = 0
        for m in marks:                 # iteration
            if m >= pass_mark:          # selection
                passes += 1
        return passes
    
    print(count_passes([88, 50, 95, 60]))   # 3
    

    مشروع: تصفية إلى قائمة جديدة

    def merit(marks):
        return [m for m in marks if m >= 80]
    
    print(merit([88, 71, 95, 60]))     # [88, 95]
    

    تطلب مهمة AP إبداع قائمة، وإجراء معلمات يستخدم فيه الاختيار والتكرار، وبعض المدخلات/المخرجات. كل مشروع أعلاه يأخذ هذا الشكل تماماً — بنِ قطعاً صغيرة، ثم ادمجها.

    أخطاء شائعة

    • بنِ بخطوات صغيرة واختبر كل جزء قبل الانتقال إليه — لا تكتب الكود بالكامل دفعة واحدة.
    • اقرأ المهمة كاملة أولاً، ثم خطط للمدخلات → المعالجة → المخرجات قبل كتابة الكود.
    مشروع مصغر: بيانات ← دالة ← ناتج مطبوع
    مشروع مصغر: بيانات ← دالة ← ناتج مطبوع

Log in or create account · ⁨تسجيل الدخول أو إنشاء حساب⁩

IGCSE, A-Level & AP