Задачи на Python: примеры для подготовки к собеседованию
При подготовке к собеседованию на позицию Python разработчика важно уметь решать задачи разного уровня сложности. В этом разделе собраны типичные примеры тестовых заданий с вариантами решений и разбором возможных ошибок. Каждый пример сопровождается вопросом, на который отвечает решение.
Основные типы заданий и подходы
Как проверить, является ли строка палиндромом?
Самое эффективное решение - сравнить строку с её перевёрнутой копией, игнорируя пробелы, регистр и знаки препинания. В Python это делается с помощью среза и метода lower().
import re
def is_palindrome(s):
cleaned = re.sub(r'[^a-zA-Zа-яА-Я]', '', s).lower()
return cleaned == cleaned[::-1]
яндекс задания python (задания от яндекса по python)
Такой подход работает за O(n) по времени и O(n) по памяти. Подходит для большинства строк.
Вариант с ручным циклом:
def is_palindrome_cyclic(s):
s = ''.join(c.lower() for c in s if c.isalpha())
i, j = 0, len(s)-1
while i < j:
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
Python разработчик тестовые задания (примеры тестовых заданий python)
Этот вариант не создаёт новую строку целиком, но в Python строка всё равно копируется при join. Подходит для обучения, но уступает срезу.
Типичная ошибка - не учитывать регистр или пунктуацию. Если используется s == s[::-1] без очистки, 'A man a plan a canal Panama' вернёт False. Также возможна проблема с unicode символами, например, с буквой 'ё' - lower() срабатывает корректно, но в старых версиях Python 2 мог быть нюанс. Рекомендуется использовать casefold() для строгого сравнения.
Как найти второй по величине элемент в списке?
Оптимальное решение с однократным проходом:
def second_max(numbers):
if len(numbers) < 2:
return None
first = second = float('-inf')
for n in numbers:
if n > first:
second = first
first = n
elif n > second and n != first:
second = n
return second if second != float('-inf') else None
егэ python задачи (задачи егэ по python)
Этот алгоритм работает за O(n) и использует O(1) памяти. Подходит для больших списков.
Вариант с сортировкой:
def second_max_sort(numbers):
if len(numbers) < 2:
return None
unique = list(set(numbers))
if len(unique) < 2:
return None
unique.sort()
return unique[-2]
программы python егэ (программы для егэ по python)
Простота, но сложность O(n log n). Применяется, если сортировка не критична, а код должен быть коротким.
Ошибка - не учитывать дубликаты. Если список [3,3,3], второй максимум должен быть None, а не 3. Вариант с set решает эту проблему. В однопроходном алгоритме проверка n != first обязательна.
Как реализовать класс банковского счёта с методами пополнения и снятия?
Эффективное решение:
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self._balance = balance
def deposit(self, amount):
if amount <= 0:
raise ValueError("Сумма должна быть положительной")
self._balance += amount
return self._balance
def withdraw(self, amount):
if amount <= 0:
raise ValueError("Сумма должна быть положительной")
if amount > self._balance:
raise ValueError("Недостаточно средств")
self._balance -= amount
return self._balance
@property
def balance(self):
return self._balance
решу егэ python (решение заданий егэ по python)
Инкапсуляция через защищённый атрибут и property. Исключения для обработки ошибок.
Вариант с использованием __slots__:
class BankAccountSlots:
__slots__ = ('owner', '_balance')
# ... методы те же
Python тестовое (тестовое задание python)
Экономит память при большом количестве объектов. Подходит для высоконагруженных систем.
Частая ошибка - не проверять отрицательные суммы или снятие больше баланса. Без валидации программа упадёт с непонятной ошибкой. Также забывают про наследование - в реальных проектах удобно создать базовый класс Account.
Как прочитать CSV файл и вычислить среднее значение столбца?
Стандартный модуль csv без внешних библиотек:
import csv
def average_column(filename, column):
total = 0
count = 0
with open(filename, newline='') as f:
reader = csv.DictReader(f)
for row in reader:
try:
total += float(row[column])
count += 1
except (ValueError, KeyError):
continue
return total / count if count else None
задачи огэ python (задачи огэ по python)
Используется DictReader для безопасного доступа по имени столбца. Обрабатываются пропуски и нечисловые значения.
Вариант с Pandas:
import pandas as pd
def average_pandas(filename, column):
df = pd.read_csv(filename)
return df[column].mean()
Кратко, но требует установки библиотеки. Подходит, если в проекте уже используется pandas.
Ошибка - не обрабатывать пустые строки или строки с заголовками. Если в столбце есть нечисловые значения, mean() выдаст NaN. В первом варианте try-except игнорирует такие строки, что может исказить результат.
Эти примеры охватывают базовые конструкции Python, работу с последовательностями, ООП и ввод-вывод. Для успешного выполнения тестового задания важно не только найти решение, но и учесть граничные случаи.
Дополнительные примеры и расширенные техники
Палиндром с учётом всех символов Unicode
import unicodedata
def is_palindrome_unicode(s):
def normalize(ch):
nfkd = unicodedata.normalize('NFKD', ch)
return nfkd.encode('ascii', 'ignore').decode('ascii').lower()
cleaned = ''.join(c for c in s if c.isalnum() or unicodedata.category(c) == 'Lo')
processed = ''.join(map(normalize, cleaned))
return processed == processed[::-1]
print(is_palindrome_unicode('A man, a plan, a canal: Panama')) # True
print(is_palindrome_unicode('Éma, à ma? É!')) # True (после нормализации 'e')
Этот код нормализует символы, удаляя диакритические знаки, что позволяет корректно сравнивать строки с разными акцентами. Используется для интернациональных данных.
Генератор чисел Фибоначчи с мемоизацией
def fibonacci_memo():
cache = {0: 0, 1: 1}
def fib(n):
if n not in cache:
cache[n] = fib(n-1) + fib(n-2)
return cache[n]
return fib
fib = fibonacci_memo()
[fib(i) for i in range(10)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Мемоизация снижает сложность с экспоненциальной до линейной. Подходит для рекурсивных алгоритмов, где есть повторяющиеся вызовы.
Сортировка списка словарей по нескольким ключам
users = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Alice', 'age': 20}
]
sorted_users = sorted(users, key=lambda x: (x['name'], -x['age']))
[{'name': 'Alice', 'age': 30}, {'name': 'Alice', 'age': 20}, {'name': 'Bob', 'age': 25}]
Сортировка по имени по возрастанию, а затем по возрасту по убыванию (используется минус). Часто встречается в задачах на агрегацию данных.
Декоратор для замера времени выполнения функции
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
print(f"{func.__name__} выполнилась за {elapsed:.6f} сек")
return result
return wrapper
@timer
def compute():
sum(i**2 for i in range(10**6))
compute()
compute выполнилась за 0.042394 сек
Декоратор полезен для профилирования кода в тестовых заданиях, где требуется оптимизация.
Итератор по чётным числам с помощью класса
class EvenIterator:
def __init__(self, numbers):
self.numbers = numbers
self.index = 0
def __iter__(self):
return self
def __next__(self):
while self.index < len(self.numbers):
value = self.numbers[self.index]
self.index += 1
if value % 2 == 0:
return value
raise StopIteration
list(EvenIterator([1,2,3,4,5,6]))
[2, 4, 6]
Реализация кастомного итератора демонстрирует понимание протокола итерации. Применяется в задачах на работу с потоками данных.
Эти примеры показывают более глубокие возможности Python, которые могут встретиться в сложных тестовых заданиях.