Примеры заданий на 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, но сложнее.

Задания для Python Junior - comments

En
задания на python junior (python)