Библиотека собеса по Python | вопросы с собеседований
6.16K subscribers
602 photos
9 videos
297 links
Вопросы с собеседований по Python и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/6587aafa

Для обратной связи: @proglibrary_feeedback_bot
加入频道
Как переименовать файл с помощью Python?

С помощью метода rename модуля os мы можем с легкостью изменить имя файла.
Как изменить тип данных списка?

Для изменения типа данных в списке можно использовать встроенные функции:

1. map() — применяет указанную функцию к каждому элементу списка и возвращает новый список с измененными элементами:

old_list = [1, 2, 3]
new_list = map(str, old_list)

В новом списке все элементы будут строкового типа.

2. Использование генераторного выражения:

old_list = [1, 2, 3]
new_list = [str(x) for x in old_list]

Здесь мы преобразуем элементы в строку и помещаем в новый список.

Также можно применить конструкцию map к генераторному выражению:

new_list = list(map(str, [1, 2, 3]))
Какой метод использовался до оператора in для проверки наличия ключа в словаре?

До появления оператора in в Python, чтобы проверить, содержит ли словарь определенный ключ, использовался метод словаря has_key().

Этот метод принимал в качестве аргумента проверяемый ключ и возвращал логическое значение - True, если ключ присутствовал в словаре, и False - если нет.

В Python 2.5 появился более понятный и краткий оператор in, поэтому сейчас рекомендуется использовать именно его, а has_key() считается устаревшим.
Как и для чего используется %s?

%s
— это Спецификатор формата и он используется для форматирования строк.
Он позволяет вставлять значения других типов (числа, объекты и т. д.) в строковые выражения, автоматически преобразуя их к строковому представлению.

%s заменяется на строковое представление переданного значения в процессе форматирования. Это удобный способ интерполяции строк.
Помимо простой интерполяции, %s полезен для оформления вывода данных в консоль, логгирования, составления SQL-запросов с подстановкой значений и других задач работы со строками.
Можно ли осуществить динамическую загрузку модуля в Python?

Чтобы загружать модули динамически, т.е. во время выполнения программы, используется функция importlib.import_module()

В этом примере мы импортируем модуль importlib и используем его функцию import_module() для динамической загрузки модуля math. Затем мы используем функцию sqrt() из загруженного модуля.

Динамическая загрузка модуля может быть полезна, например, если вы хотите загрузить модуль в зависимости от каких-то условий, которые определяются во время выполнения программы. Такой подход — медленный, но он помогает эффективнее использовать память.
Как используется конструкция try — except? Какие ещё блоки для обработки исключений существуют?

try: Этот блок используется, чтобы обернуть код, который может вызвать исключение.

except: В этом блоке пишется код, который будет выполнен, если в блоке try возникнет исключение. Можно указать несколько блоков except.

else: Этот блок выполняется, если в блоке try не возникло исключений, то есть всё сработало без ошибок.

finally: Данный блок выполняется всегда после try, except и else, независимо от того, появилось исключение или нет (например, содержит инструкцию по закрытию файла).
Есть ли в Python сборщик мусора, и, если есть, как он работает?

Стандартный интерпретатор использует несколько алгоритмов.

🧹 Подсчёт ссылок. Каждый объект в Python содержит внутренний счётчик ссылок. Когда он падает до нуля, это означает, что на объект больше нет ссылок, его можно удалить. Главный недостаток этого алгоритма — не умеет определять циклические ссылки.
🧹 Алгоритм поиска циклов. Реализован в модуле gc и активируется время от времени, а не постоянно. Если коротко, этот алгоритм периодически ищет объекты, которые ссылаются только друг на друга и не доступны извне. Объекты, признанные недостижимыми, удаляются.
Также стоит добавить, что циклический сборщик мусора делит объекты на три поколения в зависимости от того, как долго они существуют в памяти. Новые объекты помещаются в первое поколение. Если они сохраняются после очередного процесса сбора мусора, то перемещаются в следующее по старшинству поколение. Объекты в более старших поколениях проверяются реже.
🐍💼 Подготовка к собеседованию по Python: решаем 5 интересных задач

Проверяем двоичные деревья на симметричность, вычисляем расстояние Дамерау-Левенштейна и оцениваем сложность алгоритмов.

Читать статью
Какие типы коллекций есть в Python? Какие из них изменяемые, а какие неизменяемые?

🔹 Списки (List) — изменяемые коллекции, которые могут содержать элементы различных типов, упорядочены, поддерживают операции добавления и удаления элементов.
🔹 Кортежи (Tuple) — неизменяемые коллекции, которые также могут содержать элементы различных типов, упорядочены.
🔹 Строки (String) — неизменяемые коллекции. По сути, строка — это упорядоченная последовательность символов.
🔹 Множества (Set) — изменяемые коллекции, которые содержат уникальные элементы, не поддерживают индексацию и срезы.
🔹 Неизменяемые множества (Frozenset) — это те же множества, только неизменяемые.
🔹 Словари (Dictionary) — изменяемые коллекции пар ключ-значение, упорядочены начиная с Python 3.7.
Как в Python реализованы private и protected методы?

Вместо строгой инкапсуляции Python использует соглашения по именованию для таких методов. То есть, если вы захотите, вы всё равно можете к ним обратиться.

Protected методы обозначаются одним подчёркиванием (_) перед именем. К ним следует обращаться только в текущем классе и во всех его дочерних классах.

Private методы обозначаются двойным подчёркиванием (__) перед именем. К ним следует обращаться только внутри класса. Но опять же, это не абсолютная защита, а скорее способ избежать случайного доступа к методу.
Стоит ли в функции Python делать значением аргумента по умолчанию список?

Использовать список или другие изменяемые типы данных в качестве значения аргумента по умолчанию считается плохой практикой. Дело в том, что аргументы по умолчанию инициализируются один раз при первом вызове функции. Если список будет изменён, то изменённое значение сохранится и будет использоваться при последующих вызовах функции. Это может привести к неожиданным результатам.
Что такое глубокая и поверхностная копии? Для чего они нужны?

Поверхностная копия создаёт новый объект, который содержит ссылки на внутренние объекты из оригинала. Если вы измените внутренние объекты оригинала, эти изменения отразятся и в поверхностной копии. Поверхностное копирование полезно, когда вы хотите создать новый экземпляр коллекции, но сохранить элементы коллекции неизменными. Это copy.copy(x).

Глубокая копия, напротив, создаёт новый объект и рекурсивно копирует все внутренние объекты, найденные в оригинале. В результате, внутренние объекты глубокой копии являются полностью независимыми от оригинальных объектов. Это полезно, когда нужно, чтобы исходный объект и его копия были полностью изолированы друг от друга. Это copy.deepcopy(x).
Что такое lambda-функция и как её применить?

Это анонимная функция, то есть у неё нет имени. Она может принимать неограниченное количество аргументов. Использование ключевого слова def при её написании не требуется. Также нет явного return. Lambda-функция часто применяется в тех местах, где требуется функция для единоразового использования. Её можно подавать в качестве аргумента для функций высшего порядка, таких как map(), filter(), и sorted().

Структура Lambda-функции — lambda arguments: expression
Что такое тернарный оператор?

Это способ выполнить условное выражение в одной строке кода. Подменяет собой привычную конструкцию if — else. Тернарный оператор можно использовать для присвоения значения переменной на основе какого-либо условия.

В примере на картинке max_value будет равно a, если a больше b, и b в противном случае. Выведет 10.
Вопросы и задачи для собеседований на какой грейд вам хотелось бы видеть чаще?
Anonymous Poll
59%
junior
48%
middle
17%
senior
Что делает функция sample?

Функция sample() позволяет выбрать случайным образом элементы из последовательности или коллекции.

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

Функция принимает два основных аргумента:
population — последовательность, из которой надо выбрать элементы (list, tuple, string и т. д.)
k — количество элементов для выборки.

Дополнительные аргументы:

counts — список весов элементов (по умолчанию равновероятный выбор).
rng — генератор случайных чисел (по умолчанию берется из модуля random).

В примере из списка букв берется случайная выборка размером 3 элемента. Результат при каждом запуске будет разный.
Напишите функцию на Python, которая принимает на вход список чисел и возвращает наибольшую возрастающую подпоследовательность (непоследовательные числа, идущие в порядке возрастания) из исходного списка

Для решения этой задачи используется динамическое программирование. Мы создаем массив dp, где dp[i] представляет собой длину наибольшей возрастающей подпоследовательности, заканчивающейся в nums[i]. Затем мы выполняем двойной цикл, чтобы найти наибольшую длину для каждого элемента. После этого мы определяем саму подпоследовательность, начиная с наибольшей длины и двигаясь обратно по массиву dp.

Пример использования:
python
nums = [3, 12, 5, 8, 10, 2, 1]
result = longest_increasing_subsequence(nums)
print(result) # Output: [3, 5, 8, 10]

Эта функция найдет наибольшую возрастающую подпоследовательность из списка [3, 12, 5, 8, 10, 2, 1], которой будет [3, 5, 8, 10], и выведет ее в консоль.
Напишите однострочник, который будет подсчитывать количество заглавных букв в файле

В этом однострочнике мы открываем файл ‘filename.txt’ и пробегаемся по всем его строкам и символам в каждой строке.

Для каждого символа, который является заглавной буквой метод isupper() возвращает True, и мы добавляем 1 к счетчику с помощью функции sum(). В конце, num_uppercase будет содержать количество заглавных букв в файле.
Можно ли объявлять функцию внутри другой функции? Где она будет видна?

Да, функции можно объявлять внутри других функций. Такая вложенная функция будет видна и доступна для вызова только внутри родительской функции, в которой она определена.

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

Вложенные функции могут быть полезны, когда нужно реализовать вспомогательную логику, связанную только с работой родительской функции.
Что такое и чем отличается old-style от new-style classes?

— Old-style классы наследуются непосредственно от объекта класса type. New-style классы наследуются от объекта класса object.

— New-style классы поддерживают дополнительные возможности, например descriptors, properties, slots. В old-style классах они не работают.

— В new-style классах метод init вызывается при наследовании, в отличие от old-style классов.

— New-style классы предпочтительны, так как полностью поддерживают особенности ООП. Большинство библиотек требуют именно их.

Рекомендуется использовать new-style классы, унаследованные от object. Они обладают расширенным функционалом и лучше взаимодействуют с другими объектами.
Почему не стоит использовать изменяемые объекты как параметры по-умолчанию?

В Python не рекомендуется использовать изменяемые объекты в качестве значений параметров по умолчанию по следующим причинам:

— Значения по умолчанию вычисляются один раз при определении функции, а не при каждом вызове.

— Если использовать изменяемый объект (список, словарь), то изменения в нем будут сохраняться между вызовами функции. Это может привести к неочевидному поведению и трудноуловимым ошибкам при многократном вызове функции.

В качестве альтернативы можно задавать значение по умолчанию как None, а в теле функции создавать новый изменяемый объект, если значение не передано.
Такой подход позволяет избежать «эффекта переноса» состояния между вызовами и делает код более понятным и предсказуемым.