Задачи для контрольной по программированию на Python и их решения

Раздел: Обучение Python -> Образовательные материалы

Основные типы задач на контрольной работе

Как найти сумму всех четных чисел в списке?

Самое простое решение использует цикл for и проверку остатка от деления.


def sum_even(numbers):
    total = 0
    for num in numbers:
        if num % 2 == 0:
            total += num
    return total

print(sum_even([1,2,3,4,5,6]))  # 12

контрольная работа язык программирования python (контрольная работа по python)

Как решить задачу с помощью list comprehension и sum?


def sum_even(numbers):
    return sum(x for x in numbers if x % 2 == 0)

Этот вариант более компактный и читаемый, подходит для небольших списков.

Как использовать reduce из functools?


from functools import reduce

def sum_even(numbers):
    return reduce(lambda acc, x: acc + x if x % 2 == 0 else acc, numbers, 0)

Подходит для демонстрации функционального подхода, но менее читаем.

Типичная ошибка: неверное использование оператора % для отрицательных чисел. В Python остаток от деления отрицательного числа на 2 всегда неотрицателен (0 или 1), поэтому код корректен. Но если проверять num % 2 == 0 для отрицательных четных чисел, результат будет True. Однако начинающие могут ошибочно использовать num % 2 == 0 and num > 0, что исключит отрицательные четные числа.

Как проверить, является ли строка палиндромом?

Основной подход: сравнить строку с её обратной копией.


def is_palindrome(s):
    return s == s[::-1]

print(is_palindrome("radar"))  # True
print(is_palindrome("hello"))  # False

Это решение игнорирует регистр и пробелы, что может быть проблемой для сложных проверок.

Как проверить палиндром с игнорированием пробелов и регистра?


def is_palindrome_clean(s):
    clean = ''.join(c.lower() for c in s if c.isalnum())
    return clean == clean[::-1]

print(is_palindrome_clean("A man, a plan, a canal: Panama"))  # True

Как решить задачу с помощью цикла с двух сторон?


def is_palindrome_loop(s):
    s = ''.join(c.lower() for c in s if c.isalnum())
    left, right = 0, len(s) - 1
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1
    return True

Этот вариант эффективнее по памяти, но сложнее для понимания.

Распространённая ошибка: забыть про очистку строки от небуквенных символов. Сравнение без фильтрации может дать ложный результат для фразы "А роза упала на лапу Азора", если не убрать пробелы и не привести к нижнему регистру. Также ошибка при использовании среза [::-1] для очень длинных строк может вызвать большую нагрузку на память.

Как написать функцию для вычисления факториала?

Простая итеративная версия с циклом for.


def factorial_iterative(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result

print(factorial_iterative(5))  # 120

Как вычислить факториал рекурсивно?


def factorial_recursive(n):
    if n < 0:
        raise ValueError("Факториал не определён для отрицательных чисел")
    if n == 0:
        return 1
    return n * factorial_recursive(n - 1)

Рекурсия наглядна, но для больших n приводит к превышению глубины рекурсии.

Как использовать math.factorial?


import math
print(math.factorial(5))  # 120

Самый короткий вариант, подходит, если разрешено использовать стандартную библиотеку.

Ошибки: использование рекурсии без проверки на отрицательные числа (вызовет бесконечную рекурсию). Или забыть обработать случай n=0. При использовании математических операций с большими числами надо помнить, что Python поддерживает длинные целые, но факториал растёт быстро, что может замедлить выполнение.

Как прочитать числа из файла, отсортировать и вывести?

Пример чтения файла, содержащего числа, разделённые пробелами или строками.


with open('numbers.txt', 'r') as f:
    raw = f.read()
numbers = list(map(int, raw.split()))
numbers.sort()
for n in numbers:
    print(n)

Как обработать файл построчно с возможными ошибками?


with open('numbers.txt', 'r') as f:
    numbers = []
    for line in f:
        line = line.strip()
        if line:
            try:
                numbers.append(int(line))
            except ValueError:
                print(f"Нечисловое значение пропущено: {line}")
numbers.sort()
print(numbers)

Этот вариант устойчивее к некорректным данным.

Типичные проблемы: файл не найден, в файле есть пустые строки или нечисловые символы. Без обработки исключений программа завершится аварийно. Также ошибка при использовании int() для чисел с плавающей точкой.

Расширенные примеры и нестандартные приёмы

Как применить декораторы для кэширования результатов рекурсивных вычислений?

Пример

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

print(fib(100))  # 354224848179261915075
354224848179261915075

Декоратор lru_cache автоматически сохраняет результаты вызовов, что ускоряет рекурсию. Без него вычисление fib(100) занимало бы очень много времени.

Как использовать генераторы для обработки большого потока данных без загрузки в память?

Пример

def read_large_file(filename):
    with open(filename) as f:
        for line in f:
            yield int(line.strip())

def filter_even(seq):
    for x in seq:
        if x % 2 == 0:
            yield x

sum_even = sum(filter_even(read_large_file('big_data.txt')))
print(sum_even)

Генераторы позволяют обрабатывать файл построчно, не загружая его целиком. Это экономит память при работе с гигабайтными файлами.

Как воспользоваться модулем json для сериализации сложной структуры?

Пример

import json

data = {
    "students": [
        {
            "name": "Анна",
            "grades": [5, 4, 3, 5]
        },
        {
            "name": "Пётр",
            "grades": [4, 4, 4, 5]
        }
    ],
    "average": 4.3
}

with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

Аргумент ensure_ascii=False сохраняет русские буквы, indent=2 делает вывод читаемым. Типичная ошибка: забыть указать кодировку или попытаться сериализовать объект, не поддерживающий JSON (например, datetime).

Как написать функцию сортировки с компаратором (на примере сортировки списка кортежей по второму элементу)?

Пример

items = [('яблоко', 3), ('банан', 1), ('вишня', 2)]
sorted_items = sorted(items, key=lambda x: x[1])
print(sorted_items)
[('банан', 1), ('вишня', 2), ('яблоко', 3)]

Параметр key принимает функцию, извлекающую значение для сравнения. Более сложный случай: сортировка по убыванию с reverse=True.

Как применить map и filter для обработки списка?

Пример

nums = [1, 2, 3, 4, 5, 6]
# Возвести в квадрат только чётные числа
result = list(map(lambda x: x**2, filter(lambda x: x % 2 == 0, nums)))
print(result)  # [4, 16, 36]

Комбинация функций позволяет писать декларативный код без циклов. Стоит помнить, что map и filter возвращают итераторы, которые необходимо преобразовать в список.

Как обработать исключение с несколькими типами ошибок?

Пример

def safe_divide(a, b):
    try:
        result = a / b
    except ZeroDivisionError:
        print("Ошибка деления на ноль")
        return None
    except TypeError:
        print("Ошибка типов данных")
        return None
    else:
        return result
    finally:
        print("Деление завершено")

print(safe_divide(10, 2))  # 5.0
print(safe_divide(10, 0))  # None

Конструкция try-except-else-finally даёт полный контроль над обработкой ошибок. Частая оплошность: забыть про исключение TypeError при передаче некорректных типов (строка, None).

Контрольная работа по Python - comments

En
контрольная работа язык программирования python (python)