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

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

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

Для обратной связи: @proglibrary_feeedback_bot
加入频道
🐍💼 Подготовка к собеседованию по 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, а в теле функции создавать новый изменяемый объект, если значение не передано.
Такой подход позволяет избежать «эффекта переноса» состояния между вызовами и делает код более понятным и предсказуемым.
Что такое замыкание?

Замыкание (closure) — это функция, которая запоминает значения переменных из области видимости, в которой она была создана, и может получить к ним доступ, даже если она будет вызвана за пределами этой области видимости.

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

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

В Python замыкания реализуются элегантно и просто с помощью вложенных функций. Это мощный механизм, позволяющий писать короткий и чистый код.
Как объединить два списка в список кортежей?

Для объединения в список кортежей можно использовать функцию zip, причем не только двух, но трех и более списков.
В чем отличие @foobar от @foobar()?

@foobar и @foobar() — это разные способы применения декораторов.

@foobar применяет декоратор без аргументов, а @foobar() применяет декоратор с аргументами.
То есть @foobar() вызывает декоратор foobar, передавая ему аргументы, а затем результат (декорированная функция) применяется к функции.
Узнаем, сколько всего определенных букв в строке

Один из способов узнать количество определенных букв в строке максимально быстрым методом — использовать метод count для строки. Этот метод принимает символ или подстроку и возвращает количество их вхождений в строку.

Этот метод является достаточно быстрым, так как использует внутренние оптимизации CPython, которые работают на низком уровне. Он также не требует дополнительной памяти, за исключением простой переменной, используемой для хранения результата.
Что такое каррирование?

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

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

Каррирование часто используется в функциональном программировании для создания более гибких и переиспользуемых функций.
Оно помогает избежать дублирования кода и упростить работу с функциями высшего порядка.
Напишите функцию, которая будет принимать список nums, содержащий числа в диапазоне от 1 до 100, и возвращать отсортированный список чисел, которые в списке nums встречались дважды.

Примеры:

duplicate_nums([1, 2, 3, 4, 3, 5, 6])
➞ [3]

duplicate_nums([81, 72, 43, 72, 81, 99, 99, 100, 12, 54])
➞ [72, 81, 99]

duplicate_nums([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
➞ None

Примечания:
— никакое число не будет встречаться в nums трижды и более раз,
— если никакое число в nums не встречалось дважды, функция должна вернуть None.
Что такое dict comprehension?

Dict comprehension — это способ конструирования словарей в одну строку, аналогичный list comprehension.

Синтаксис dict comprehension: {ключ: значение for элемент in итерируемый_объект if условие}

Основные преимущества dict comprehension:
— Краткость и читабельность по сравнению с обычным циклом.
— Более высокая производительность за счет оптимизации.
— Удобство создания словарей «на лету» по данным.

Dict comprehension используется для:
— Преобразования данных из одного вида в другой.
— Создания словарей на основе списков или других итерируемых объектов.
— Фильтрации и обработки данных в процессе создания словаря.