
- Главная
- Каталог
- Интернет технологии
- Python | Вопросы собесов
Python | Вопросы собесов
Разбираем вопросы с собеседований на Python разработчика. Очень активная и лояльная аудитория.
Статистика канала
dict) работают очень быстро, потому что они используют хеш-таблицы. Это позволяет находить значения по ключу в константное время O(1) в большинстве случаев. Давайте разберемся, как это работает.
🟠Как устроен словарь в Python?
Словарь (dict) — это структура данных, которая хранит пары ключ → значение. Например:
data = {"name": "Alice", "age": 25, "city": "New York"}
print(data["age"]) # 25{}
🟠Как работает хеш-таблица?
Основной принцип:
Хеш-функция (hash()) вычисляет уникальное число (хеш) для ключа.
Используется массив (таблица), где данные хранятся по индексам, связанным с хешем.
Поиск по ключу — это просто вычисление хеша и обращение к нужному индексу.
print(hash("age")) # Например, вернет 328847234 (будет разным при каждом запуске){}
Когда мы пишем
value = data["age"]{}
🟠Почему поиск занимает O(1)?
Нет линейного поиска: вместо перебора всех элементов Python сразу вычисляет, где находится нужное значение.
Операция доступа занимает фиксированное время: hash() + обращение по индексу.
Даже при большом количестве элементов скорость остается высокой.
Добавим 1 миллион элементов и посмотрим скорость поиска:
import time
data = {i: i * 2 for i in range(1_000_000)}
start = time.time()
print(data[999_999]) # Быстро находит ключ!
end = time.time()
print("Время поиска:", end - start) # Около 0.000001 сек{}
🟠Что если хеши совпадут? (Коллизии)
Иногда два разных ключа могут иметь одинаковый хеш (редко, но возможно). Тогда Python использует связанный список (chaining) или перехеширование.
print(hash("abc") % 10) # Например, 5
print(hash("xyz") % 10) # Тоже 5 (редко, но бывает){}
Ставь 👍 и забирай 📚 Базу знаний
class Memento:
def __init__(self, state: str):
self._state = state
def get_state(self) -> str:
return self._state
class TextEditor:
def __init__(self):
self._state = ""
self._history = []
def type(self, text: str):
self._save_state()
self._state += text
def _save_state(self):
self._history.append(Memento(self._state))
def undo(self):
if not self._history:
return
memento = self._history.pop()
self._state = memento.get_state()
def get_content(self) -> str:
return self._state
# Клиентский код для использования паттерна Хранитель
def main():
editor = TextEditor()
editor.type("Hello, ")
editor.type("world!")
print(editor.get_content()) # Hello, world!
editor.undo()
print(editor.get_content()) # Hello,
editor.undo()
print(editor.get_content()) #
if __name__ == "__main__":
main(){}
1⃣`Memento`:
Сохраняет состояние объекта. Он предоставляет методы для получения сохраненного состояния, но не предоставляет методов для изменения состояния, что обеспечивает неизменность.
2⃣`TextEditor`:
Создает и использует объекты Memento для сохранения и восстановления своего состояния. Методы type и undo позволяют редактировать текст и отменять изменения.
3⃣`_save_state`:
Сохраняет текущее состояние редактора в истории перед каждым изменением.
4⃣`undo`:
Восстанавливает предыдущее состояние редактора из истории.
Ставь 👍 и забирай 📚 Базу знаний
with open("example.txt", "w", encoding="utf-8") as file:
file.write("Привет, мир!") # Записываем текст в файл
with open("example.txt", "r", encoding="utf-8") as file:
content = file.read() # Читаем текст из файла
print(content){}
🟠Бинарные файлы (`BufferedReader`, `BufferedWriter`)
Эти файлы используются для работы с двоичными данными (изображениями, видео, аудиофайлами и т. д.).
with open("image.jpg", "rb") as file:
binary_data = file.read() # Читаем файл в бинарном режиме
print(binary_data[:10]) # Выведем первые 10 байтов
with open("copy.jpg", "wb") as file:
file.write(binary_data) # Записываем данные в новый файл{}
🟠Файлы ввода-вывода в памяти (`io.StringIO`, `io.BytesIO`)
Эти объекты представляют собой файловые буферы, которые хранят данные в оперативной памяти, а не на диске.
from io import StringIO
file = StringIO()
file.write("Привет, мир!") # Запись данных в буфер
file.seek(0) # Перемещаем указатель в начало
print(file.read()) # Читаем данные из буфера{}
Пример работы с BytesIO:
from io import BytesIO
file = BytesIO()
file.write(b"Binary data") # Запись бинарных данных
file.seek(0)
print(file.read()) # Чтение данных{}
🟠Файловые объекты на основе сокетов, пайпов и других источников
Python позволяет работать с файловыми объектами, полученными из нестандартных источников, например, сокетов или каналов связи (pipes).
import socket
s = socket.socket()
s.connect(("example.com", 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = s.makefile("r", encoding="utf-8") # Создание файлового объекта
print(response.readline()) # Читаем первую строку HTTP-ответа
s.close(){}
Ставь 👍 и забирай 📚 Базу знанийset) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в set.
🚩Можно добавить в `set`:
Числа (int, float, complex)
s = {1, 2.5, 3+4j}{}
Строки (str)
s = {"apple", "banana", "cherry"}{}
Кортежи (tuple), если они тоже содержат только неизменяемые объекты
s = {(1, 2), ("a", "b")}{}
Булевые значения (bool)** (но True считается 1, а False — 0)
s = {True, False, 1, 0}
print(s) # {False, True} (0 и 1 не добавятся повторно){}
🚩Нельзя добавить в `set`
Изменяемые объекты (list, set, dict)
s = { [1, 2, 3] } # Ошибка: TypeError: unhashable type: 'list'{}
s = { {"key": "value"} } # Ошибка: TypeError: unhashable type: 'dict'{}
Кортежи с изменяемыми элементами
s = { (1, [2, 3]) } # Ошибка: TypeError{}
Ставь 👍 и забирай 📚 Базу знанийОтзывы канала
всего 2 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Python | Вопросы собесов — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 13.4K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 5.3, количество отзывов – 2, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 5034.96 ₽, а за 13 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий