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.
    Русский

    Python выполняет ваш код строка за строкой. Каждая строка является оператором. Программа — это просто список операторов, которые выполняются сверху вниз.

    Функция print() выводит текст на экран. Это называется выводом. Текст внутри кавычек является строкой.

    print("Hello, world!")
    print("I am learning Python")
    
    • Каждый print() начинает новую строку.
    • Кавычки могут быть "double" или 'single' — оба варианта создают строку.
    • Программа ничего не делает, пока вы её не запустите.

    Исходный код проходит через интерпретатор для получения вывода Комментарий начинается с ⟨⟩. Python игнорирует все после ⟨⟩ на этой строке. Комментарии объясняют ваш код людям; они не изменяют поведение кода.

    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 错误.
    Русский

    Комментарий начинается со знака #. Python игнорирует всё после символа # в этой строке. Комментарии объясняют ваш код людям; они не изменяют поведение кода.

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

    Хороший стиль делает код легким для чтения:

    • Используйте понятные имена, которые указывают на смысл значения.
    • Размещайте каждое утверждение на отдельной строке.
    • Не добавляйте пробелы в начале обычной строки. В Python отступы (отступы) имеют специальное значение, поэтому неверный пробел вызывает ошибку.
    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() считывает текст, который вводит пользователь. Она всегда возвращает строку.

    name = input("What is your name? ")
    print("Hello, " + name)
    
    • input() ожидает, пока пользователь введет данные и нажмет Enter.
    • Сохраните введенный текст в переменной, чтобы использовать его позже.
    • Поскольку input() возвращает строку, преобразуйте ее с помощью int(...) перед использованием, если вам нужно число.

    Распространенные ошибки

    • Забытые кавычки: print(Hello) ищет переменную с именем Hello и вызывает NameError. Текст требует кавычек: print("Hello").
    • Случайный пробел в начале строки: Python читает отступы как структуру, поэтому вызывает 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.
    Русский

    В Python два основных типа чисел. Целое число (int) — это целое число, например 17. Число с плавающей точкой (float) имеет десятичную точку, например 9.99.

    Эти операторы работают с числами:

    Оператор Значение Пример Результат
    + сложение 3 + 2 5
    - вычитание 3 - 2 1
    * умножение 3 * 2 6
    / деление (всегда float) 7 / 2 3.5
    // целочисленное деление 7 // 2 3
    % остаток (modulo) 7 % 2 1
    ** возведение в степень 2 ** 3 8
    • / всегда возвращает float, поэтому 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. Python использует стандартный порядок действий математики (* и / выполняются до + и -); добавьте скобки, чтобы упорядочить действия.

    input() возвращает строку, поэтому преобразуйте её перед выполнением математики. Изменение значения из одного типа в другой называется преобразованием типов:

    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.
    Русский

    Булево значение — это одно из двух значений: 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
    

    Распространенные ошибки

    • / всегда возвращает float, даже если 4 / 2 является 2.0. Используйте //, когда вам нужно целое число.
    • Использование = вместо ==: = присваивает значение, а == проверяет, равны ли два значения.
    • Объединение строки и числа: "age: " + 5 вызывает TypeError. Сначала преобразуйте с помощью str(5).
    • Floats неточны, поэтому 0.1 + 0.2 не является точно 0.3 — избегайте использования == на результатах float.
  • 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

    Срезы

    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, но останавливается перед 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 拼接:

    Русский

    Метод — это функция, принадлежащая значению. Вы вызываете его с помощью точки:

    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']

    Объединяйте строки с помощью +. Это называется конкатенацией:

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

    f-строки

    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.
    Русский

    f-строка构建文本从值。放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-if) для дополнительных случаев и 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

    Паттерн аккумуляторa

    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.
    Русский

    Чтобы накапливать результат в цикле, создайте переменную до цикла, а затем обновляйте её на каждом шаге. Это паттерн аккумуляторa.

    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 — это классическая ошибка смещения на единицу (off-by-one error).
    • Изменение списка во время обхода пропускает элементы; обходите копию, если необходимо удалять вещи.
    • Забыв изменить переменную цикла в 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 · ⁨Словари⁩
    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 определяет; вызов выполняет; return отправляет значение обратно
    def определяет функцию; вызов выполняет её; 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. Печать (print) — это не то же самое, что возврат (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.
    Русский

    Код может сломаться тремя способами. Синтаксическая ошибка нарушает правила Python, поэтому код никогда не выполняется. Ошибка времени выполнения происходит во время работы, например деление на ноль. Логическая ошибка выполняется, но даёт неверный результат.

    # 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 печатает трассировку стека (traceback), показывающую, где произошла ошибка. Читайте её снизу вверх.
    Распространённые ошибки Python: Syntax, Name, Type, Index
    Распространённые ошибки Python: Syntax, Name, 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.
    Русский

    Оберните рискованный код в 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
    

    Добавление (append)

    Режим "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 (с автозакрытием)
    open → read/write → close (с автозакрытием)
  • 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.

    Русский

    Псевдокод — это структурированный plain English для алгоритма, написанный до реального кода. Он не выполняется.

    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

    Абстрактные типы данных (АТД)

    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 (последним пришёл — первым ушёл). Вы кладёте элементы на верх (push) и извлекаете с вершины (pop).

    Стек удаляет сверху (LIFO); очередь удаляет спереди (FIFO)
    Стек удаляет сверху (LIFO); очередь удаляет спереди (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 (первым пришёл — первым ушёл). Вы добавляете элемент в конец (enqueue) и извлекаете спереди (dequeue).

    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.

    Связный список: каждый узел хранит данные и указатель на следующий, заканчивается None
    Связный список: каждый узел хранит данные и указатель на следующий, заканчивается 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

    Хэш-таблицы

    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.

    Русский

    Хэш-таблица отображает ключ в ячейку с помощью хэш-функции. Два ключа могут попасть в одну ячейку — коллизия. Словари Python dict являются хэш-таблицами, поэтому поиск быстрый.

    Хэш-функция отображает каждый ключ в ячейку; два ключа могут столкнуться в одной ячейке
    Функция хеширования сопоставляет каждому ключу слот; два ключа могут попасть в один слот (коллизия)
    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)
    

    Распространенные ошибки

    • Стек работает по принципу LIFO (последним пришёл — первым ушёл); очередь — по FIFO (первым пришёл — первым ушёл). Не перепутайте их.
    • Проверяйте, пуста ли структура, перед тем как выполнить pop или dequeue.
    • В связном списке потеря указателя 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-OO.

    Как количество шагов растёт с размером входных данных для типичных сложностей
    Как количество шагов растёт с размером входных данных для типичных сложностей
    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 генерирует случайные числа. Используйте seed (семя), чтобы результаты были воспроизводимы. Моделирование выполняет множество случайных испытаний для оценки ответа.

    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 · ⁨ООП и парадигмы⁩
    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.
    Русский

    Сжатие делает данные меньше. Безпотерянное сжатие сохраняет каждый бит, позволяя точно восстановить исходные данные. Потерянное сжатие отбрасывает детали — результат меньше, но не точен — и используется для фотографий и музыки.

    Длиннокодовая кодировка (RLE) — простой метод безпотерянного сжатия: серия повторов хранится как счётчик плюс значение.

    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), обеспечивают эту работу. Если один путь выходит из строя, пакеты идут другим маршрутом — это избыточность, обеспечивающая отказоустойчивость.

    Карта Интернета: каждая линия — это путь между двумя сетями
    Карта Интернета: каждая линия — это путь между двумя сетями
    Слой Задача
    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) — это не одно и то же: 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 Create требует список, параметризованную процедуру, использующую выбор и итерацию, а также ввод/вывод. Каждый из проектов выше имеет именно такую структуру — создавайте небольшие компоненты, затем объединяйте их.

    Распространенные ошибки

    • Разбивайте создание кода на мелкие шаги и тестируйте каждую часть перед переходом к следующей — не пишите весь код сразу.
    • Сначала прочитайте задание целиком, затем спланируйте входные данные → обработку → выходные данные перед написанием кода.
    Мини-проект: данные → функция → печатный результат
    Мини-проект: данные → функция → печатный результат

Log in or create account · ⁨Войти или создать аккаунт⁩

IGCSE, A-Level & AP