Примеры заданий на Python для Junior разработчика
Практическое задание для Junior: развернуть строку
Задача: получить строку, записанную в обратном порядке. Например, из 'abc' получить 'cba'. Это типовое задание на собеседовании для проверки знания базовых структур и алгоритмов.
Основное решение: срез строки с шагом -1
Самый эффективный способ в Python - использование среза с отрицательным шагом. Код:
def reverse_string(s):
return s[::-1]задания на python junior (задания для python junior)
Пояснение: срез [::-1] означает взять всю строку с начала до конца с шагом -1. Это быстрый способ, реализованный на уровне C. Не требует дополнительной памяти, кроме самой строки (но строки неизменяемы, поэтому создается новая строка).
Проблемы: Не подходит для изменяемых объектов? Для строк - идеально. Ошибки: если передать не строку, а, например, число, вызовет TypeError. Нужна проверка типа.
Цель: демонстрация знания срезов и особенностей строк. Используется в 90% случаев на собеседованиях.
Вариант 1: Цикл for с накоплением
Вопрос: как развернуть строку без использования встроенных средств Python?
def reverse_string_for(s):
result = ''
for char in s:
result = char + result
return result
Пояснение: проходим по каждому символу исходной строки и добавляем его в начало результата. Обратите внимание: на каждой итерации создается новая строка, что неэффективно для длинных строк (сложность O(n^2)).
Проблемы: Производительность: при длине строки 10000 символов время выполнения будет в разы больше, чем у среза. Ошибки: при передаче пустой строки цикл не выполнится, вернется пустая строка.
Цель: показать понимание работы циклов и конкатенации строк. Подходит для коротких строк или учебных целей.
Вариант 2: Использование reversed() и join()
Вопрос: как развернуть строку, используя встроенный итератор reversed?
def reverse_string_reversed(s):
return ''.join(reversed(s))
Пояснение: reversed возвращает итератор, который проходит символы в обратном порядке. join собирает их в строку. Этот способ эффективнее цикла, но медленнее среза из-за накладных расходов на итератор и join.
Проблемы: Неочевидность для новичков. Нужно понимать работу итераторов. Ошибок не возникает, если s - строка.
Цель: знакомство с функциями reversed и join. Подходит, когда нужно получить обратную последовательность любого итерируемого объекта.
Вариант 3: Рекурсивный разворот
Вопрос: как реализовать разворот строки с помощью рекурсии?
def reverse_string_recursive(s):
if len(s) <= 1:
return s
return reverse_string_recursive(s[1:]) + s[0]
Пояснение: базовый случай - строка длины 0 или 1. Рекурсия разворачивает подстроку без первого символа и добавляет первый символ в конец. Этот метод неэффективен: создаются много промежуточных строк, глубина рекурсии ограничена (обычно 1000).
Проблемы: Ограничение стека: при длине строки > 1000 вызовет RecursionError. Медленнее всех других способов. Также возможна путаница с базовым случаем.
Цель: демонстрация рекурсивного мышления. Используется редко на практике из-за ограничений, но может быть проверкой понимания рекурсии.
Расширенные примеры заданий, которые могут встретиться на собеседовании или в тестовом задании.
Пример 1: Проверка строки на палиндром
Задача: определить, является ли строка палиндромом, игнорируя пробелы, знаки препинания и регистр.
import re
def is_palindrome(text):
cleaned = re.sub(r'[^a-zA-Z0-9а-яА-ЯёЁ]', '', text).lower()
return cleaned == cleaned[::-1]
print(is_palindrome('A man, a plan, a canal: Panama'))
print(is_palindrome('Привет'))
print(is_palindrome('12321'))
True False True
Пояснение: используется регулярное выражение для фильтрации, приведение к нижнему регистру, сравнение строки с перевернутой. Альтернатива: two-pointer техника без создания новой строки.
Пример 2: Удаление дубликатов из списка с сохранением порядка
Задача: убрать повторяющиеся элементы, оставив первое вхождение.
def remove_duplicates(items):
seen = set()
result = []
for item in items:
if item not in seen:
seen.add(item)
result.append(item)
return result
print(remove_duplicates([1, 2, 2, 3, 1, 4, 3]))
print(remove_duplicates(['a', 'b', 'a', 'c', 'b']))
[1, 2, 3, 4] ['a', 'b', 'c']
Пояснение: set для быстрой проверки уникальности, список для сохранения порядка. Подходит для любых хешируемых элементов. Для нехешируемых (словари, списки) требуется другой подход.
Пример 3: Чтение файла и запись строк в обратном порядке
Задача: прочитать текстовый файл, записать его строки в обратном порядке в новый файл.
def reverse_file(input_path, output_path):
with open(input_path, 'r', encoding='utf-8') as fin:
lines = fin.readlines()
with open(output_path, 'w', encoding='utf-8') as fout:
fout.writelines(reversed(lines))
# Создадим тестовый файл
test_content = '''строка1
строка2
строка3'''
with open('test.txt', 'w', encoding='utf-8') as f:
f.write(test_content)
reverse_file('test.txt', 'reversed.txt')
with open('reversed.txt', 'r', encoding='utf-8') as f:
print(f.read())
строка3 строка2 строка1
Пояснение: чтение всех строк в список, разворот списка с помощью reversed() и запись. Осторожно с большими файлами - может занять много памяти. Альтернатива: чтение файла с конца с помощью seek, но сложнее.