Skip to content · ⁨Passer au contenu⁩
Subjects · ⁨Sujets⁩
  • 1 Getting started · ⁨Commencer⁩
    1.1

    Votre premier programme

    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.
    Français

    Python exécute votre code ligne par ligne. Chaque ligne est une instruction 语句. Un programme 程序 n'est qu'une liste d'instructions exécutées de haut en bas.

    La fonction print() affiche du texte à l'écran. On appelle cela la sortie 输出. Le texte entre guillemets est une chaîne 字符串.

    print("Hello, world!")
    print("I am learning Python")
    
    • Chaque print() commence une nouvelle ligne.
    • Les guillemets peuvent être "double" ou 'single' — les deux forment une chaîne.
    • Un programme ne fait rien jusqu'à ce que vous l'exécutiez.
    Le code source passe par l'interpréteur pour produire une sortie
    Le code source passe par l'interpréteur pour produire une sortie
    1.2

    Commentaires et style de code

    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 错误.
    Français

    Un commentaire 注释 commence par #. Python ignore tout après le # sur cette ligne. Les commentaires expliquent votre code aux gens ; ils ne changent pas ce que le code fait.

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

    Un bon style rend le code facile à lire :

    • Utilisez des noms clairs qui indiquent ce qu'une valeur signifie.
    • Mettez une instruction par ligne.
    • N'ajoutez pas d'espaces au début d'une ligne normale. En Python, les espaces au début (indentation 缩进) ont une signification spéciale, donc un mauvais espace provoque une erreur 错误.
    1.3

    Entrée, traitement, sortie

    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.
    Français

    De nombreux programmes suivent un plan simple : entrée 输入 → traitement → sortie. Vous obtenez des données, faites quelque chose avec, puis affichez un résultat.

    La fonction input() lit le texte tapé par l'utilisateur. Elle retourne toujours une chaîne.

    name = input("What is your name? ")
    print("Hello, " + name)
    
    • input() attend que l'utilisateur tape et appuie sur Entrée.
    • Stockez le texte tapé dans une variable 变量 pour pouvoir l'utiliser plus tard.
    • Comme input() retourne une chaîne, changez-la avec int(...) d'abord si vous avez besoin d'un nombre.

    Erreurs courantes

    • Oublier les guillemets : print(Hello) cherche une variable nommée Hello et soulève une NameError. Le texte nécessite des guillemets : print("Hello").
    • Un espace erroné au début d'une ligne : Python lit l'indentation comme une structure, donc il soulève une IndentationError.
    • Supposer que input() retourne un nombre. Il retourne toujours une chaîne, alors enveloppez-le dans int(...) avant de faire des mathématiques.
  • 2 Variables, types & operators · ⁨Variables, types & opérateurs⁩
    2.1

    Variables et affectation

    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).
    Français

    Une variable 变量 est un nom pour une valeur 值. Vous en créez une avec =, appelé affectation 赋值. Le nom va à gauche ; la valeur va à droite.

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

    Maintenant age contient 17. Utilisez le nom partout où vous avez besoin de la valeur, et changez-la plus tard :

    age = 17
    age = age + 1   # age is now 18
    print(age)
    
    Une variable est un nom attaché à une valeur stockée
    Chaque nom de variable pointe vers une valeur en mémoire
    • Le signe = ne signifie pas "égal". Cela signifie "stocker le côté droit sous le nom de gauche".
    • Pour tester si deux valeurs sont égales, utilisez == (voir ci-dessous).
    2.2

    Nombres : 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.
    Français

    Python a deux types numériques principaux. Un entier 整数 (int) est un nombre entier comme 17. Un float 浮点数 (float) a un point décimal comme 9.99.

    Ces opérateurs 运算符 fonctionnent sur les nombres :

    Opérateur Signification Exemple Résultat
    + addition 3 + 2 5
    - soustraction 3 - 2 1
    * multiplication 3 * 2 6
    / division (toujours float) 7 / 2 3.5
    // division entière 7 // 2 3
    % reste (modulo) 7 % 2 1
    ** puissance 2 ** 3 8
    • / retourne toujours un float, donc 4 / 2 est 2.0.
    • // et % vont ensemble : 17 // 5 est 3, et 17 % 5 est 2.
    2.3

    Expressions et conversion de type

    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).
    Français

    Une expression 表达式 est n'importe quoi qui a une valeur, comme 3 + 4 * 2. Python utilise l'ordre mathématique normal (* et / avant + et -) ; ajoutez des parenthèses pour clarifier l'ordre.

    input() retourne une chaîne, donc convertissez-la avant de faire des mathématiques. Changer une valeur d'un type à un autre est la conversion de type 类型转换 :

    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") échoue, donc ne convertissez que le texte qui ressemble à un nombre.
    • Mélanger les types échoue aussi : "age: " + 17 est une erreur ; écrivez "age: " + str(17).
    2.4

    Booléens et comparaison

    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.
    Français

    Un booléen 布尔值 est l'une de seulement deux valeurs : True ou False. Une comparaison 比较 retourne un booléen.

    Opérateur Sens
    == égal à
    != différent de
    < > inférieur / supérieur
    <= >= inférieur / supérieur ou égal
    print(7 > 2)        # True
    print(3 == 3.0)     # True
    age = 20
    print(age >= 18)    # True
    

    Joignez les comparaisons avec and, or, not :

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

    Erreurs courantes

    • / retourne toujours un float, même si 4 / 2 est 2.0. Utilisez // quand vous voulez un nombre entier.
    • Utiliser = là où vous entendez dire == : = affecte une valeur, == teste si deux valeurs sont égales.
    • Joindre une chaîne et un nombre : "age: " + 5 soulève une TypeError. Convertissez d'abord avec str(5).
    • Les floats ne sont pas exacts, donc 0.1 + 0.2 n'est pas exactement 0.3 — évitez == sur les résultats de float.
  • 3 Strings · ⁨Chaînes de Caractères⁩
    3.1

    Indexation

    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).
    Français

    Une chaîne 字符串 est du texte entre guillemets. Chaque caractère 字符 a une position, appelée son index 索引. Le premier index est 0, pas 1.

    Lisez un seul caractère avec des crochets carrés :

    word = "Python"
    print(word[0])    # P  (the first character)
    print(word[2])    # t
    print(len(word))  # 6  (how many characters)
    
    • Le comptage commence à 0, donc le dernier index est len(word) - 1.
    • Un index négatif compte à rebours depuis la fin : word[-1] est le dernier caractère.
    word = "Python"
    print(word[-1])   # n
    print(word[-2])   # o
    
    • Un index trop grand provoque une erreur 错误 (une IndexError).
    s[start:stop] est une fenêtre semi-ouverte de caractères
    s[start:stop] est une fenêtre semi-ouverte de caractères
    3.2

    Tranchage

    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.
    Français

    Un tranche 切片 prend une partie d'une chaîne. Écrivez word[start:end]. La tranche conserve start mais s'arrête avant end.

    word = "Python"
    print(word[0:3])   # Pyt   (positions 0, 1, 2)
    print(word[2:5])   # tho
    
    • Omettez start pour commencer à 0 ; omettez end pour aller jusqu'à la fin.
    word = "Python"
    print(word[:3])    # Pyt
    print(word[3:])    # hon
    
    • Un troisième nombre est le pas 步长. word[::-1] inverse 反转 la chaîne.
    print("Python"[::-1])   # nohtyP
    
    3.3

    Méthodes de chaîne et longueur

    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 拼接:

    Français

    Une méthode 方法 est une fonction qui appartient à une valeur. On l'appelle avec un point :

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

    Les chaînes de caractères sont immuables 不可变 : une méthode retourne une chaîne nouvelle et ne modifie jamais l'originale 原始.

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

    Méthodes courantes (chacune retourne une nouvelle valeur) :

    Méthode Signification Exemple Résultat
    .upper() / .lower() changer la casse "Hi".lower() hi
    .strip() supprimer les espaces aux bords " hi ".strip() hi
    .replace(a, b) inverser le texte "cat".replace("c", "b") bat
    .split(sep) diviser en une liste "a,b".split(",") ['a', 'b']

    Joindre des chaînes avec +. C'est ce qu'on appelle la concaténation 拼接 :

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

    f-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.
    Français

    Une f-string 格式化字符串 construit du texte à partir de valeurs. Placez f avant la guillemet, puis écrivez {...} autour d'une valeur.

    name = "Mei"
    age = 17
    print(f"{name} is {age} years old")   # Mei is 17 years old
    
    • Toute expression 表达式 peut aller entre accolades.
    • {value:.2f} arrondit à 2 décimales 小数位.
    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
    

    Erreurs courantes

    • Les chaînes ne peuvent pas être modifiées sur place : s[0] = "x" génère une erreur. Créez plutôt une nouvelle chaîne.
    • L'indexation commence à 0 ; le dernier caractère est s[-1], et s[len(s)] est hors limites.
    • Une tranche s[a:b] inclut a mais s'arrête avant b.
    • Les méthodes de chaîne retournent une chaîne NOUVELLE : s.upper() ne fait rien sauf si vous stockez le résultat.
  • 4 Selection · ⁨Sélection⁩
    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.
    Français

    Un programme choisit quoi faire avec if. Il exécute un bloc indenté 缩进 seulement quand une condition 条件 est vraie. La ligne if se termine par deux-points 冒号.

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

    Ajoutez elif (else-if) pour plus de cas et else pour « tout autre ». Python exécute la première branche vraie 分支 uniquement, puis saute le reste.

    score = 72
    if score >= 80:
        print("A")
    elif score >= 60:
        print("B")
    else:
        print("fail")
    # B
    
    • Comparez des valeurs avec == (égal), != (non égal), <, >, <=, >=.
    • Une comparaison 比较 donne une valeur booléenne 布尔值 — soit True, soit False.
    if / elif / else: seule une branche s'exécute
    if / elif / else: seule une branche s'exécute
    4.2

    Combiner des conditions

    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.
    Français

    Joignez des conditions avec and, or, not. and nécessite que les deux côtés soient vrais ; or nécessite que l'un ou l'autre côté soit vrai ; not inverse une valeur booléenne.

    age = 16
    has_ticket = True
    if age >= 18 and has_ticket:
        print("entry allowed")
    else:
        print("entry refused")
    # entry refused
    
    • Utilisez des parenthèses pour clarifier l'ordre : (a or b) and c.
    temp = 30
    if temp > 25 and not temp > 35:
        print("warm but ok")
    # warm but ok
    

    Erreurs courantes

    • Écrivez elif, pas else if.
    • Chaque ligne if / elif / else se termine par deux-points :, et son corps doit être indenté.
    • if x = 5: est une erreur — utilisez == pour comparer.
    • else ne prend pas de condition ; seuls if et elif en prennent.
  • 5 Iteration · ⁨Itération⁩
    5.1

    Boucles for et 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.
    Français

    Une boucle 循环 répète du code. Une boucle for répète une fois pour chaque élément d'une séquence 序列. range(n) donne les nombres 0 jusqu'à n - 1.

    for i in range(5):
        print(i)
    # 0, then 1, 2, 3, 4 (each on its own line)
    
    • range(a, b) va de a jusqu'à (sans inclure) b.
    • range(a, b, step) ajoute un pas 步长 à chaque itération.
    for n in range(2, 11, 2):
        print(n)        # 2 4 6 8 10
    
    for i in range(n): le corps s'exécute avec i = 0 … n-1
    for i in range(n): le corps s'exécute avec i = 0 … n-1
    5.2

    Le motif de l'accumulateur

    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.
    Français

    Pour construire un résultat au fil d'une boucle, initialisez une variable avant la boucle, puis mettez-la à jour 更新 à chaque tour. C'est le motif de l'accumulateur 累加器.

    total = 0
    for n in range(1, 6):
        total = total + n
    print(total)        # 15
    
    • La même idée compte combien d'éléments correspondent à un test.
    count = 0
    for letter in "banana":
        if letter == "a":
            count = count + 1
    print(count)        # 3
    
    5.3

    Boucles 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.
    Français

    Une boucle while répète tant que une condition reste vraie. Changez quelque chose à l'intérieur, sinon elle ne s'arrêtera jamais — une boucle infinie 无限循环.

    n = 1
    while n <= 3:
        print(n)
        n = n + 1
    # 1 2 3
    
    • break quitte immédiatement la boucle.
    total = 0
    while True:
        total = total + 10
        if total >= 30:
            break
    print(total)        # 30
    
    5.4

    Boucles imbriquées

    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.
    Français

    Une boucle dans une autre boucle est une boucle imbriquée 嵌套循环. La boucle interne 内层循环 s'exécute entièrement pour chaque itération de la boucle externe 外层循环.

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

    Erreurs courantes

    • range(n) va de 0 à n - 1, pas de 1 à n — l'erreur classique off-by-one.
    • Modifier une liste pendant qu'on parcourt sauter des éléments ; parcourez une copie si vous devez supprimer des choses.
    • Oublier de modifier la variable de boucle dans une while la fera tourner indéfiniment.
    • L'indentation détermine ce qui est dans la boucle ; une ligne mal indentée ne s'exécute qu'une seule fois, après la boucle.
  • 6 Lists & 2-D lists · ⁨Listes & listes 2D⁩
    6.1

    Listes

    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
    Français

    Une liste 列表 contient plusieurs valeurs ordonnées, entre []. Chaque élément 元素 a un index (à partir de 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]
    
    • Modifiez un élément par son index : scores[1] = 100.
    • Une liste peut grandir et rétrécir ; une chaîne non.

    Les outils courants pour les listes :

    Outil Fait
    a.append(x) ajoute x à la fin
    a.insert(i, x) insère x à la position i
    a.remove(x) supprime le premier x
    a.pop() / a.pop(i) supprime et retourne le dernier élément / l'élément i
    a.sort() trie la liste en place
    sorted(a) retourne une nouvelle liste triée
    x in a est x dans la liste ?
    len(a), sum(a), max(a), min(a) taille et mathématiques rapides
    Les indices de liste commencent à 0
    Les indices de liste commencent à 0
    6.2

    Parcourir une liste

    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.
    Français

    Parcourir 遍历 une liste, c'est visiter chaque élément. Une boucle for fait cela sans besoin d'index.

    scores = [88, 71, 95]
    total = 0
    for s in scores:
        total = total + s
    print(total)          # 254
    
    • Utilisez enumerate quand vous avez aussi besoin de l'index.
    for i, name in enumerate(["a", "b"]):
        print(i, name)    # 0 a  /  1 b
    
    6.3

    Listes 2-D (grilles)

    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.
    Français

    Une liste 2-D 二维列表 est une liste de listes — une grille 网格 de lignes et colonnes. Utilisez deux indices : grid[row][col].

    grid = [[1, 2, 3],
            [4, 5, 6]]
    print(grid[0][2])     # 3
    print(grid[1][0])     # 4
    
    • Une boucle imbriquée 嵌套循环 visite chaque cellule.
    grid = [[1, 2], [3, 4]]
    for row in grid:
        for value in row:
            print(value, end=" ")
    print()               # 1 2 3 4
    
    6.4

    Compréhensions de liste

    English

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

    • Add if to keep only some items.
    Français

    Une compréhension de liste 列表推导式 construit une nouvelle liste en une ligne : [expression for item in sequence].

    squares = [x * x for x in range(5)]
    print(squares)        # [0, 1, 4, 9, 16]
    
    • Ajoutez if pour ne garder que certains éléments.
    evens = [n for n in range(10) if n % 2 == 0]
    print(evens)          # [0, 2, 4, 6, 8]
    
    6.5

    Tuples & ensembles

    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].
    Français

    Un tuple 元组 est une séquence fixe entre parenthèses rondes. Il ne peut pas être changé après création — utilisez-le pour des valeurs groupées, et faites-en le unpacking 解包 vers des noms.

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

    Une fonction devant retourner deux résultats retourne un tuple :

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

    Un set 集合 stocke chaque valeur une seule fois, sans ordre. Idéal pour supprimer les doublons et pour des tests d'appartenance 成员测试 rapides.

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

    Erreurs courantes

    • b = a ne copie pas une liste : les deux noms pointent vers la même liste, donc modifier l'une modifie l'autre. Utilisez a.copy() ou a[:].
    • Le dernier élément est a[-1] ; a[len(a)] est hors limites.
    • append ajoute UN seul élément ; utilisez extend ou + pour joindre une autre liste.
    • Construire une grille avec [[0]*3]*3 crée trois copies de la même ligne. Construisez les lignes dans une boucle à la place.
    • Un tuple avec un seul élément a besoin d'une virgule : (5,), pas (5).
    • Un set n'a ni ordre ni doublons, donc on ne peut pas l' indexer avec s[0].
  • 7 Dictionaries · ⁨Dictionnaires⁩
    7.1

    Dictionnaires

    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.
    Français

    Un dictionnaire 字典 (dict) stocke des paires clé 键 → valeur 值. On cherche une valeur par sa clé, pas par un index numérique.

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

    Ajouter et mettre à jour

    Attribuez à une clé pour l'ajouter, ou pour modifier une existante.

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

    Vérifier et parcourir

    Utilisez in pour tester l'existence d'une clé. Parcourez les clés, ou .items() pour obtenir à la fois clé et valeur.

    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) retourne une valeur par défaut 默认值 quand la clé manque — aucune erreur.
    student = {"name": "Mei"}
    print(student.get("age", 0))   # 0
    

    Le motif d'examen classique — compter la fréquence d'apparition de chaque valeur :

    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) fournit 0 la première fois qu'une clé est vue, évitant un KeyError.

    Erreurs courantes

    • Lire une clé manquante avec d[key] lève un KeyError ; utilisez d.get(key) ou testez if key in d d'abord.
    • Attribuer d[key] à nouveau écrase l'ancienne valeur — les clés sont uniques.
    • Les clés doivent être immuables, comme une chaîne ou un nombre — une liste ne peut pas être une clé.
    Un dictionnaire mappe chaque clé vers une valeur
    Un dictionnaire mappe chaque clé vers une valeur
  • 8 Functions & abstraction · ⁨Fonctions & abstraction⁩
    8.1

    Définir & appeler des fonctions

    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.
    Français

    Une fonction 函数 est un bloc de code nommé réutilisable. Définissez 定义-la avec def, puis appelez 调用-la par nom.

    def greet():
        print("Hello!")
    
    greet()        # Hello!
    greet()        # Hello!
    
    • Le code à l'intérieur ne s'exécute que lorsque vous appelez la fonction.
    def définit ; appel exécute ; return renvoie une valeur
    def définit ; appel exécute ; return renvoie une valeur
    8.2

    Valeurs de retour

    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.
    Français

    Une fonction peut retourner 返回 une valeur avec return. L'appel devient alors cette valeur.

    def square(n):
        return n * n
    
    print(square(5))          # 25
    print(square(3) + 1)      # 10
    
    • return arrête immédiatement la fonction. Une fonction sans return retourne None.
    8.3

    Paramètres, arguments & portée

    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:

    Français

    Un paramètre 形参 est le nom dans la def. Un argument 实参 est la valeur que vous passez.

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

    Une variable créée à l'intérieur d'une fonction est locale 局部 — elle n'existe que là. Cette région est sa portée 作用域.

    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
    

    Un paramètre peut avoir une valeur par défaut 默认值, utilisée quand l'appelant l'ommet :

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

    Abstraction procédurale

    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.
    Français

    L'abstraction procédurale 过程抽象 signifie cacher les détails derrière un nom. Vous utilisez une fonction par son nom et ce qu'elle fait, pas comment elle fonctionne.

    def area_of_rectangle(w, h):
        return w * h
    
    print(area_of_rectangle(4, 5))   # 20
    
    • Une bonne fonction fait une seule tâche, a un nom clair, et évite de répéter du code.
    8.5

    Modules & imports

    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.
    Français

    Un module 模块 est un fichier de fonctions prêtes. Importez-en un avec 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
    

    Erreurs courantes

    • Une fonction retourne None sauf si vous écrivez return. Imprimer n'est pas pareil que retourner.
    • N'utilisez jamais une valeur par défaut mutable comme def f(x=[]) — la même liste est partagée entre tous les appels.
    • Une variable créée à l'intérieur d'une fonction est locale et invisible à l'extérieur.
    • Exécutez une fonction avec f() ; écrire f seul nomme simplement la fonction.
  • 9 Errors, exceptions & testing · ⁨Erreurs, exceptions & tests⁩
    9.1

    Erreurs & débogage

    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.
    Français

    Le code peut échouer de trois façons. Une erreur de syntaxe 语法 error brise les règles de Python, donc il ne s'exécute jamais. Une erreur de temps d'exécution 运行时错误 survient pendant l'exécution, comme la division par zéro. Une erreur logique 逻辑错误 s'exécute mais donne la mauvaise réponse.

    # A runtime error, caught so this block still finishes:
    try:
        print(10 / 0)
    except ZeroDivisionError:
        print("cannot divide by zero")
    # cannot divide by zero
    
    • Python imprime un traceback 回溯 montrant où ça a échoué. Lisez-le de bas en haut.
    Erreurs Python courantes : Syntaxe, Nom, Type, Index
    Erreurs Python courantes : Syntaxe, Nom, Type, Index
    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.
    Français

    Enveloppez le code risqué dans try. S'il échoue, except attrape l'exception 异常 et la gère 处理, au lieu de planter.

    def to_int(text):
        try:
            return int(text)
        except ValueError:
            return 0
    
    print(to_int("42"))    # 42
    print(to_int("abc"))   # 0
    
    • Attrapez un type spécifique (ValueError, ZeroDivisionError, …).
    • raise génère volontairement votre propre erreur.
    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

    Tests & robustesse

    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.
    Français

    Un test 测试 vérifie que le code donne la bonne réponse. Testez les cas normaux et les cas limites 边界情形 — entrée vide, zéro, valeurs très grandes.

    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
    
    • Un code robuste 健壮 ne plante pas sur des entrées étranges ; il les gère avec élégance.

    Erreurs courantes

    • N'utilisez pas un simple except: — capturez l'erreur spécifique, par exemple except ValueError:.
    • Une erreur de syntaxe arrête tout le programme avant son exécution, corrigez donc celles-ci en premier.
    • Testez les cas limites (entrée vide, zéro, valeur maximale), pas seulement le cas facile.
  • 10 Files · ⁨Fichiers⁩
    10.1

    Lecture et écriture de fichiers texte

    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.
    Français

    Un fichier texte 文本文件 stocke du texte sur le disque. Ouvrez-le avec open(name, mode) où mode 模式 indique la lecture ou l'écriture. Utilisez toujours with, qui ferme le fichier pour vous.

    Écriture

    Le mode "w" écrit un nouveau fichier et efface l'ancien.

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

    Lecture

    Le mode "r" (par défaut) lit. .read() retourne tout le fichier comme une seule chaîne.

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

    Ligne par ligne

    Parcourez le fichier pour obtenir une ligne à la fois. .strip() retire 去除 le caractère de nouvelle ligne 换行符 à la fin.

    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
    

    Ajout

    Le mode "a" ajoute 追加 à la fin sans effacer.

    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
    
    Mode Signification
    "r" lecture (par défaut)
    "w" écriture (efface d'abord)
    "a" ajout (ajoute à la fin)

    Erreurs courantes

    • Fermez toujours un fichier, ou utilisez with open(...) as f: qui le ferme pour vous.
    • read() retourne tout le fichier comme une seule chaîne, et chaque ligne se termine encore par \n.
    • Ouvrir avec "w" efface d'abord le fichier ; utilisez "a" pour ajouter à la fin.
    open → read/write → close (with auto-closes)
    open → read/write → close (with auto-closes)
  • 11 Algorithm design · ⁨Conception d'algorithme⁩
    11.1

    Algorithmes et décomposition

    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.
    Français

    Un algorithme 算法 est une liste claire d'étapes qui résout un problème. La décomposition 分解 consiste à diviser un grand problème en petites parties que vous pouvez résoudre une par une.

    # 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
    
    • L'abstraction 抽象 signifie ignorer les détails : vous utilisez largest(...) sans relire comment il fonctionne.
    11.2

    Pseudocode et diagrammes de flux

    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.

    Français

    Le pseudocode 伪代码 est un anglais structuré et clair pour un algorithme, écrit avant le vrai code. Il n'est pas exécuté.

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

    Un diagramme de flux 流程图 dessine le même plan : une boîte pour chaque étape, un losange pour chaque décision 判断, et des flèches pour l'ordre.

    11.3

    Récursivité et pile d'appels

    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.
    Français

    La récursivité 递归 est quand une fonction s'appelle elle-même. Elle nécessite un cas de base 基准情形 (une entrée simple qui retourne immédiatement) et un cas récursif 递归情形 (elle s'appelle elle-même sur une entrée plus petite).

    La pile d'appels pour factorial(3) : chaque appel attend, puis retourne dans l'ordre inverse
    La pile d'appels pour factorial(3) : chaque appel attend, puis retourne dans l'ordre inverse
    def fact(n):
        return 1 if n <= 1 else n * fact(n - 1)
    
    print(fact(5))     # 120
    
    • Chaque appel suspendu reste sur la pile d'appels 调用栈 jusqu'à ce que l'appel au-dessus retourne.

    Erreurs courantes

    • La récursivité a besoin d'un cas de base, sinon elle s'appelle éternellement et fait déborder la pile d'appels.
    • Le pseudocode sert à planifier — il n'a pas besoin de s'exécuter, mais chaque étape doit être sans ambiguïté.
    • Divisez un grand problème en petites étapes nommées avant d'écrire du code.
  • 12 Data structures · ⁨Structures de données⁩
    12.1

    Types de Données Abstraits (ADT)

    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.

    Français

    Un type de données abstrait 抽象数据类型 (ADT) décrit des données ainsi que les opérations dessus, séparément de sa mise en œuvre. Vous l'utilisez via ses opérations, pas via son stockage interne.

    # 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

    Piles

    English

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

    Français

    Une pile 栈 est Last-In-First-Out (LIFO 后进先出). Vous empilez 压入 sur le dessus et dépilez 弹出 depuis le dessus.

    Une pile retire depuis le haut (LIFO) ; une file retire depuis l'avant (FIFO)
    Une pile retire depuis le haut (LIFO) ; une file retire depuis l'avant (FIFO)
    stack = []
    stack.append("a")
    stack.append("b")
    print(stack.pop())   # b
    print(stack.pop())   # a
    
    12.3

    Files · ⁨Fichiers⁩

    English

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

    Français

    Une file 队列 est First-In-First-Out (FIFO 先进先出). Vous insérez 入队 à l'arrière et retirez 出队 depuis l'avant.

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

    Listes chainées

    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.

    Français

    Une liste chaînée 链表 est une chaîne de nœuds 节点. Chaque nœud contient des données et un pointeur 指针 vers le nœud suivant ; le dernier pointe vers None.

    Une liste chaînée : chaque noeud contient des données et un pointeur vers le noeud suivant, se terminant par None
    Une liste chaînée : chaque noeud contient des données et un pointeur vers le noeud suivant, se terminant par 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

    Tables de hachage

    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.

    Français

    Une table de hachage 哈希表 associe une clé à une case via une fonction de hachage 哈希函数. Deux clés peuvent atterrir dans la même case — c'est une collision 冲突. Python's dict est une table de hachage, donc la recherche est rapide.

    Une fonction de hachage mappe chaque clé à un emplacement ; deux clés peuvent entrer en collision dans un même emplacement
    Une fonction de hachage mappe chaque clé à un emplacement ; deux clés peuvent entrer en collision dans un même emplacement
    table = {}
    table["Mei"] = 88
    table["Sam"] = 71
    print(table["Mei"])   # 88  (fast lookup by key)
    
    12.6

    Arbres binaires de recherche

    English

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

    Français

    Un arbre binaire de recherche 二叉搜索树 (BST) maintient l'ordre : chaque enfant gauche est plus petit que son nœud, chaque enfant droit est plus grand. La recherche reste rapide.

    Un arbre binaire de recherche : les valeurs plus petites vont à gauche, les plus grandes à droite
    Un arbre binaire de recherche : les valeurs plus petites vont à gauche, les plus grandes à droite
    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

    Graphes

    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.
    Français

    Un graphe 图 est un ensemble de sommets 顶点 joints par des arêtes 边. Une liste d'adjacence 邻接表 — un dictionnaire de listes de voisins — est une méthode courante pour le stocker.

    Un graphe de sommets et d'arêtes, avec sa forme de liste d'adjacence
    Un graphe de sommets et d'arêtes, avec sa forme de liste d'adjacence
    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)
    

    Erreurs courantes

    • Une pile est Last-In-First-Out ; une file est First-In-First-Out. Ne les mélangez pas.
    • Vérifiez si une structure est vide avant de dépiler ou de retirer de la file.
    • Dans une liste chaînée, perdre le pointeur head fait perdre toute la liste.
  • 13 Searching, sorting & efficiency · ⁨Recherche, tri & efficacité⁩
    13.1

    Recherche linéaire et binaire

    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.

    Français

    Une recherche 查找 trouve où se trouve une valeur. La recherche linéaire 线性查找 vérifie chaque élément à tour de rôle, donc elle fonctionne sur n'importe quelle liste.

    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
    

    La recherche dichotomique 二分查找 est beaucoup plus rapide mais nécessite une liste triée. Elle divise la plage par deux à chaque étape.

    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
    
    La recherche dichotomique divise la plage par deux à chaque étape — O(log n) sur une liste triée
    La recherche dichotomique divise la plage par deux à chaque étape — O(log n) sur une liste triée
    13.2

    Tri (bulle et insertion)

    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():
    Français

    Trier 排序 consiste à mettre les éléments dans l'ordre. Le tri bulle 冒泡排序 échange répétitivement les voisins qui sont dans le mauvais ordre.

    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]
    

    Le tri par insertion 插入排序 construit une partie triée un élément à la fois, glissant chaque nouvel élément à sa place :

    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]
    
    • En code réel, utilisez le built-in Python sorted() :
    print(sorted([5, 2, 4, 1]))           # [1, 2, 4, 5]
    
    13.3

    Efficacité algorithmique

    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
    Français

    L'efficacité 效率 examine comment le travail augmente lorsque l'entrée augmente. Nous la décrivons avec la notation Big-O 大O记号.

    Comment le nombre d'étapes croît avec la taille de l'entrée pour les complexités courantes
    Comment le nombre d'étapes croît avec la taille de l'entrée pour les complexités courantes
    Big-O Nom Exemple
    $O(1)$ constant look up a dict key
    $O(\log n)$ logarithmique binary search
    $O(n)$ linéaire linear search
    $O(n^2)$ quadratique bubble sort
    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

    Aléatoire et simulation

    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.
    Français

    Le module random génère des nombres aléatoires. Utilisez une graine 种子 pour rendre les résultats reproductibles. Une simulation 模拟 exécute de nombreux essais aléatoires pour estimer une réponse.

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

    Erreurs courantes

    • La recherche dichotomique ne fonctionne que sur une liste triée.
    • Big-O vous dit comment le temps CROÎTRAIT, pas le temps exact ; une méthode O(n²) bat O(n) seulement pour de minuscules entrées.
    • Le tri bulle est O(n²) — bien pour apprendre, mais lent sur de grandes listes.
  • 14 OOP & paradigms · ⁨POO & paradigmes⁩
    14.1

    Classes et objets

    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:

    Français

    Une classe 类 est un modèle. Un objet 对象 est une chose construite à partir (une instance 实例). __init__ est le constructeur 构造方法 qui met en place chaque objet ; self est l'objet lui-même.

    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 est un attribut 属性 (données sur l'objet) ; speak est une méthode 方法 (une action).

    Ajoutez __str__ pour contrôler ce que montre 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
    
    Une classe est un plan ; l'appeler crée un objet
    Une classe est un plan ; l'appeler crée un objet
    14.2

    Héritage, encapsulation et polymorphisme

    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.

    Français

    L'héritage 继承 permet à une sous-classe 子类 de réutiliser une super-classe 父class. Utilisez super() pour appeler le parent ; redéfinissez 重写 une méthode pour la modifier.

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

    L'encapsulation 封装 cache les données derrière des méthodes ; un underscore initial les marque comme privées 私有.

    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
    

    Le polymorphisme 多态 signifie un nom, plusieurs comportements — le bon speak s'exécute pour chaque objet.

    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

    Paradigmes de programmation

    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.
    Français

    Un paradigme 范式 est un style d'écriture de programmes. Le code procédural 过程式 est une séquence d'étapes et de fonctions. Le code orienté objet 面向对象 regroupe données et méthodes dans des objets. Le code déclaratif 声明式 dit ce que vous voulez, pas comment (une comprehension de liste ou 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)
    

    Erreurs courantes

    • Chaque méthode a besoin de self comme premier paramètre.
    • __init__ met en place un nouvel objet et s'exécute automatiquement lors de sa création.
    • Deux objets de la même classe ont des attributs séparés ; modifier l'un ne modifie pas l'autre.
  • 15 Data representation · ⁨Représentation des données⁩
    15.1

    Bits et binaire

    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:

    Français

    Un bit 比特 est un seul 0 ou 1. Le binaire 二进制 est le système numérique base-2 : chaque position vaut le double de celle de droite (1, 2, 4, 8, …). Le décimal 十进制 (base-10) correspond à nos nombres habituels.

    Binary place values: 1101 means 8 + 4 + 1 = 13
    Binary place values: 1101 means 8 + 4 + 1 = 13
    print(bin(13))         # 0b1101
    print(int("1101", 2))  # 13
    
    • 8 bits font un octet 字节. Une largeur fixe peut déborder 溢出 (s'enrouler) lorsque le nombre est trop grand.
    x = 250
    x = (x + 10) % 256     # one byte wraps at 256
    print(x)               # 4
    

    L'hexadécimal 十六进制 (base 16) est une façon compacte de lire le binaire : un chiffre hexadécimal représente exactement quatre bits. Python écrit l'hexadécimal avec 0x :

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

    Compression

    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.
    Français

    La compression 压缩 rend les données plus petites. La compression sans perte 无损 compression conserve tous les bits, permettant de reconstruire l'original exactement. La compression avec perte 有损 compression jette des détails — plus petite mais pas exacte — et est utilisée pour les photos et la musique.

    Le codage par longueur de run 游程编码 est une simple méthode sans perte : stocker un run 游程 (une répétition) comme un compteur suivi de la valeur.

    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
    

    Erreurs courantes

    • n bits stockent 2**n valeurs différentes, de 0 à 2**n - 1.
    • La compression avec perte jette des détails et ne peut pas être annulée ; la sans perte peut être inversée exactement.
  • 16 Computing concepts · ⁨Concepts informatiques⁩
    16.1

    Ce qu'est l'informatique et le cycle de conception

    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.
    Français

    L'informatique 计算 signifie résoudre des problèmes avec des ordinateurs : entrée, traitement, sortie. Un bon logiciel est construit selon un cycle de conception 设计循环 — planifier, écrire, tester, améliorer — répété de nombreuses fois.

    • Décomposez un problème, construisez une petite partie, testez-la, puis ajoutez-en davantage.
    • Les programmeurs travaillent en équipe et réutilisent le code les uns des autres.
    16.2

    Internet

    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
    Français

    Internet 互联网 est un réseau 网络 de réseaux. Les données sont découpées en paquets 数据包 qui circulent séparément et sont reconstitués à l'autre extrémité. Des règles partagées appelées protocoles 协议 (comme TCP/IP) rendent cela possible. Si un chemin est interrompu, les paquets empruntent une autre voie — c'est la redondance 冗余, qui confère une tolérance aux pannes 容错.

    Une carte d'Internet : chaque ligne représente un chemin entre deux réseaux
    Une carte d'Internet : chaque ligne représente un chemin entre deux réseaux
    Couche Rôle
    HTTP demande et envoie des pages web
    TCP livraison fiable, dans l'ordre
    IP adressage et routage
    16.3

    Calcul parallèle et distribué

    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.
    Français

    Le code séquentiel 顺序 effectue une étape à la fois. Le calcul parallèle 并行 effectue plusieurs étapes simultanément sur de nombreux cœurs 核心, ce qui peut apporter un gain de performance 加速. Le calcul distribué 分布式 répartit la charge de travail sur plusieurs ordinateurs, comme dans le cloud.

    • Tout ne peut pas s'exécuter en parallèle : certaines étapes doivent attendre un résultat antérieur.
    16.4

    Impact du calcul

    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.
    Français

    Le calcul apporte à la fois des avantages et des inconvénients. La fracture numérique 数字鸿沟 signifie que tout le monde n'a pas un accès égal. Les logiciels peuvent contenir des biais 偏见 tirés des données dont ils apprennent. Respectez la propriété intellectuelle 知识产权 (licences), et protégez les données personnelles 个人数据 et la vie privée 隐私 des personnes.

    Erreurs courantes

    • Internet et le World Wide Web ne sont pas la même chose : le Web est un service qui fonctionne au-dessus d'Internet.
    • Avoir plus de cœurs de processeur n'est utile que si la tâche peut être divisée en parties exécutables simultanément.
  • 17 Putting it together · ⁨Tout mettre ensemble⁩
    17.1

    Mini-projets de bout en bout

    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.
    Français

    Un mini-projet 小项目 combine les notions précédentes : des données dans une liste, une fonction avec une sélection dans une boucle, et une sortie imprimée. C'est aussi la forme de la Tâche de Performance AP Create.

    Projet : note moyenne

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

    Projet : compter les succès

    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
    

    Projet : filtrer vers une nouvelle liste

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

    La Tâche AP Create demande une liste, une procédure paramétrée 过程 utilisant une sélection 选择 et une itération 迭代, ainsi qu'une entrée/sortie. Chacun des projets ci-dessus suit exactement cette structure — construisez des petits morceaux, puis assemblez-les.

    Erreurs courantes

    • Construisez par petites étapes et testez chaque partie avant de passer à la suivante — ne writez pas tout d'un coup.
    • Lisez toute la tâche d'abord, puis planifiez l'entrée → traitement → sortie avant de coder.
    Mini-projet : données → fonction → résultat imprimé
    Mini-projet : données → fonction → résultat imprimé

Log in or create account · ⁨Se connecter ou créer un compte⁩

IGCSE, A-Level & AP