Python
Редактировать на GitHubТеоретические вопросы
Что такое хеш-таблица? Пример использования.
Хеш-таблица (hash table) — это структура данных, которая хранит пары ключ–значение и обеспечивает быстрый доступ к элементам по ключу за амортизированное O(1) время.
В Python хеш-таблицы реализованы в таких структурах, как dict и set.
При добавлении элемента ключ преобразуется в хеш (число), и на основе этого значения выбирается место в памяти.
Пример использования:
# Создание хеш-таблицы (словаря)
users = {
"alice": 25,
"bob": 30,
"charlie": 22
}
# Быстрый доступ по ключу
print(users["bob"]) # 30
# Добавление нового элемента
users["david"] = 28
# Проверка существования ключа
if "alice" in users:
print("Alice найдена!")
# Удаление элемента
del users["charlie"]Ключевые особенности:
- Ключи должны быть хешируемыми (immutable:
str,int,tuple, и т.п.). - Вставка, поиск и удаление работают в среднем за O(1).
- При коллизиях (одинаковый хеш для разных ключей) Python использует open addressing (открытую адресацию).
Что такое генератор, что такое итератор?
Итератор
Итератор — это сущность, которая упрощает навигацию по коллекции данных. С помощью итератора можно перебрать значения в списке, применяя к каждому элементу определённую функцию. Итераторы позволяют последовательно получать элементы из коллекций, таких как списки, кортежи или множества.
Генератор
Генератор — это объект, который генерирует значения по мере их запроса. Генераторы похожи на списки, но отличаются следующими особенностями:
- Генератор не вычисляет все значения сразу при создании. Значения генерируются по мере необходимости.
- В памяти хранится только последнее вычисленное значение, а также правило перехода к следующему элементу и условие остановки генерации.
- Вычисление следующего значения происходит при вызове метода
next(). Предыдущее значение при этом теряется.
В чем разница между кортежем и списком?
-
Изменяемость (Mutable vs Immutable):
- Список можно изменять после создания. Элементы можно добавлять, удалять или изменять.
- Кортеж является неизменяемым объектом. После создания кортежа его содержимое нельзя изменить.
-
Производительность:
- Кортеж работает быстрее, чем список, при итерации и доступе к элементам, так как из-за своей неизменяемости он оптимизирован лучше. Это делает его предпочтительным выбором для данных, которые не изменяются.
- Список медленнее, так как его структура предусматривает возможность модификации данных.
-
Использование памяти:
- Кортежи занимают меньше памяти по сравнению со списками за счёт своей неизменяемости.
- Списки требуют больше памяти, так как резервируют пространство для возможных изменений.
-
Функциональность:
- Списки поддерживают множество методов, таких как
append(),remove(),extend(), и другие, позволяющие изменять его содержимое. - Кортежи не поддерживают методы изменения, так как они неизменяемы, но могут быть использованы методы, такие как
count()иindex().
- Списки поддерживают множество методов, таких как
-
Использование:
- Список используется, когда данные могут изменяться, например, список задач, товаров или пользователей.
- Кортеж обычно используется для хранения данных, которые не должны изменяться, например, координаты точки (x, y), дата или параметры конфигурации.
-
Хешируемость:
- Кортеж хешируем (если все его элементы также хешируемы), что позволяет использовать его в качестве ключа в словарях или элемента в множестве.
- Список не является хешируемым и не может быть ключом в словарях или элементом в множестве.
-
Безопасность:
- Кортеж благодаря своей неизменяемости является более безопасным для данных, которые не должны изменяться. Это предотвращает случайные или преднамеренные изменения данных.
- Список, наоборот, можно случайно изменить, что может привести к нежелательным последствиям.
-
Синтаксические различия:
- Список создаётся с помощью квадратных скобок:
my_list = [1, 2, 3] - Кортеж создаётся с помощью круглых скобок:
my_tuple = (1, 2, 3)
Примечание: если кортеж содержит один элемент, необходимо указать запятую:single_element_tuple = (1,)
- Список создаётся с помощью квадратных скобок:
Вывод:
- Если вам нужна структура данных, которую можно изменять, используйте список.
- Если ваши данные неизменяемы, и вам важна оптимизация памяти и производительности, выбирайте кортеж.
Что такое декоратор?
Декоратор позволяет добавить новую функциональность к существующей функции. Это делается следующим образом. Функция передается декоратору, а он выполняет и существующий, и дополнительный код.
Напишите функцию декоратора. В качестве аргумента он принимает функцию func. Декоратор определяет функцию log_function_called, которая вызывает func() и выполняет некоторый код print(f'{func} called.’). Затем возвращает определенную им функцию:
def logging(func):
def log_function_called():
print(f'{func} called.')
func()
return log_function_calledНапишем другие функции, к которым добавим декоратор (потом, не сейчас):
def my_name():
print('chris')
def friends_name():
print('naruto')
my_name()
friends_name()
# => chris
# => narutoТеперь добавим декоратор к ним обоим.
def logging(func):
def log_function_called():
print(f'{func} called.')
func()
return log_function_called
def my_name():
print('chris')
@logging
def friends_name():
print('naruto')
my_name()
friends_name()
# => chris
# => <function friends_name at 0x10fca5f28> called.
# => narutoТеперь легко добавить ведение журнала в любую функцию, которую мы пишем. Достаточно написать перед ней @logging.
Какое значение принимает переменная в Python, которая не имеет значения?
Будет иметь значение None
Последнее обновление: 14 окт. 2025 г., 12:08:27