200 вопросов по Python
200 вопросов по Python
Основы Python
Вопрос
Что такое Python?
Ответ
Python — это высокоуровневый интерпретируемый язык программирования общего назначения с динамической типизацией и автоматическим управлением памятью. Он поддерживает объектно-ориентированное, процедурное и функциональное программирование.
Вопрос
Как запустить скрипт на Python из командной строки?
Ответ
Скрипт запускается командой python имя_файла.py или python3 имя_файла.py, если в системе установлено несколько версий Python.
Вопрос
Что такое PEP 8?
Ответ
PEP 8 — это официальное руководство по стилю написания кода на Python. Оно определяет соглашения по отступам, именованию переменных, длине строк, пробелам и другим аспектам оформления кода.
Вопрос
Какой символ используется для однострочного комментария в Python?
Ответ
Символ # используется для однострочного комментария. Всё, что следует после него в той же строке, игнорируется интерпретатором.
Вопрос
Как создать многострочный комментарий в Python?
Ответ
Python не имеет специального синтаксиса для многострочных комментариев. Для этой цели используются многострочные строки в тройных кавычках (''' или """), которые не присваиваются переменным и игнорируются при выполнении.
Вопрос
Что такое переменная в Python?
Ответ
Переменная в Python — это имя, связанное со значением в памяти. Присваивание создаёт ссылку на объект, а не копирует его.
Вопрос
Как объявить переменную в Python?
Ответ
Переменная объявляется присваиванием значения:
x = 42
Вопрос
Можно ли изменить тип переменной после её создания?
Ответ
Да, переменная может ссылаться на объекты разных типов в разные моменты времени, так как Python использует динамическую типизацию.
Вопрос
Какие основные числовые типы данных есть в Python?
Ответ
Основные числовые типы: int (целые числа), float (числа с плавающей точкой) и complex (комплексные числа).
Вопрос
Что такое None в Python?
Ответ
None — это специальный объект, представляющий отсутствие значения. Это единственный экземпляр типа NoneType.
Вопрос
Как проверить тип переменной?
Ответ
Тип переменной проверяется с помощью функции type():
x = 5
print(type(x)) # <class 'int'>
Вопрос
Как проверить, принадлежит ли объект определённому типу?
Ответ
Используется функция isinstance():
x = 5
print(isinstance(x, int)) # True
Вопрос
Что такое иммутабельность?
Ответ
Иммутабельность — это свойство объекта, при котором его значение нельзя изменить после создания. Примеры иммутабельных типов: int, float, str, tuple.
Вопрос
Какие встроенные типы данных в Python являются иммутабельными?
Ответ
Иммутабельные типы: int, float, complex, bool, str, bytes, tuple, frozenset.
Вопрос
Какие встроенные типы данных в Python являются мутабельными?
Ответ
Мутабельные типы: list, dict, set, bytearray.
Вопрос
Что такое строка в Python?
Ответ
Строка — это упорядоченная последовательность символов, заключённая в одинарные, двойные или тройные кавычки. Строки иммутабельны.
Вопрос
Как объединить две строки?
Ответ
Строки объединяются с помощью оператора +:
s = "Hello" + " " + "World"
Вопрос
Как повторить строку несколько раз?
Ответ
Строка повторяется с помощью оператора *:
s = "Ha" * 3 # "HaHaHa"
Вопрос
Как получить длину строки?
Ответ
Длина строки получается с помощью функции len():
len("Python") # 6
Вопрос
Как получить символ по индексу в строке?
Ответ
Символ по индексу получается с помощью квадратных скобок:
s = "Python"
print(s[0]) # 'P'
Вопрос
Поддерживают ли строки в Python отрицательную индексацию?
Ответ
Да, отрицательные индексы отсчитываются с конца строки: -1 — последний символ, -2 — предпоследний и так далее.
Вопрос
Что делает срез строки s[1:4]?
Ответ
Срез s[1:4] возвращает подстроку, начиная с индекса 1 (включительно) и до индекса 4 (исключительно).
Вопрос
Как преобразовать число в строку?
Ответ
Число преобразуется в строку с помощью функции str():
str(42) # "42"
Вопрос
Как преобразовать строку в целое число?
Ответ
Строка преобразуется в целое число с помощью функции int():
int("42") # 42
Вопрос
Что произойдёт при попытке преобразовать строку "abc" в число с помощью int()?
Ответ
Будет выброшено исключение ValueError, так как строка не представляет корректное числовое значение.
Вопрос
Что такое f-строки?
Ответ
F-строки — это строковые литералы с префиксом f или F, позволяющие встраивать выражения внутри фигурных скобок:
name = "Alice"
greeting = f"Hello, {name}!"
Вопрос
Как сравнить две строки на равенство?
Ответ
Строки сравниваются с помощью оператора ==:
"hello" == "hello" # True
Вопрос
Чувствительны ли строки к регистру при сравнении?
Ответ
Да, строки чувствительны к регистру: "Hello" == "hello" возвращает False.
Вопрос
Как привести строку к нижнему регистру?
Ответ
Используется метод .lower():
"HELLO".lower() # "hello"
Вопрос
Как проверить, начинается ли строка с определённой подстроки?
Ответ
Используется метод .startswith():
"Python".startswith("Py") # True
Вопрос
Что такое список в Python?
Ответ
Список — это упорядоченная мутабельная коллекция элементов, которая может содержать объекты разных типов. Элементы списка доступны по индексу.
Вопрос
Как создать пустой список?
Ответ
Пустой список создаётся так:
lst = []
# или
lst = list()
Вопрос
Как добавить элемент в конец списка?
Ответ
Элемент добавляется с помощью метода .append():
lst = [1, 2]
lst.append(3) # [1, 2, 3]
Вопрос
Как удалить элемент из списка по значению?
Ответ
Элемент удаляется по значению с помощью метода .remove():
lst = [1, 2, 3]
lst.remove(2) # [1, 3]
Вопрос
Что делает метод .pop() у списка?
Ответ
Метод .pop() удаляет и возвращает элемент по указанному индексу (по умолчанию — последний):
lst = [1, 2, 3]
x = lst.pop() # x = 3, lst = [1, 2]
Вопрос
Как получить длину списка?
Ответ
Длина списка получается с помощью функции len():
len([1, 2, 3]) # 3
Вопрос
Поддерживают ли списки отрицательную индексацию?
Ответ
Да, списки поддерживают отрицательную индексацию, как и строки.
Вопрос
Что такое срез списка?
Ответ
Срез списка — это новый список, содержащий подмножество элементов исходного списка, заданное диапазоном индексов:
[0, 1, 2, 3][1:3] # [1, 2]
Вопрос
Можно ли изменить элемент списка по индексу?
Ответ
Да, списки мутабельны, поэтому элемент можно изменить по индексу:
lst = [1, 2, 3]
lst[0] = 10 # [10, 2, 3]
Вопрос
Как объединить два списка?
Ответ
Списки объединяются с помощью оператора +:
[1, 2] + [3, 4] # [1, 2, 3, 4]
Вопрос
Как повторить список несколько раз?
Ответ
Список повторяется с помощью оператора *:
[1, 2] * 3 # [1, 2, 1, 2, 1, 2]
Вопрос
Что такое кортеж (tuple)?
Ответ
Кортеж — это упорядоченная иммутабельная коллекция элементов, которая может содержать объекты разных типов.
Вопрос
Как создать кортеж с одним элементом?
Ответ
Кортеж с одним элементом создаётся с запятой после значения:
t = (42,)
Вопрос
Можно ли изменить элемент кортежа после создания?
Ответ
Нет, кортежи иммутабельны, и их элементы нельзя изменить после создания.
Вопрос
Зачем использовать кортеж вместо списка?
Ответ
Кортежи используются, когда данные не должны изменяться, например, для ключей в словарях или для представления фиксированных структур.
Вопрос
Что такое множество (set)?
Ответ
Множество — это неупорядоченная коллекция уникальных хэшируемых объектов. Множества поддерживают операции теории множеств.
Вопрос
Как создать пустое множество?
Ответ
Пустое множество создаётся с помощью set(). Запись {} создаёт пустой словарь, а не множество.
Вопрос
Как добавить элемент в множество?
Ответ
Элемент добавляется с помощью метода .add():
s = set()
s.add(1)
Вопрос
Как проверить, содержит ли множество определённый элемент?
Ответ
Проверка выполняется с помощью оператора in:
1 in {1, 2, 3} # True
Вопрос
Что такое словарь (dict)?
Ответ
Словарь — это неупорядоченная (до Python 3.7) коллекция пар «ключ-значение», где ключи уникальны и хэшируемы, а значения могут быть любого типа.
Вопрос
Как создать пустой словарь?
Ответ
Пустой словарь создаётся так:
d = {}
# или
d = dict()
Вопрос
Как получить значение по ключу в словаре?
Ответ
Значение получается с помощью квадратных скобок:
d = {"a": 1}
value = d["a"] # 1
Вопрос
Что произойдёт при обращении к несуществующему ключу в словаре?
Ответ
Будет выброшено исключение KeyError.
Вопрос
Как безопасно получить значение по ключу, если ключ может отсутствовать?
Ответ
Используется метод .get():
d = {"a": 1}
value = d.get("b", 0) # 0
Вопрос
Как добавить или обновить пару «ключ-значение» в словаре?
Ответ
Присваивание по ключу добавляет новую пару или обновляет существующую:
d = {}
d["key"] = "value"
Вопрос
Как удалить элемент из словаря по ключу?
Ответ
Элемент удаляется с помощью оператора del или метода .pop():
d = {"a": 1}
del d["a"]
# или
d.pop("a")
Вопрос
Как получить все ключи словаря?
Ответ
Все ключи получаются с помощью метода .keys():
{"a": 1, "b": 2}.keys() # dict_keys(['a', 'b'])
Вопрос
Как перебрать все пары «ключ-значение» в словаре?
Ответ
Используется метод .items():
for key, value in d.items():
print(key, value)
Вопрос
Что такое функция в Python?
Ответ
Функция — это именованный блок кода, который выполняет определённую задачу и может принимать аргументы и возвращать значение.
Вопрос
Как определить функцию?
Ответ
Функция определяется с помощью ключевого слова def:
def greet():
return "Hello"
Вопрос
Как передать аргументы в функцию?
Ответ
Аргументы указываются в скобках при определении функции:
def add(a, b):
return a + b
Вопрос
Что делает ключевое слово return?
Ответ
Ключевое слово return завершает выполнение функции и возвращает указанное значение вызывающему коду.
Вопрос
Что возвращает функция, если в ней нет return?
Ответ
Функция возвращает None, если явный return отсутствует.
Вопрос
Что такое параметр по умолчанию?
Ответ
Параметр по умолчанию — это значение, которое используется, если аргумент не был передан при вызове функции:
def greet(name="Guest"):
return f"Hello, {name}"
Вопрос
Можно ли передавать переменное количество аргументов в функцию?
Ответ
Да, с помощью *args для позиционных аргументов и **kwargs для именованных:
def func(*args, **kwargs):
pass
Вопрос
Что такое локальная переменная?
Ответ
Локальная переменная — это переменная, определённая внутри функции и доступная только в её теле.
Вопрос
Что такое глобальная переменная?
Ответ
Глобальная переменная — это переменная, определённая на уровне модуля и доступная из любой функции в этом модуле.
Вопрос
Как изменить глобальную переменную внутри функции?
Ответ
Для изменения глобальной переменной внутри функции используется ключевое слово global:
x = 0
def f():
global x
x = 1
Вопрос
Что такое область видимости (scope)?
Ответ
Область видимости определяет, где в коде переменная доступна. Python использует правило LEGB: Local, Enclosing, Global, Built-in.
Вопрос
Что такое замыкание (closure)?
Ответ
Замыкание — это функция, которая запоминает значения переменных из окружающей области видимости, даже после завершения выполнения внешней функции.
Вопрос
Что такое декоратор?
Ответ
Декоратор — это функция, которая принимает другую функцию и расширяет её поведение без изменения кода.
Вопрос
Как применить декоратор к функции?
Ответ
Декоратор применяется с помощью символа @ над определением функции:
@decorator
def func():
pass
Вопрос
Что такое генератор?
Ответ
Генератор — это функция, которая возвращает итератор с помощью ключевого слова yield. Она генерирует значения по запросу, а не сразу все.
Вопрос
Что делает ключевое слово yield?
Ответ
Ключевое слово yield приостанавливает выполнение функции и возвращает значение вызывающему коду. При следующем вызове функция возобновляется с места остановки.
Вопрос
Как создать генераторное выражение?
Ответ
Генераторное выражение создаётся в круглых скобках:
gen = (x**2 for x in range(5))
Вопрос
Чем генератор отличается от списка?
Ответ
Генератор вычисляет значения по мере необходимости и потребляет меньше памяти, тогда как список хранит все значения сразу.
Вопрос
Что такое итератор?
Ответ
Итератор — это объект, который реализует методы __iter__() и __next__(), позволяя перебирать последовательность значений.
Вопрос
Что такое итерируемый объект?
Ответ
Итерируемый объект — это объект, который может возвращать итератор, например, через вызов iter(). Примеры: списки, строки, кортежи.
Вопрос
Как проверить, является ли объект итерируемым?
Ответ
Объект является итерируемым, если у него есть метод __iter__(). Практически проверяется с помощью iter(obj) или модуля collections.abc.
Вопрос
Что такое контекстный менеджер?
Ответ
Контекстный менеджер — это объект, который определяет поведение блока кода при входе и выходе из него, обычно с помощью оператора with.
Вопрос
Как создать контекстный менеджер?
Ответ
Контекстный менеджер создаётся путём реализации методов __enter__() и __exit__() или с помощью декоратора contextlib.contextmanager.
Вопрос
Что делает оператор with?
Ответ
Оператор with обеспечивает корректное управление ресурсами, автоматически вызывая методы входа и выхода контекстного менеджера.
Вопрос
Как открыть файл для чтения?
Ответ
Файл открывается с помощью функции open() в режиме 'r':
with open('file.txt', 'r') as f:
content = f.read()
Вопрос
Как обрабатывать исключения в Python?
Ответ
Исключения обрабатываются с помощью блока try...except:
try:
risky_code()
except ValueError:
handle_error()
Вопрос
Какие базовые классы исключений есть в Python?
Ответ
Базовый класс всех исключений — BaseException. Большинство пользовательских исключений наследуются от Exception.
Вопрос
Что делает блок finally?
Ответ
Блок finally выполняется всегда, независимо от того, было ли исключение или нет. Он используется для освобождения ресурсов.
Вопрос
Как выбросить исключение вручную?
Ответ
Исключение выбрасывается с помощью ключевого слова raise:
raise ValueError("Invalid value")
Вопрос
Что такое пользовательское исключение?
Ответ
Пользовательское исключение — это класс, наследуемый от Exception или его подклассов:
class MyError(Exception):
pass
Вопрос
Что такое модуль в Python?
Ответ
Модуль — это файл с расширением .py, содержащий определения функций, классов и переменных.
Вопрос
Как импортировать модуль?
Ответ
Модуль импортируется с помощью ключевого слова import:
import math
Вопрос
Как импортировать конкретную функцию из модуля?
Ответ
Функция импортируется с помощью from ... import ...:
from math import sqrt
Вопрос
Что такое пакет?
Ответ
Пакет — это каталог, содержащий файл __init__.py (в Python 3.3+ он может отсутствовать) и один или несколько модулей.
Вопрос
Как импортировать модуль из пакета?
Ответ
Модуль импортируется с указанием пути через точки:
from package.subpackage import module
Объектно-ориентированное программирование
Вопрос
Что такое класс в Python?
Ответ
Класс — это шаблон для создания объектов. Он определяет атрибуты и методы, которыми будут обладать экземпляры этого класса.
Вопрос
Как создать класс в Python?
Ответ
Класс создаётся с помощью ключевого слова class:
class MyClass:
pass
Вопрос
Что такое экземпляр класса?
Ответ
Экземпляр класса — это объект, созданный на основе класса. Каждый экземпляр имеет собственное состояние, но разделяет поведение, определённое в классе.
Вопрос
Как создать экземпляр класса?
Ответ
Экземпляр создаётся вызовом класса как функции:
obj = MyClass()
Вопрос
Что такое метод экземпляра?
Ответ
Метод экземпляра — это функция, определённая внутри класса и принимающая self в качестве первого параметра. Он оперирует данными конкретного экземпляра.
Вопрос
Что такое конструктор в Python?
Ответ
Конструктор — это специальный метод __init__, который вызывается при создании нового экземпляра класса и используется для инициализации его атрибутов.
Вопрос
Приведите пример конструктора.
Ответ
class Person:
def __init__(self, name):
self.name = name
Вопрос
Что такое атрибут класса?
Ответ
Атрибут класса — это переменная, определённая непосредственно в теле класса. Она общая для всех экземпляров этого класса.
Вопрос
Чем атрибут класса отличается от атрибута экземпляра?
Ответ
Атрибут класса принадлежит самому классу и разделяется между всеми экземплярами. Атрибут экземпляра принадлежит конкретному объекту и может отличаться у разных экземпляров.
Вопрос
Что такое наследование в Python?
Ответ
Наследование — это механизм, позволяющий одному классу (дочернему) унаследовать атрибуты и методы другого класса (родительского).
Вопрос
Как реализовать наследование?
Ответ
Дочерний класс указывает родительский в скобках после своего имени:
class Child(Parent):
pass
Вопрос
Что такое переопределение метода?
Ответ
Переопределение метода — это создание в дочернем классе метода с тем же именем, что и в родительском, чтобы изменить его поведение.
Вопрос
Как вызвать метод родительского класса из дочернего?
Ответ
Используется функция super():
class Child(Parent):
def method(self):
super().method()
Вопрос
Что такое полиморфизм?
Ответ
Полиморфизм — это возможность объектов разных классов обрабатываться одинаково через общий интерфейс, например, через одинаковые имена методов.
Вопрос
Поддерживает ли Python множественное наследование?
Ответ
Да, Python поддерживает множественное наследование: класс может наследовать от нескольких родительских классов.
Вопрос
Что такое MRO (Method Resolution Order)?
Ответ
MRO — это порядок, в котором Python ищет методы при множественном наследовании. Он следует алгоритму C3-линеаризации.
Вопрос
Как узнать MRO класса?
Ответ
Используется атрибут __mro__ или метод mro():
print(MyClass.__mro__)
Вопрос
Что такое инкапсуляция в Python?
Ответ
Инкапсуляция — это принцип сокрытия внутренней реализации объекта и предоставления только необходимого интерфейса. В Python она достигается соглашениями об именовании.
Вопрос
Как обозначить приватный атрибут в Python?
Ответ
Приватный атрибут обозначается двумя подчёркиваниями в начале имени: __private_attr. Python выполняет name mangling, изменяя имя на _ClassName__private_attr.
Вопрос
Что такое свойство (property)?
Ответ
Свойство — это способ определить методы для получения, установки и удаления значения атрибута с использованием декоратора @property.
Вопрос
Приведите пример использования @property.
Ответ
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value < 0:
raise ValueError("Radius cannot be negative")
self._radius = value
Вопрос
Что такое статический метод?
Ответ
Статический метод — это метод, который не принимает self или cls и не зависит от состояния экземпляра или класса. Он объявляется с помощью декоратора @staticmethod.
Вопрос
Что такое метод класса?
Ответ
Метод класса — это метод, который принимает cls вместо self и работает с классом, а не с экземпляром. Он объявляется с помощью декоратора @classmethod.
Вопрос
Для чего используется @classmethod?
Ответ
@classmethod часто используется для альтернативных конструкторов:
class Person:
@classmethod
def from_string(cls, s):
name = s.split()[0]
return cls(name)
Вопрос
Что такое абстрактный класс?
Ответ
Абстрактный класс — это класс, который не предназначен для создания экземпляров и содержит хотя бы один абстрактный метод. Он определяет интерфейс для подклассов.
Вопрос
Как создать абстрактный класс в Python?
Ответ
Используется модуль abc и декоратор @abstractmethod:
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
Вопрос
Можно ли создать экземпляр абстрактного класса?
Ответ
Нет, попытка создать экземпляр абстрактного класса вызовет исключение TypeError, если не все абстрактные методы реализованы.
Вопрос
Что такое композиция?
Ответ
Композиция — это отношение «часть-целое», при котором один объект содержит другие объекты как свои атрибуты и управляет их жизненным циклом.
Вопрос
Чем композиция отличается от наследования?
Ответ
Наследование описывает «является» (is-a), а композиция — «имеет» (has-a). Композиция предпочтительнее, когда нужно гибко комбинировать поведение.
Вопрос
Что такое дата-класс (dataclass)?
Ответ
Дата-класс — это класс, автоматически генерирующий стандартные методы (__init__, __repr__, __eq__ и др.) на основе аннотаций типов. Создаётся с помощью декоратора @dataclass.
Вопрос
Приведите пример dataclass.
Ответ
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
Модули и пакеты
Вопрос
Что такое модуль в Python?
Ответ
Модуль — это файл с расширением .py, содержащий определения функций, классов и переменных.
Вопрос
Как импортировать модуль?
Ответ
С помощью ключевого слова import:
import math
Вопрос
Как импортировать конкретную функцию из модуля?
Ответ
С помощью конструкции from ... import ...:
from math import sqrt
Вопрос
Что такое пакет?
Ответ
Пакет — это каталог, содержащий файл __init__.py (в современных версиях Python он может отсутствовать) и один или несколько модулей.
Вопрос
Как импортировать модуль из пакета?
Ответ
Через точечную нотацию:
from mypackage.mymodule import myfunction
Вопрос
Что делает файл __init__.py?
Ответ
Файл __init__.py указывает Python, что каталог является пакетом. Он может содержать код инициализации пакета или быть пустым.
Вопрос
Что такое относительный импорт?
Ответ
Относительный импорт — это импорт модулей внутри пакета с использованием точек:
from .module import func # текущий пакет
from ..parent import func # родительский пакет
Вопрос
Как получить список всех атрибутов модуля?
Ответ
С помощью функции dir():
import math
print(dir(math))
Вопрос
Что хранится в атрибуте __name__ модуля?
Ответ
Если модуль запущен напрямую, __name__ равен "__main__". Если импортирован — имени модуля.
Вопрос
Зачем пишут if __name__ == "__main__":?
Ответ
Эта конструкция позволяет выполнять код только при запуске файла напрямую, но не при импорте как модуля.
Исключения
Вопрос
Как обрабатывать исключения в Python?
Ответ
С помощью блока try...except:
try:
risky_code()
except ValueError as e:
handle_error(e)
Вопрос
Какие базовые классы исключений есть в Python?
Ответ
Все исключения наследуются от BaseException. Большинство пользовательских исключений наследуются от Exception.
Вопрос
Что делает блок finally?
Ответ
Блок finally выполняется всегда, независимо от того, было ли исключение или нет. Он используется для освобождения ресурсов.
Вопрос
Как выбросить исключение вручную?
Ответ
С помощью ключевого слова raise:
raise ValueError("Invalid input")
Вопрос
Как создать пользовательское исключение?
Ответ
Нужно создать класс, наследуемый от Exception:
class MyError(Exception):
pass
Вопрос
Можно ли передавать данные в исключение?
Ответ
Да, исключение может принимать аргументы в конструкторе:
raise MyError("Something went wrong", 42)
Вопрос
Как получить доступ к аргументам исключения?
Ответ
Через атрибут args:
except MyError as e:
print(e.args) # ("Something went wrong", 42)
Вопрос
Что такое цепочка исключений (exception chaining)?
Ответ
Цепочка исключений возникает при использовании raise ... from ..., что сохраняет контекст первоначальной ошибки.
Вопрос
Приведите пример цепочки исключений.
Ответ
try:
open('missing.txt')
except OSError as e:
raise RuntimeError("Failed to read file") from e
Вопрос
Как перехватить несколько типов исключений?
Ответ
Указав их в кортеже:
except (ValueError, TypeError) as e:
handle(e)
Работа с файлами
Вопрос
Как открыть файл для чтения?
Ответ
С помощью функции open() в режиме 'r':
with open('file.txt', 'r') as f:
content = f.read()
Вопрос
Как открыть файл для записи?
Ответ
В режиме 'w':
with open('file.txt', 'w') as f:
f.write("Hello")
Вопрос
Что делает оператор with при работе с файлами?
Ответ
Оператор with гарантирует, что файл будет корректно закрыт после завершения блока, даже если произойдёт исключение.
Вопрос
Как прочитать файл построчно?
Ответ
С помощью цикла:
with open('file.txt') as f:
for line in f:
print(line.strip())
Вопрос
Как записать список строк в файл?
Ответ
С помощью метода writelines():
with open('file.txt', 'w') as f:
f.writelines(['line1\n', 'line2\n'])
Вопрос
Как проверить, существует ли файл?
Ответ
С помощью функции os.path.exists() или pathlib.Path.exists():
from pathlib import Path
if Path('file.txt').exists():
...
Вопрос
Как получить информацию о файле (размер, время изменения)?
Ответ
С помощью os.stat() или pathlib.Path.stat():
from pathlib import Path
stat = Path('file.txt').stat()
print(stat.st_size)
Вопрос
Как работать с путями к файлам кроссплатформенно?
Ответ
Используется модуль pathlib:
from pathlib import Path
p = Path('folder') / 'file.txt'
Вопрос
Что такое текстовый и бинарный режимы открытия файла?
Ответ
Текстовый режим ('r', 'w') работает со строками и применяет кодировку. Бинарный режим ('rb', 'wb') работает с байтами.
Вопрос
Как указать кодировку при открытии файла?
Ответ
Через параметр encoding:
open('file.txt', 'r', encoding='utf-8')
Декораторы
Вопрос
Что такое декоратор в Python?
Ответ
Декоратор — это функция, которая принимает другую функцию и расширяет её поведение без изменения исходного кода.
Вопрос
Как применить декоратор к функции?
Ответ
С помощью синтаксиса @имя_декоратора над определением функции:
@my_decorator
def func():
pass
Вопрос
Приведите пример простого декоратора.
Ответ
def my_decorator(func):
def wrapper():
print("Before")
func()
print("After")
return wrapper
@my_decorator
def say_hello():
print("Hello")
say_hello()
# Вывод:
# Before
# Hello
# After
Вопрос
Можно ли передавать аргументы в декорируемую функцию?
Ответ
Да, обёртка (wrapper) должна принимать *args и **kwargs:
def decorator(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
Вопрос
Как создать декоратор с параметрами?
Ответ
Декоратор с параметрами — это функция, возвращающая декоратор:
def repeat(n):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(n):
func(*args, **kwargs)
return wrapper
return decorator
@repeat(3)
def greet():
print("Hi")
Вопрос
Что делает functools.wraps?
Ответ
functools.wraps сохраняет метаданные оригинальной функции (имя, документацию, аннотации) в обёртке:
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
Вопрос
Какие встроенные декораторы есть в Python?
Ответ
Встроенные декораторы: @staticmethod, @classmethod, @property.
Вопрос
Можно ли применять несколько декораторов к одной функции?
Ответ
Да, декораторы применяются последовательно снизу вверх:
@decorator1
@decorator2
def func():
pass
# эквивалентно: func = decorator1(decorator2(func))
Вопрос
Что такое класс-декоратор?
Ответ
Класс-декоратор — это класс, реализующий метод __call__, позволяющий использовать экземпляр класса как функцию:
class CallCounter:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
return self.func(*args, **kwargs)
Вопрос
Где применяются декораторы на практике?
Ответ
Декораторы используются для логирования, кэширования, проверки прав доступа, измерения времени выполнения, валидации входных данных и управления состоянием.
Генераторы и итераторы
Вопрос
Что такое генератор?
Ответ
Генератор — это функция, которая возвращает итератор с помощью ключевого слова yield. Она генерирует значения по запросу.
Вопрос
Что делает ключевое слово yield?
Ответ
yield приостанавливает выполнение функции и возвращает значение. При следующем вызове функция возобновляется с места остановки.
Вопрос
Приведите пример генератора.
Ответ
def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1
for num in count_up_to(3):
print(num) # 1, 2, 3
Вопрос
Что такое генераторное выражение?
Ответ
Генераторное выражение — это компактный способ создания генератора:
gen = (x**2 for x in range(5))
Вопрос
Чем генератор отличается от списка?
Ответ
Генератор вычисляет значения по мере необходимости и потребляет меньше памяти. Список хранит все значения сразу.
Вопрос
Что такое итератор?
Ответ
Итератор — это объект, реализующий методы __iter__() и __next__(), позволяющий перебирать последовательность значений.
Вопрос
Что такое итерируемый объект?
Ответ
Итерируемый объект — это объект, который может возвращать итератор, например, через вызов iter(). Примеры: списки, строки, кортежи.
Вопрос
Как проверить, является ли объект итерируемым?
Ответ
Объект итерируем, если у него есть метод __iter__(). Практически проверяется так:
try:
iter(obj)
except TypeError:
not iterable
Вопрос
Что делает функция next()?
Ответ
Функция next() вызывает метод __next__() итератора и возвращает следующее значение. Если значений нет, выбрасывается StopIteration.
Вопрос
Можно ли повторно использовать генератор?
Ответ
Нет, генератор одноразовый. После исчерпания он не может быть использован снова без повторного вызова функции.
Многопоточность и многопроцессность
Вопрос
Поддерживает ли Python многопоточность?
Ответ
Да, Python поддерживает многопоточность через модуль threading.
Вопрос
Что такое GIL (Global Interpreter Lock)?
Ответ
GIL — это механизм, разрешающий выполнение байт-кода только одному потоку за раз в интерпретаторе CPython. Это ограничивает параллелизм CPU-bound задач.
Вопрос
Когда многопоточность полезна в Python?
Ответ
Многопоточность полезна для I/O-bound задач (чтение файлов, сетевые запросы), где потоки проводят время в ожидании.
Вопрос
Как запустить поток в Python?
Ответ
С помощью класса Thread из модуля threading:
import threading
def task():
print("Running")
t = threading.Thread(target=task)
t.start()
t.join()
Вопрос
Что делает метод join() у потока?
Ответ
Метод join() блокирует текущий поток до завершения целевого потока.
Вопрос
Как избежать гонки данных при работе с общими переменными?
Ответ
Используется примитив синхронизации, например, Lock из модуля threading:
lock = threading.Lock()
with lock:
shared_variable += 1
Вопрос
Что такое многопроцессность?
Ответ
Многопроцессность — это выполнение кода в отдельных процессах, каждый со своим интерпретатором и памятью. Обходит ограничение GIL.
Вопрос
Как запустить процесс в Python?
Ответ
С помощью модуля multiprocessing:
from multiprocessing import Process
def f(name):
print(f"Hello {name}")
p = Process(target=f, args=("Alice",))
p.start()
p.join()
Вопрос
Когда использовать многопроцессность вместо многопоточности?
Ответ
Многопроцессность используется для CPU-bound задач, где требуется реальный параллелизм.
Вопрос
Как обмениваться данными между процессами?
Ответ
Используются объекты Queue, Pipe или разделяемая память (Value, Array) из модуля multiprocessing.
Асинхронное программирование
Вопрос
Что такое асинхронное программирование в Python?
Ответ
Асинхронное программирование — это стиль, при котором операции выполняются без блокировки основного потока, особенно полезен для I/O-bound задач.
Вопрос
Какие ключевые слова используются в асинхронном коде?
Ответ
Ключевые слова: async def для определения корутины, await для ожидания результата асинхронной операции.
Вопрос
Что такое корутина?
Ответ
Корутина — это функция, определённая с async def. Её вызов возвращает объект корутины, который должен быть запущен через await или цикл событий.
Вопрос
Как запустить асинхронную функцию?
Ответ
В асинхронной среде — через await. В синхронном коде — через asyncio.run():
import asyncio
async def main():
await asyncio.sleep(1)
asyncio.run(main())
Вопрос
Что такое event loop?
Ответ
Event loop — это цикл событий, управляющий выполнением корутин, планированием задач и обработкой I/O-операций.
Вопрос
Как выполнять несколько асинхронных задач параллельно?
Ответ
С помощью asyncio.gather():
results = await asyncio.gather(task1(), task2())
Вопрос
Что делает asyncio.create_task()?
Ответ
create_task() планирует корутину на выполнение в event loop и возвращает объект Task, который можно ожидать позже.
Вопрос
Можно ли использовать синхронные библиотеки в асинхронном коде?
Ответ
Да, но они блокируют event loop. Для неблокирующего выполнения их следует запускать в пуле потоков через asyncio.to_thread() (Python 3.9+) или loop.run_in_executor().
Вопрос
Что такое async context manager?
Ответ
Async context manager — это менеджер контекста, реализующий __aenter__ и __aexit__, используемый с async with.
Вопрос
Что такое async iterator?
Ответ
Async iterator — это итератор, реализующий __aiter__ и __anext__, используемый с async for.
Тестирование
Вопрос
Какой фреймворк для тестирования встроен в Python?
Ответ
Встроенный фреймворк — unittest.
Вопрос
Как написать простой тест с помощью unittest?
Ответ
import unittest
class TestMath(unittest.TestCase):
def test_addition(self):
self.assertEqual(1 + 1, 2)
if __name__ == "__main__":
unittest.main()
Вопрос
Что такое pytest?
Ответ
pytest — это сторонний, популярный фреймворк для тестирования, поддерживающий более простой синтаксис и мощные функции (параметризованные тесты, фикстуры).
Вопрос
Как написать тест для pytest?
Ответ
def test_addition():
assert 1 + 1 == 2
Вопрос
Что такое фикстура в pytest?
Ответ
Фикстура — это функция, предоставляющая данные или состояние для тестов. Определяется с декоратором @pytest.fixture.
Вопрос
Как проверить, что функция выбрасывает исключение?
Ответ
В unittest:
with self.assertRaises(ValueError):
risky_function()
В pytest:
import pytest
with pytest.raises(ValueError):
risky_function()
Вопрос
Что такое мок (mock)?
Ответ
Мок — это объект, имитирующий поведение реального объекта для изоляции тестируемого кода.
Вопрос
Как использовать мок в unittest?
Ответ
С помощью unittest.mock.patch:
from unittest.mock import patch
@patch('module.function')
def test_something(mock_func):
mock_func.return_value = 42
...
Вопрос
Что такое TDD?
Ответ
TDD (Test-Driven Development) — это методология разработки, при которой сначала пишутся тесты, а затем реализация, удовлетворяющая этим тестам.
Вопрос
Как измерить покрытие кода тестами?
Ответ
С помощью инструмента coverage.py:
coverage run -m pytest
coverage report
Стандартная библиотека
Вопрос
Какие полезные модули есть в стандартной библиотеке Python?
Ответ
Полезные модули: os, sys, pathlib, json, csv, datetime, collections, itertools, functools, re, argparse, logging, subprocess, urllib, hashlib, tempfile.
Вопрос
Для чего используется модуль collections?
Ответ
Модуль collections предоставляет специализированные контейнеры: defaultdict, Counter, deque, namedtuple, OrderedDict.
Вопрос
Что делает defaultdict?
Ответ
defaultdict автоматически создаёт значение по умолчанию для отсутствующих ключей:
from collections import defaultdict
d = defaultdict(list)
d['key'].append(1) # не вызывает KeyError
Вопрос
Что такое namedtuple?
Ответ
namedtuple — это фабричная функция для создания классов кортежей с именованными полями:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x) # 1
Вопрос
Для чего используется модуль itertools?
Ответ
Модуль itertools предоставляет функции для эффективной работы с итераторами: chain, cycle, product, permutations, combinations.
Вопрос
Как объединить несколько итераторов в один?
Ответ
С помощью itertools.chain():
import itertools
combined = itertools.chain([1, 2], [3, 4]) # 1, 2, 3, 4
Вопрос
Как парсить аргументы командной строки?
Ответ
С помощью модуля argparse:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--name', type=str)
args = parser.parse_args()
print(args.name)
Вопрос
Как логировать события в приложении?
Ответ
С помощью модуля logging:
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Message")
Вопрос
Как выполнить внешнюю команду из Python?
Ответ
С помощью модуля subprocess:
import subprocess
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
Вопрос
Как работать с датами и временем?
Ответ
С помощью модуля datetime:
from datetime import datetime, timedelta
now = datetime.now()
future = now + timedelta(days=7)
Типизация и аннотации
Вопрос
Что такое аннотации типов в Python?
Ответ
Аннотации типов — это синтаксис для указания ожидаемых типов переменных, аргументов и возвращаемых значений.
Вопрос
Приведите пример аннотации функции.
Ответ
def greet(name: str) -> str:
return f"Hello, {name}"
Вопрос
Как аннотировать список строк?
Ответ
С помощью list[str] (Python 3.9+) или List[str] из модуля typing:
from typing import List
def process(items: List[str]) -> None: ...
# или
def process(items: list[str]) -> None: ...
Вопрос
Что такое Optional[T]?
Ответ
Optional[T] эквивалентно Union[T, None] и означает, что значение может быть типа T или None.
Вопрос
Как проверить типы в Python?
Ответ
Типы проверяются статически с помощью инструментов вроде mypy, pyright или pyre. Python сам по себе не проверяет типы во время выполнения.
Вопрос
Что такое протокол (Protocol)?
Ответ
Протокол — это способ определить структурную типизацию (duck typing) через интерфейс:
from typing import Protocol
class Drawable(Protocol):
def draw(self) -> None: ...
def render(obj: Drawable) -> None:
obj.draw()
Вопрос
Что такое TypedDict?
Ответ
TypedDict позволяет аннотировать словари с известными ключами и типами значений:
from typing import TypedDict
class Person(TypedDict):
name: str
age: int
Вопрос
Поддерживает ли Python generic-типы?
Ответ
Да, начиная с Python 3.5 через модуль typing, а с Python 3.9 — напрямую: list[int], dict[str, int].
Вопрос
Что такое TypeVar?
Ответ
TypeVar используется для создания обобщённых функций с сохранением типа:
from typing import TypeVar
T = TypeVar('T')
def first(lst: list[T]) -> T:
return lst[0]
Вопрос
Когда использовать Any?
Ответ
Any используется, когда тип неизвестен или проверка типов не требуется. Его применение снижает пользу от статической типизации.
Производительность и оптимизация
Вопрос
Как измерить время выполнения кода?
Ответ
С помощью модуля time или timeit:
import time
start = time.time()
# код
end = time.time()
print(end - start)
Вопрос
Какой инструмент использовать для профилирования кода?
Ответ
Модуль cProfile:
python -m cProfile script.py
Вопрос
Почему списковые включения быстрее циклов for?
Ответ
Списковые включения реализованы на C и избегают накладных расходов интерпретатора на каждой итерации.
Вопрос
Как ускорить вычисления в Python?
Ответ
Можно использовать:
- Векторизацию через
numpy - JIT-компиляцию через
numba - Переписывание критических участков на Cython
- Использование многопроцессности для CPU-bound задач
Вопрос
Что такое __slots__?
Ответ
__slots__ ограничивает атрибуты экземпляра класса, уменьшая потребление памяти и ускоряя доступ к атрибутам:
class Point:
__slots__ = ('x', 'y')
def __init__(self, x, y):
self.x = x
self.y = y
Вопрос
Когда стоит использовать генераторы вместо списков?
Ответ
Когда данные большие или не нужны все сразу — генераторы экономят память.
Вопрос
Как избежать повторных вычислений?
Ответ
С помощью кэширования, например, декоратора @functools.lru_cache:
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
Вопрос
Почему is не следует использовать для сравнения строк или чисел?
Ответ
Оператор is сравнивает идентичность объектов, а не значения. Некоторые малые целые и строки кэшируются, но это деталь реализации.
Вопрос
Как уменьшить потребление памяти большими коллекциями?
Ответ
Использовать array.array, numpy.ndarray, генераторы, __slots__, или хранить данные вне памяти (например, в базе).
Вопрос
Что такое «premature optimization»?
Ответ
Это преждевременная оптимизация — попытка ускорить код без профилирования и доказательства узких мест. Она часто приводит к усложнению без реальной выгоды.
Безопасность
Вопрос
Почему нельзя использовать eval() с пользовательским вводом?
Ответ
eval() выполняет произвольный код, что может привести к выполнению вредоносных команд и компрометации системы.
Вопрос
Как безопасно парсить JSON?
Ответ
С помощью модуля json:
import json
data = json.loads(user_input)
Он не выполняет код и безопасен.
Вопрос
Как избежать SQL-инъекций?
Ответ
Использовать параметризованные запросы:
cursor.execute("SELECT * FROM users WHERE name = %s", (name,))
Вопрос
Как безопасно обрабатывать пути к файлам?
Ответ
Использовать pathlib и проверять, что путь находится внутри разрешённой директории (предотвращать path traversal).
Вопрос
Что такое «pickle» и почему его нельзя использовать с недоверенными данными?
Ответ
pickle сериализует объекты Python, но при десериализации может выполнять произвольный код. Его нельзя использовать с ненадёжными источниками.
Продвинутые структуры данных и алгоритмы
Вопрос
Как реализовать очередь FIFO?
Ответ
С помощью collections.deque:
from collections import deque
q = deque()
q.append('a') # добавить в конец
item = q.popleft() # извлечь из начала
Вопрос
Как реализовать стек LIFO?
Ответ
С помощью списка:
stack = []
stack.append('a')
item = stack.pop()
Вопрос
Как подсчитать частоту элементов в списке?
Ответ
С помощью collections.Counter:
from collections import Counter
counts = Counter(['a', 'b', 'a']) # {'a': 2, 'b': 1}
Вопрос
Как найти пересечение двух списков?
Ответ
Через множества:
set1 & set2
Вопрос
Как отсортировать список словарей по ключу?
Ответ
С помощью sorted() и key:
sorted(data, key=lambda x: x['name'])
Особенности реализации и внутреннее устройство
Вопрос
Что такое CPython?
Ответ
CPython — это эталонная реализация Python, написанная на C. Она включает интерпретатор, GIL и стандартную библиотеку.
Вопрос
Как устроены целые числа в Python?
Ответ
Целые числа в Python имеют произвольную точность и реализованы как массивы цифр в основании (2^30) или (2^15) в зависимости от платформы.
Вопрос
Как устроены списки в Python?
Ответ
Списки реализованы как динамические массивы указателей на объекты. Они позволяют O(1) доступ по индексу и амортизированное O(1) добавление в конец.
Вопрос
Как устроены словари в Python?
Ответ
Словари реализованы как хэш-таблицы с открытой адресацией. Начиная с Python 3.7, они сохраняют порядок вставки.
Вопрос
Почему [{}] * 3 создаёт три ссылки на один и тот же словарь?
Ответ
Оператор * копирует ссылки, а не объекты. Все элементы списка указывают на один и тот же иммутабельный или мутабельный объект.
Best Practices и вопросы системного уровня
Вопрос
Как организовать проект на Python?
Ответ
Рекомендуется:
- Разделять код на модули и пакеты
- Использовать виртуальное окружение
- Хранить зависимости в
requirements.txtилиpyproject.toml - Писать тесты
- Следовать PEP 8
Вопрос
Что такое виртуальное окружение?
Ответ
Виртуальное окружение — это изолированная среда с собственной копией интерпретатора и установленными пакетами.
Вопрос
Как создать виртуальное окружение?
Ответ
python -m venv myenv
source myenv/bin/activate # Linux/macOS
myenv\Scripts\activate # Windows
Вопрос
Как управлять зависимостями?
Ответ
С помощью pip и файла requirements.txt или современных инструментов: poetry, pipenv, uv.
Вопрос
Что такое __pycache__?
Ответ
__pycache__ — это каталог, в который Python сохраняет скомпилированные .pyc-файлы для ускорения последующих запусков.
Вопрос
Как сделать скрипт исполняемым?
Ответ
Добавить shebang в начало файла:
#!/usr/bin/env python3
и выставить права: chmod +x script.py.
Вопрос
Как обрабатывать сигналы ОС в Python?
Ответ
С помощью модуля signal:
import signal
def handler(signum, frame):
print("Received signal", signum)
signal.signal(signal.SIGINT, handler)
Вопрос
Как проверить версию Python?
Ответ
import sys
print(sys.version_info)
Вопрос
Как получить аргументы командной строки?
Ответ
Через sys.argv:
import sys
print(sys.argv) # список строк
Вопрос
Что делать, если программа «зависает»?
Ответ
Можно отправить сигнал SIGUSR1 (на Unix), чтобы вывести трассировку стека, или использовать внешние профайлеры (py-spy, gdb).