Задачи для контрольной по программированию на 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).