Top Python Interview Questions Flashcards

(91 cards)

1
Q

Как бы охарактеризовал Python?

A

Python — это высокоуровневый, интерпретируемый (точнее, компилируемый в байт-код с последующим выполнением на PVM), объектно-ориентированный (ООП) и мультипарадигменный язык с динамической типизацией. Его главные особенности — простой, читаемый синтаксис и обширная стандартная библиотека.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Python компилируемый или интерпретируемый?

A

Python часто называют интерпретируемым, но это упрощение. Фактически, исходный код Python сначала компилируется в байт-код (файлы .pyc), а затем этот байт-код выполняется Виртуальной Машиной Python (PVM). Этот процесс похож на Java, что делает его скорее интерпретируемым языком, основанным на байт-коде.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Расскажи о парадигмах в языке Python?

A

Python — мультипарадигменный язык, поддерживающий:

Объектно-ориентированное программирование (ООП): Использование классов, наследования, полиморфизма.

Императивное программирование: Последовательность команд и изменение состояния.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое динамическая типизация?

A

Тип переменной определяется во время выполнения программы и может меняться. Вам не нужно объявлять тип переменной при её создании.

Python

x = 10 # x имеет тип int
x = “текст” # теперь x имеет тип str

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Какие есть типы данных в Python?

A

Основные типы включают: Числа (int, float, complex), Строки (str), Булевы (bool), Списки (list), Кортежи (tuple), Словари (dict), Множества (set).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что может быть ключем в словаре?

A

Ключом в словаре может быть любой неизменяемый (хешируемый) объект.

Можно: int, float, str, tuple (если все его элементы неизменяемы), frozenset.

Нельзя: list, dict, set, так как они изменяемы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что относится к изменяемым типам данных и к неизменяемым?

A

Категория,Изменяемые (Mutable),Неизменяемые (Immutable)
Определение,Можно изменить после создания.,Нельзя изменить после создания.
Примеры,”list, dict, set, пользовательские классы.”,”int, float, str, tuple, frozenset, bytes.”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Как в Python устроен словарь?

A

Словарь реализован как хеш-таблица. Это позволяет хранить пары ключ-значение и обеспечивать поиск по ключу в среднем за константное время ($O(1)$). Порядок ключей сохраняется, начиная с Python 3.7 (формально с 3.6).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое list comprehension?

A

Это краткий синтаксис для создания списков, основанный на итерируемых объектах. Он обеспечивает более читаемый и эффективный (быстрый) способ создания списков по сравнению с обычным циклом for.

Python

Обычный цикл:
squares = []
for i in range(10):
squares.append(i * i)

List comprehension:
squares = [i * i for i in range(10)]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

В чем отличие списка от кортежа?

A

Список (list): Изменяемый тип данных. Используется для хранения однородных коллекций, которые могут меняться.

Кортеж (tuple): Неизменяемый тип данных. Используется для хранения разнородных, постоянных коллекций (например, координат точки). Кортежи немного быстрее и занимают меньше памяти.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Что знаешь про строки в Python?

A

Строки (str) — это неизменяемые последовательности символов Unicode. Поскольку они неизменяемы, любая операция, которая, казалось бы, “меняет” строку (например, s.upper()), на самом деле создает новую строку в памяти.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

В чем разница между decimal и float?

A

float: Число с плавающей запятой, представленное в двоичной системе (IEEE 754). Оно приближенное и не подходит для точных финансовых расчетов.

decimal: Тип из модуля decimal, который хранит числа с десятичной точностью. Используется для точной арифметики (финансы, налоги).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Какие последовательности есть в Python?

A

Основные последовательности: list, tuple, str, range, bytes.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Как устроены переменные в Python?

A

Переменные — это не “ячейки” памяти, а имена (метки), которые ссылаются на объекты в памяти. Когда вы пишете a = 10, имя a просто привязывается к объекту 10.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Как в функцию передаются аргументы, по ссылке или по значению?

A

Python использует механизм, который часто называют “передача по ссылке на объект” (Call by Object Reference).

В функцию передается копия ссылки на объект.

Если объект изменяемый (list, dict), функция может изменить его содержимое.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

В чем разница сравнение через is и “==” ?

A

is: Проверяет идентичность — указывают ли обе переменные на один и тот же объект в памяти (id(a) == id(b)).

==: Проверяет равенство — имеют ли два объекта одинаковое значение (вызывает магический метод __eq__).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое поверхностная копия?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

Что такое глубокая копия?

A

Глубокая копия (copy.deepcopy()) создает новый контейнер и рекурсивно копирует все вложенные объекты. Копия полностью независима от оригинала, даже если в ней есть изменяемые вложенные структуры.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

За счет чего достигается константная величина ячейки памяти?

A

Это связано с неизменяемостью объектов. Неизменяемый объект (например, число или кортеж) не может быть изменен после создания; при “изменении” (например, a = a + 1) всегда создается новый объект. Это позволяет Python безопасно кэшировать и оптимизировать хранение этих объектов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

Что такое итерируемый объект?

A

Объект, который способен вернуть итератор (у него есть метод __iter__()). Это может быть список, кортеж, строка, словарь, а также range и генератор.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

Что такое итератор?

A

Объект, который реализует протокол итератора:

Метод __iter__(): Возвращает сам себя.

Метод __next__(): Возвращает следующий элемент или вызывает StopIteration. Итератор позволяет получать элементы по одному.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
21
Q

Что такое генератор?

A

Специальный, упрощенный вид итератора. Генераторы реализуют стратегию ленивых вычислений (Lazy Evaluation): они генерируют значения по требованию и не хранят всю последовательность в памяти.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
22
Q

Что происходит в момент итерации по списку?

A

Цикл for вызывает iter(список), который возвращает объект-итератор.

На каждой итерации цикл вызывает next(итератор) (т.е. итератор.__next__()).

Итератор возвращает следующий элемент списка и помнит, где остановился.

Когда элементы заканчиваются, итератор вызывает исключение StopIteration, и цикл завершается.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
23
Q

В чем разница между итератором и генератором?

A

Итератор (Iterator) –> Генератор (Generator)

“Общая концепция, механизм обхода.” –> Специальный тип Итератора.

Обычно реализуется как класс с __iter__ и __next__. –> Реализуется как функция с yield или генераторное выражение.

Может хранить данные в памяти. –> “Экономит память, генерирует значения по требованию.”

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
24
Является ли Range итератором?
Нет, range — это итерируемый объект, но не итератор. Он очень эффективен по памяти, потому что хранит только начало, конец и шаг, и генерирует числа по требованию.
25
Какой синтаксис создания генераторов?
Функция-генератор: обычная функция с ключевым словом yield. Генераторное выражение: синтаксис, похожий на list comprehension, но заключенный в круглые скобки: (i*2 for i in my_list).
26
Какие способы есть написать свой генератор?
Определить функцию, использующую ключевое слово yield. Использовать генераторное выражение (например, (x**2 for x in range(5))).
27
Что такое лямбда-функции?
Анонимные функции, созданные с помощью ключевого слова lambda. Они могут содержать только одно выражение, результат которого неявно возвращается. Используются для простых действий, часто в сочетании с map(), filter() или в качестве ключа сортировки.
28
Что такое чистая функция?
Функция, которая: При одних и тех же входных аргументах всегда возвращает один и тот же результат. Не имеет побочных эффектов (не меняет глобальное состояние, не выполняет ввод/вывод, не изменяет входящие изменяемые аргументы).
29
Что такое замыкания?
Замыкание — это функция, которая помнит и имеет доступ к переменным из охватывающей (внешней) области видимости, даже после того, как внешняя функция завершила своё выполнение.
30
Что такое *args?
Синтаксис, позволяющий функции принимать произвольное количество позиционных аргументов. Они собираются внутри функции в кортеж с именем args.
31
Что такое **kwargs?
Синтаксис, позволяющий функции принимать произвольное количество именованных аргументов. Они собираются внутри функции в словарь с именем kwargs.
32
Что такое декораторы?
Функция, которая принимает другую функцию и расширяет её функциональность, не изменяя её исходного кода. Используется синтаксис @имя_декоратора.
33
Как строку можно перевести в байты и обратно?
В байты: string.encode('utf-8') Обратно в строку: bytes_object.decode('utf-8')
34
Что такое декоратор property?
Позволяет методу класса вести себя как атрибут. Используется для создания "вычисляемых" атрибутов или для реализации инкапсуляции (контролируемого доступа) к данным, позволяя выполнять логику при получении, установке или удалении значения.
35
Чем отличаются декораторы classmethod и staticmethod?
@classmethod: Метод класса. Принимает первым аргументом сам класс (cls). Используется для фабричных методов или работы с атрибутами класса. @staticmethod: Статический метод. Не принимает ни self, ни cls. Это обычная функция, логически связанная с классом, но не зависящая от состояния экземпляра или класса.
36
Как можно отправить переменную в декоратор?
Декоратор с аргументами реализуется как функция, которая возвращает функцию-декоратор, которая, в свою очередь, возвращает обернутую функцию. Аргументы передаются во внешнюю функцию. Python def decorator_with_args(arg1): # Здесь принимается переменная def actual_decorator(func): def wrapper(*args, **kwargs): # arg1 используется внутри return func(*args, **kwargs) return wrapper return actual_decorator
37
Зачем нужен wraps?
Декоратор @functools.wraps(func) используется внутри декораторов-оберток. Он сохраняет метаданные оригинальной функции (__name__, __doc__, __module__) на обертке, что критично для отладки и документации.
38
Что такое магические методы? (Dunder-методы)
Специальные методы, начинающиеся и заканчивающиеся двумя подчеркиваниями (например, __init__, __str__, __add__). Они используются для реализации протоколов (интерфейсов) и позволяют классам взаимодействовать со встроенными функциями и операторами Python.
39
Чем __init__ отличается от __new__?
__new__(cls, ...): Создает и возвращает новый экземпляр класса. Вызывается первым. Используется редко. __init__(self, ...): Инициализирует (настраивает) уже созданный экземпляр. Вызывается вторым.
40
Что такое slots?
Специальный атрибут __slots__ в классе, который позволяет явно указать, какие атрибуты может иметь экземпляр. Это отключает создание словаря __dict__ для каждого экземпляра, что экономит память и немного ускоряет доступ к атрибутам.
41
Разница между одинарным и двойным подчеркиванием Python?
_var (Одинарное): Условное соглашение, что это внутренний атрибут/метод, предназначенный для использования только внутри модуля или класса (нет строгого контроля). __var (Двойное): Запускает механизм Name Mangling (искажение имени). Python автоматически переименовывает атрибут в _ИмяКласса__var, чтобы предотвратить случайный доступ или переопределение в подклассах.
42
Что такое MRO?
MRO (Method Resolution Order) — Порядок Разрешения Методов. Это алгоритм, определяющий, в каком порядке Python будет искать метод или атрибут среди базовых классов при множественном наследовании. В Python 3 используется алгоритм C3 MRO.
43
Что такое метаклассы?
Метакласс — это "класс класса". Это то, что создает класс. По умолчанию метаклассом является type. Метаклассы позволяют вам перехватить процесс создания класса и динамически изменить его (добавить или изменить атрибуты/методы) перед тем, как класс будет полностью определен.
44
Какие области видимости есть?
Области видимости проверяются в порядке LEGB: Local (Локальная: внутри текущей функции/метода). Enclosing (Охватывающая: внутри внешней функции, для замыканий). Global (Глобальная: на уровне модуля). Built-in (Встроенная: встроенные имена, такие как len, int).
45
Как в Python происходит поиск переменной по области видимости?
Поиск всегда идет последовательно по правилу LEGB (Local -> Enclosing -> Global -> Built-in). Как только имя найдено в одной из областей, поиск прекращается.
46
Для чего нужно ключевое слово Global?
Используется внутри функции для явного указания, что вы хотите изменить переменную, которая определена в глобальной области видимости модуля, а не создать новую локальную переменную.
47
Почему нельзя делать мутабельные типы дефолтными аргументами?
Потому что значение аргумента по умолчанию создается один раз при определении функции. Если это изменяемый объект (list, dict), и вы меняете его при вызове, это изменение сохранится для всех последующих вызовов функции, что почти всегда приводит к нежелательным побочным эффектам. Правильно: def func(a, my_list=None): if my_list is None: my_list = []
48
Что такое контекстный менеджер?
Объект, который управляет ресурсами (файлами, сетевыми подключениями) с помощью конструкции with. Он гарантирует, что ресурс будет корректно открыт и, что самое важное, закрыт/освобожден (даже если произошла ошибка).
49
Как создать контекстный менеджер?
С помощью Класса: Определить методы __enter__() (инициализация и возврат ресурса) и __exit__() (очистка, обработка исключений). С помощью Генератора: Использовать декоратор @contextlib.contextmanager с функцией-генератором. Код до yield — это __enter__, код после yield — это __exit__.
50
Что такое GIL?
GIL (Global Interpreter Lock) — Глобальная Блокировка Интерпретатора. Механизм в CPython, который гарантирует, что в любой момент времени только один поток Python может выполнять байт-код Python. Ограничивает истинный параллелизм для задач, зависящих от CPU.
51
В чем разница между процессом и потоком?
Процесс (Process) --> Поток (Thread) Независимый. Имеет собственное адресное пространство памяти --> Часть процесса. Разделяет память с другими потоками. Идеален для CPU-задач (обход GIL) --> Идеален для IO-задач (во время ожидания I/O GIL освобождается). Создание и переключение дороже --> Создание и переключение дешевле.
52
Что такое многопоточность/многопроцессорность?
Многопоточность (Threading): Запуск нескольких потоков в одном процессе. Потоки разделяют память. Из-за GIL не дает прироста скорости на CPU-зависимых задачах, но полезна для I/O-задач. Многопроцессорность (Multiprocessing): Запуск нескольких независимых процессов. Каждый процесс имеет собственный интерпретатор и память. Обходит GIL, что идеально подходит для CPU-зависимых задач.
53
Для чего в Python асинхронность?
Для эффективной работы с I/O-связанными задачами (сеть, базы данных, файлы) с использованием одного потока. Вместо блокировки потока в ожидании операции, асинхронный код позволяет потоку переключиться на выполнение другой задачи, пока первая "спит". Используется с синтаксисом async/await.
54
Что такое аннотации типов? / Что можешь сказать про Type Hinting?
Аннотации типов (Type Hinting) — синтаксис (например, def func(a: int) -> str:), который позволяет указывать ожидаемые типы аргументов и возвращаемых значений. Они не влияют на выполнение программы, но используются статическими анализаторами (например, MyPy) для проверки кода, повышения читаемости и упрощения разработки в IDE.
55
Расскажи про иерархию исключений Python?
Все исключения наследуются от BaseException. Большинство "рабочих" исключений наследуются от Exception. Важно: при использовании try...except нужно сначала ловить более специфичные исключения, а затем — более общие, чтобы избежать нежелательных поглощений ошибок.
56
Что такое Pydantic?
Библиотека для валидации данных с использованием аннотаций типов Python. Используется для: Определения схемы данных. Проверки (валидации) входящих данных (например, из JSON). Автоматического преобразования типов.
57
Что такое моржовый оператор?
Моржовый оператор — := (введен в Python 3.8). Он позволяет присваивать значение переменной прямо внутри выражения (например, внутри условия if или цикла while). Python Без моржового оператора data = get_data() if data: process(data) С моржовым оператором if data := get_data(): process(data)
58
Как бы сделал все значения списка уникальными?
Самый питонический и быстрый способ — использовать тип множество (set), так как оно хранит только уникальные элементы, а затем преобразовать обратно в список. Python my_list = [1, 2, 2, 3, 4, 4, 5] unique_list = list(set(my_list)
59
Как создать свой тип исключения?
Создать новый класс, который наследуется от базового класса исключений, обычно от Exception: Python class InsufficientFundsError(Exception): """Собственное исключение для недостатка средств.""" pass
60
Какие коллекции из модуля collections знаешь?
defaultdict: Словарь, который вызывает функцию-фабрику для предоставления значения по умолчанию для несуществующего ключа. Counter: Словарь для удобного подсчета хешируемых объектов. namedtuple: Кортеж с именованными полями. deque: Двусторонняя очередь, оптимизированная для быстрого добавления/удаления с обоих концов.
61
Как в Python можно проверить тип данных?
isinstance(объект, тип): Рекомендуемый способ. Учитывает наследование. isinstance(x, (int, float)) type(объект): Проверяет точный тип. type(x) is list
62
Как бы проверил, изменяемый или нет тип данных?
Самый надежный способ — проверить, является ли объект хешируемым. Хешируемым может быть только неизменяемый объект. Python def is_mutable(obj): try: hash(obj) return False # Хешируемый, значит неизменяемый except TypeError: return True # Не хешируемый, значит изменяемый
63
Как можно итерироваться по листу и вывести id последовательности
Имеется в виду индекс (номер по порядку). Используйте enumerate(): Python my_list = ['a', 'b', 'c'] for index, value in enumerate(my_list): print(f"Индекс {index}: {value}")
64
Как можно проверить, что значение есть в словаре?
Самый питонический и эффективный способ (проверка $O(1)$) — проверить наличие ключа с помощью оператора in:Pythonmy_dict = {'a': 1, 'b': 2} if 'a' in my_dict: print("Ключ есть.")
65
Чем отличается Python от C Sharp?
Ключевые отличия: | Python | C Sharp (C#) | | :--- | :--- | | Динамическая типизация | Статическая типизация (требует объявления типов). | | Интерпретируемый (PVM) | Компилируемый (CLI/CLR). | | Мультипарадигменный | Основная парадигма — Объектно-ориентированная. | | Не зависит от платформ .NET. | Ориентирован на экосистему .NET. |
66
Расскажи про работу Beautiful Soup?
Beautiful Soup — это библиотека для парсинга (разбора) HTML и XML документов. Она принимает документ (строку) и создает дерево объектов Python, по которому можно легко навигировать, искать теги, атрибуты и содержимое с помощью простых методов, похожих на селекторы CSS или XPath.
67
Что такое timezone в Python?
Объект, представляющий информацию о часовом поясе. Для корректной работы со временем и датами в разных регионах необходимо работать с "осведомленными" (aware) datetime-объектами, которые хранят информацию о часовом поясе (обычно используется UTC), а не с "наивными" (naive) объектами.
68
Разница Dict и JSON?
dict — это тип данных Python (объект в памяти). JSON (JavaScript Object Notation) — это текстовый формат обмена данными. Он используется для передачи данных между системами. Для работы с JSON в Python используется модуль json (функции json.dumps() для сериализации и json.loads() для десериализации).
69
Как можно скачать конкретную версию библиотеки через pip?
Указать версию через оператор ==: Bash pip install package_name==1.2.3
70
В чем разница между import foo и from foo import bar?
import foo --> from foo import bar Импортирует весь модуль --> Импортирует только указанный объект (bar) в текущее пространство имен. Доступ: foo.bar() --> Доступ: bar()
71
В чем разница между from foo import bar и from foo import *?
from foo import bar: Явно импортирует только bar. Это рекомендуемый стиль. from foo import *: Импортирует все публичные имена из модуля foo в текущее пространство имен. Это считается плохой практикой, так как может вызвать конфликты имен.
72
Зачем используется as при импорте?
Ключевое слово as используется для переименования импортируемого модуля или объекта: Сокращение длинного имени: import pandas as pd. Избежание конфликтов имен.
73
Когда возникает проблема циклического импорта?
Проблема возникает, когда Модуль А импортирует Модуль Б, а Модуль Б (прямо или косвенно) импортирует Модуль А. Это может привести к ошибкам ImportError, так как один из модулей будет пытаться получить доступ к объекту, который еще не успел загрузиться.
74
Когда выполняется файл __init__.py?
Файл __init__.py (или __init__.py) выполняется при первом импорте пакета (папки, которую он определяет). Он используется для инициализации пакета, например, для определения, какие объекты доступны при импорте.
75
В чем разница между map, filter и list comprehension?
Инструмент --> Назначение --> Особенности map() --> Применяет функцию к каждому элементу итерируемого объекта --> Возвращает итератор (map object). Часто можно заменить List Comprehension. filter() --> "Отбирает элементы, для которых функция-предикат возвращает True." --> Возвращает итератор (filter object). Часто можно заменить List Comprehension. List Comprehension --> "Создает новый список, выполняя преобразование и/или фильтрацию." --> Самый питонический и часто самый быстрый способ. Возвращает готовый список.
76
Что такое zip()?
Функция zip() принимает несколько итерируемых объектов и объединяет их элементы в кортежи попарно. Она возвращает итератор кортежей. Итерация останавливается, когда заканчивается самый короткий из переданных объектов. Python names = ['Alice', 'Bob'] ages = [25, 30] list(zip(names, ages)) # Вывод: [('Alice', 25), ('Bob', 30)]
77
Что такое именованный кортеж (namedtuple)?
collections.namedtuple предоставляет простой способ создания неизменяемых классов с именованными полями. Это облегченная версия класса, которая позволяет обращаться к элементам не только по индексу, но и по имени, как к атрибутам, что повышает читаемость кода, при этом сохраняя эффективность кортежей.
78
Как работает reduce()?
Функция functools.reduce() применяет функцию к элементам итерируемого объекта кумулятивно (накопительно). Она берет первые два элемента, применяет к ним функцию, затем берет результат и следующий элемент, применяет функцию, и так до конца. Используется для получения одного итогового результата (суммы, произведения и т.д.).
79
В чем разница между абстрактным классом и интерфейсом (протоколом)?
Абстрактный класс (модуль abc): Класс, который нельзя инстанциировать (создать объект). Используется для определения общего базового поведения и может содержать как абстрактные методы (обязательные к реализации), так и конкретные методы с логикой. Интерфейс (Протокол - модуль typing в Python 3.8+): В отличие от других языков, Python не имеет строгих интерфейсов. Вместо них используются протоколы или ABC. Они определяют только набор методов, которые должны быть реализованы. Python использует принцип Утиной типизации (если что-то выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка).
80
Что такое полиморфизм в Python?
Полиморфизм — это способность объекта принимать множество форм. В Python это проявляется в двух основных формах: Утиная типизация: Если объекты имеют одинаковый метод (например, len(), __add__), их можно использовать в одном и том же контексте, независимо от их фактического типа. Переопределение методов: Подклассы могут предоставлять свою собственную реализацию метода, унаследованного от базового класса.
81
В чем разница между наследованием и композицией?
Наследование ("is-a"): Подкласс является частным случаем базового класса (например, "Собака является животным"). Используется, когда нужно создать иерархию типов. Композиция ("has-a"): Объект содержит другой объект (например, "Машина имеет двигатель"). Используется, когда нужно собрать функциональность из различных, независимых компонентов. Композиция часто предпочтительнее наследования, так как делает код более гибким.
82
Как работает множественное наследование? Какие у него проблемы?
Множественное наследование позволяет классу наследовать атрибуты и методы от нескольких базовых классов. Проблема (Diamond Problem): Когда класс наследует от двух классов, которые, в свою очередь, наследуют от общего предка. Возникает неоднозначность, какой метод предка использовать. Решение: Python использует алгоритм C3 MRO (Method Resolution Order) для строгого определения порядка поиска методов и предотвращения двусмысленности.
83
Как Python управляет памятью?
Python использует автоматическое управление памятью с помощью двух механизмов: Счетчик ссылок (Reference Counting): Каждый объект хранит счетчик, показывающий, сколько имен на него ссылается. Когда счетчик достигает нуля, объект немедленно удаляется (освобождается память). Сборщик мусора (Garbage Collector): Отвечает за обнаружение и удаление циклических ссылок (например, Объект А ссылается на Б, а Б ссылается на А), которые не могут быть удалены счетчиком ссылок.
84
Почему range() более эффективен, чем создание полного списка?
range() — это итерируемый объект, а не итератор, и он ленив. Он хранит только три значения: начало, конец и шаг. Он генерирует числа только в момент, когда они требуются (при итерации), и не создает в памяти полный список всех чисел. Это делает его невероятно эффективным по памяти для больших диапазонов.
85
В чем разница между __slots__ и __dict__?
__dict__: По умолчанию каждый экземпляр класса хранит свои атрибуты в словаре __dict__. Это гибко, но требует много памяти. __slots__: Если вы определяете __slots__ в классе, Python не создает __dict__ для экземпляров. Атрибуты хранятся в статически выделенной, более компактной структуре. Это экономит память и немного ускоряет доступ к атрибутам, но вы не можете добавлять новые атрибуты "на лету".
86
В чем основное назначение async и await?
async: Используется для определения функции как корутины (coroutine). Корутина — это функция, которая может быть приостановлена (paused) и возобновлена. await: Используется только внутри async функции. Он приостанавливает выполнение корутины в ожидании завершения операции ввода-вывода (I/O), позволяя программе переключиться на выполнение другой задачи.
87
Когда следует использовать threading (потоки), а когда multiprocessing (процессы)?
Сценарий --> Инструмент --> Причина "I/O-зависимые задачи (сеть, файл, БД)" --> threading (Потоки) --> "Во время ожидания I/O-операции GIL освобождается, позволяя другим потокам работать. Эффективно для ожидания." "CPU-зависимые задачи (вычисления, обработка данных)" --> multiprocessing (Процессы) --> "Каждый процесс имеет свой интерпретатор и память, что обходится GIL. Позволяет использовать несколько ядер процессора."
88
Что такое "Утиная типизация" (Duck Typing)?
Это ключевой принцип Python: "Если оно выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка." Вместо проверки типа объекта (type(obj) is list), Python фокусируется на проверке наличия необходимых методов или атрибутов. Если объект имеет метод, который вам нужен, неважно, к какому классу он принадлежит.
89
Что такое EAFP и LBYL?
Это два стиля кодирования: EAFP (Easier to Ask Forgiveness than Permission): Проще просить прощения, чем разрешения. Подразумевает, что вы сразу пробуете выполнить операцию и обрабатываете ошибку, если она возникает (try...except). Это предпочтительный стиль в Python. LBYL (Look Before You Leap): Смотри, прежде чем прыгнуть. Подразумевает, что вы сначала проверяете условие, а затем выполняете операцию (if...in, if hasattr(...)).
90