1. Главные особенности Python в отличие от других языков (например, Java, C#)?
Краткий ответ: Python — это интерпретируемый язык с динамической типизацией.
Более подробно: В отличие от Java и C#, Python не требует предварительной компиляции, так как является интерпретируемым языком. Также Python использует динамическую типизацию: тип переменной определяется во время выполнения программы, а не на этапе компиляции. Это делает его более гибким, но может снижать производительность по сравнению с языками со статической типизацией.
2. В каком порядке вызываются фикстуры?
Краткий ответ: Фикстуры с более широким скоупом вызываются раньше.
Более подробно: Фикстуры с большими скоупами (например, session) выполняются раньше фикстур с меньшими скоупами (например, function). Если нужно контролировать порядок вызова, можно передавать одну фикстуру в другую, но важно следить за тем, чтобы скоуп более поздней фикстуры не был меньше, чем у передаваемой.
3. В чем разница между list, tuple, set?
Краткий ответ: list — упорядоченный, изменяемый; tuple — упорядоченный, неизменяемый; set — неупорядоченный, изменяемый, уникальные элементы.
Более подробно:
list: поддерживает индексацию, элементы можно изменять (добавлять, удалять, заменять).
tuple: поддерживает индексацию, но элементы неизменяемы после создания.
set: неупорядоченная коллекция, которая не допускает дублирующихся элементов и не поддерживает индексацию.
4. Виды сортировки в python
Краткий ответ:
Встроенные:
- sorted() — возвращает новый отсортированный список.
- list.sort() — сортирует список на месте.
Можно реализовать пользовательские алгоритмы сортировки (просто пример, можно и другие):
- Пузырьком (Bubble Sort)
- Вставками (Insertion Sort)
- Слиянием (Merge Sort)
- Быстрая сортировка (Quick Sort)
Сортировки от библиотек:
- numpy.sort()
- pandas.DataFrame.sort_values()
Более подробно про пользовательские алгоритмы сортировки можно прочитать здесь.
5. Изменится ли содержимое кортежа после tpl[3].append(4)?
Краткий ответ: Да, изменится.
Более подробно:
Кортежи сами по себе неизменяемы, но если внутри кортежа есть изменяемый объект (например, список), то его содержимое можно изменить. В данном случае tpl[3] — это список, и операция append() изменяет его содержимое.
6. Знаете ли какие-нибудь встроенные в Python декораторы?
Краткий ответ: @staticmethod, @classmethod, @lru_cache, @dataclass.
Более подробно:
@staticmethod используется для объявления статического метода в классе. Статические методы не привязаны к экземпляру класса и не требуют передачи аргумента self (или cls). Они работают как обычные функции, но принадлежат пространству имен класса.
Особенности:
- Статический метод может быть вызван как на классе, так и на экземпляре класса.
- Не может взаимодействовать с экземпляром класса через self и не имеет доступа к атрибутам класса через cls.
@classmethod объявляет метод класса, который принимает класс как первый аргумент, обычно называемый cls. Такие методы могут взаимодействовать с атрибутами и методами класса, но не с конкретным экземпляром.
Особенности:
- Метод класса всегда получает первым аргументом сам класс (cls).
- Может изменять атрибуты класса или вызывать другие методы класса.
- Полезен при работе с фабричными методами или при необходимости изменения состояния класса.
@lru_cache — это декоратор из модуля functools, который используется для мемоизации (кэширования) результатов функции. Это означает, что если функция вызывается с теми же аргументами несколько раз, результат берется из кэша, а не вычисляется повторно. "LRU" означает "Least Recently Used" (наименее недавно использованный) — это механизм, который автоматически очищает кэш, если он превышает заданный лимит.
Особенности:
- maxsize определяет максимальное количество записей в кэше. Когда лимит превышен, удаляются наименее используемые записи.
- Это полезно для функций, результаты которых часто повторяются при одинаковых входных данных, например, вычисление чисел Фибоначчи.
- Улучшает производительность за счет повторного использования ранее вычисленных значений.
@dataclass — это декоратор из модуля dataclasses, который автоматически генерирует для класса методы, такие как __init__, __repr__, __eq__, и другие, на основе объявленных атрибутов. Это значительно упрощает создание классов для хранения данных.
Особенности:
- Генерирует методы __init__, __repr__, __eq__, и другие автоматически.
- Позволяет сосредоточиться на описании структуры данных, а не на ручном написании типичных методов.
- Может быть настроен через параметры декоратора: например, можно указать, нужно ли генерировать метод __eq__ или __repr__.
7. Как пройтись по всем парам ключ-значение в словаре?
Краткий ответ: Использовать цикл for key, value in dct.items().
Более подробно: Метод items() возвращает итерируемый объект, который содержит пары "ключ-значение" словаря. В цикле for можно удобно работать с этими парами.
8. Какие типы данных вы знаете?
Краткий ответ: None, bool, int, float, complex, list, tuple, str, bytes, bytearray, memoryview, set, frozenset, dict.
Более подробно: Python поддерживает множество типов данных, включая примитивные (например, int, float, bool) и сложные структуры данных (например, списки list, множества set, словари dict).
9. Какие типы скоупов фикстур существуют?
Краткий ответ: function, class, module, package, session.
Более подробно:
function: фикстура создаётся и уничтожается для каждого теста.
class: фикстура создаётся для каждого класса тестов.
module: фикстура создаётся для каждого модуля (файла с тестами).
package: фикстура создаётся для каждого пакета.
session: фикстура создаётся один раз на всю сессию тестирования.
10. Какой фикстурой можно прогнать тест несколько раз на разных данных?
Краткий ответ: @pytest.mark.parametrize.
Более подробно: Декоратор @pytest.mark.parametrize позволяет запускать тесты с разными наборами данных, передавая значения в параметры теста.
11. Что такое класс?
Краткий ответ: Класс — это шаблон для создания объектов.
Более подробно: Класс определяет свойства и методы, которые могут иметь его экземпляры (объекты). Класс задает структуру и поведение объектов, которые будут создаваться на его основе.
12. Что такое композиция?
Краткий ответ: Композиция — это когда один класс содержит объект другого класса.
Более подробно: Композиция выражает отношение "имеет" (например, машина имеет двигатель). Это позволяет разделять ответственность между классами и использовать объекты других классов как компоненты в более сложных объектах.
13. Основные функции по работе с JSON в Python?
Краткий ответ: Запись с помощью dump() и dumps(), чтение с помощью load() и loads().
Более подробно:
dump(): записывает объект в JSON-файл.
dumps(): преобразует объект в строку в формате JSON.
load(): считывает данные из JSON-файла и преобразует их в Python-объект.
loads(): преобразует строку в формате JSON в Python-объект.
14. Что такое объект?
Краткий ответ: Объект — это экземпляр класса.
Более подробно: Объект — это конкретная реализация класса, которая имеет свои собственные значения полей (атрибутов) и может выполнять методы, определённые в классе.
15. Определение ООП
Краткий ответ: Программирование на основе взаимодействия объектов.
Более подробно: ООП (Объектно-ориентированное программирование) — это парадигма программирования, где программа состоит из объектов, которые взаимодействуют между собой. Объекты — это экземпляры классов, а классы могут образовывать иерархию через наследование.
16. Что такое поля и методы?
Краткий ответ: Поля — это свойства объекта, методы — его функции.
Более подробно:
Поле: хранит данные объекта.
Метод: функция, определённая в классе, которая позволяет объекту выполнять действия или изменять свои данные.
17. Принципы ООП
Краткий ответ: Абстракция, инкапсуляция, наследование, полиморфизм.
Более подробно:
Абстракция: выделение ключевых характеристик объекта, игнорируя несущественные детали.
Инкапсуляция: скрытие внутренней реализации объекта и предоставление доступа только через интерфейс.
Наследование: создание нового класса на основе существующего с возможностью дополнения/изменения поведения.
Полиморфизм: способность объектов разных классов реагировать на одно и то же сообщение по-разному.
Еще более подробно в статье: Принципы ООП
18. Циклы (for, while, do-while)
Краткий ответ: Управляют выполнением кода через итерации.
Более подробно:
for: выполняет код для всех элементов итерируемого объекта (например, списка).
while: выполняет код, пока условие истинно.
do-while: отсутствует в Python, но аналог можно создать с помощью while и дополнительных проверок.
19. Чем отличаются генераторы от итераторов?
Краткий ответ: Генератор отложенно создаёт значения, итератор обходит элементы.
Более подробно:
Итератор — это объект, который реализует интерфейс итерации. В Python он должен реализовать два метода:
- __iter__() — возвращает сам итератор.
- __next__() — возвращает следующий элемент последовательности или вызывает исключение StopIteration, если элементы закончились.
Пример создания собственного итератора:
Генераторы — это специальные функции, которые позволяют "лениво" возвращать элементы по одному за раз, вместо того чтобы возвращать все элементы сразу. Это полезно для работы с большими данными, когда хранение всех элементов в памяти может быть неэффективным или невозможным.
Генераторы создаются с помощью ключевого слова yield. Отличие от обычной функции в том, что генератор сохраняет своё состояние после каждого вызова yield, что позволяет продолжить выполнение функции с того места, где она была прервана.
Пример:
Преимущества использования генераторов:
- Экономия памяти: Генераторы не создают полный список в памяти, а возвращают элементы по одному.
- Ленивое выполнение: Генераторы не выполняют всю работу сразу, а только когда это необходимо.
- Читаемость кода: Генераторы могут сделать ваш код более понятным и выразительным при работе с последовательностями.
20. Чем отличаются изменяемые и неизменяемые данные?
Краткий ответ: Изменяемые данные можно модифицировать после создания, неизменяемые — нет.
Более подробно:
Изменяемые: объекты, такие как списки (list), множества (set) и словари (dict), которые можно изменять (добавлять, удалять элементы).
Неизменяемые: объекты, такие как строки (str), целые числа (int), кортежи (tuple), которые нельзя изменить после создания. Если вы пытаетесь изменить такие объекты, создаётся новый объект.
Важно отметить, что в Python всё является объектом, включая целые числа и строки (это примечание для тех кто пришел из Java например).
21. Что такое *args и **kwargs?
Краткий ответ: *args передаёт произвольное количество аргументов, **kwargs — произвольное количество именованных аргументов.
Более подробно:
*args: позволяет передать в функцию произвольное количество позиционных аргументов как кортеж.
Пример использования *args:
**kwargs: позволяет передать произвольное количество именованных аргументов в виде словаря.
Пример использования **kwargs:
22. Что такое hooks в pytest?
Краткий ответ: Это специальные методы для изменения поведения pytest.
Более подробно: Hooks (хуки) позволяют разработчикам изменять и расширять стандартное поведение pytest (например, поведение при запуске тестов, обработке исключений). Это мощный инструмент для создания плагинов и расширений.
23. Что такое lambda в Python?
Краткий ответ: Анонимная функция в одну строку.
Более подробно:
Lambda-функция — это небольшая анонимная функция, которая может содержать только одно выражение и не имеет имени. Она часто используется для кратких операций, которые не требуют создания полноценной функции.
Пример lambda функции:
24. Что такое декоратор?
Краткий ответ: Обёртка над функцией, изменяющая её поведение без изменения исходного кода.
Более подробно:
Декоратор — это функция, которая принимает другую функцию и возвращает новую функцию с изменённым поведением. Это позволяет модифицировать функциональность без изменения исходного кода, например, добавляя логирование, кэширование или контроль доступа.
Пример декоратора:
Что происходит в коде:
- Мы определяем декоратор my_decorator, который принимает функцию в качестве аргумента (func), а внутри создается функция wrapper, которая оборачивает вызов оригинальной функции.
- Декоратор добавляет поведение перед и после вызова функции say_hello.
- Когда используется синтаксис @my_decorator, это эквивалентно вызову say_hello = my_decorator(say_hello).
- Когда вызывается say_hello(), сначала выполняется код декоратора, затем вызывается исходная функция, и потом выполняется код после неё.
25. Что такое контекстный менеджер в Python?
Краткий ответ: Управляет ресурсами через конструкцию with.
Более подробно:
Контекстный менеджер управляет ресурсами (например, файлами, подключениями) и гарантирует их корректное освобождение (например, закрытие). Конструкция with упрощает работу с такими ресурсами, автоматически вызывая методы для захвата и освобождения.
Пример:
В этом примере:
- Метод __enter__ открывает файл и возвращает его.
- Метод __exit__ автоматически закрывает файл, даже в случае возникновения исключений.
Пример 2: Контекстный менеджер с помощью декоратора contextlib
Здесь:
- Блок перед yield выполняется при входе в контекст.
- Блок после yield выполняется при выходе из контекста, даже если возникло исключение.
Оба примера демонстрируют одно и то же поведение: открытие и автоматическое закрытие файла после завершения работы с ним.
26. Что такое линтер (linter)?
Краткий ответ: Программа для проверки кода на соответствие стилю и правилам.
Более подробно:
Линтер проверяет код на различные ошибки, нарушения стиля и потенциальные проблемы (например, неиспользуемые переменные, лишние скобки и т.д.). Линтеры помогают сделать код более чистым, единообразным и безопасным. В Python популярны такие линтеры, как flake8 и pylint.
Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?
Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика
Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.
Обязательно прочитайте: Что должен знать и уметь тестировщик
Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам