🤔 Как выглядит HTTP-запрос?
HTTP-запрос содержит:
- Стартовую строку: метод (GET, POST), путь (/page), версия (HTTP/1.1)
- Заголовки: информация о браузере, типе контента, авторизации и др.
- Тело запроса (не всегда): обычно есть у POST/PUT и содержит данные формы, JSON и т.д.
Всё это отправляется на сервер, который возвращает HTTP-ответ.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
HTTP-запрос содержит:
- Стартовую строку: метод (GET, POST), путь (/page), версия (HTTP/1.1)
- Заголовки: информация о браузере, типе контента, авторизации и др.
- Тело запроса (не всегда): обычно есть у POST/PUT и содержит данные формы, JSON и т.д.
Всё это отправляется на сервер, который возвращает HTTP-ответ.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Что можете сказать о конструкции import package.item?
Конструкция import package.item используется для импорта конкретного подмодуля или элемента из пакета в Python.
🚩Пакеты и Подмодули
Пакет — это каталог, который содержит файл
вероятность
Конструкции
🚩Импорт Подмодуля
Конструкция
🚩Почему это важно?
🟠Организация кода
Пакеты позволяют структурировать код в иерархическую систему, что делает его более организованным и модульным.
🟠Избежание конфликтов имен
Использование пакетов помогает избежать конфликтов имен, так как разные модули могут иметь одинаковые имена, но располагаться в разных пакетах.
🟠Управление зависимостями
Пакеты упрощают управление зависимостями между различными частями кода.
Структура каталога
init.
Код вort package.ite
Код вport package.item
Использование в скрипте
Ставь 👍 и забирай 📚 Базу знаний
Конструкция import package.item используется для импорта конкретного подмодуля или элемента из пакета в Python.
🚩Пакеты и Подмодули
Пакет — это каталог, который содержит файл
__init__.py и может содержать подкаталоги и модули. Подкаталоги в пакете также могут содержать файлыия import py, что делает их под-пакетами. Пример структуры пакета:package/
вероятность
py
item.py
subpackage/
Конструкции
py
subitem.py
🚩Импорт Подмодуля
Конструкция
import package.item позволяет импортировать подмодуль item из пакета package. Например:import package.item
# Теперь вы можете использовать функции и классы из package.item
package.item.some_function()
🚩Почему это важно?
🟠Организация кода
Пакеты позволяют структурировать код в иерархическую систему, что делает его более организованным и модульным.
🟠Избежание конфликтов имен
Использование пакетов помогает избежать конфликтов имен, так как разные модули могут иметь одинаковые имена, но располагаться в разных пакетах.
🟠Управление зависимостями
Пакеты упрощают управление зависимостями между различными частями кода.
Структура каталога
math_operations/
init.
py
addition.py
subtraction.py
Код вort package.ite
def add(a, b):
return a + b
Код вport package.item
def subtract(a, b):
return a - b
Использование в скрипте
import math_operations.addition
import math_operations.subtraction
result_add = math_operations.addition.add(5, 3)
result_subtract = math_operations.subtraction.subtract(5, 3)
print("Addition:", result_add) # Выведет: Addition: 8
print("Subtraction:", result_subtract) # Выведет: Subtraction: 2
Ставь 👍 и забирай 📚 Базу знаний
👍2💊1
🤔 Что такое IP-адрес и доменное имя?
- IP-адрес — числовой идентификатор устройства в сети (например,192.168.1.1 или IPv6-адрес).
- Доменное имя — читаемый адрес, который указывает на IP (например, example.com ).
DNS (система доменных имён) преобразует доменные имена в IP-адреса, чтобы браузеры знали, куда подключаться.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- IP-адрес — числовой идентификатор устройства в сети (например,
- Доменное имя — читаемый адрес, который указывает на IP (например,
DNS (система доменных имён) преобразует доменные имена в IP-адреса, чтобы браузеры знали, куда подключаться.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍7
🤔 Что такое паттерн Заместитель (Proxy)?
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
🚩Зачем нужен паттерн Заместитель
🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
🚩Типы заместителей
🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.
🚩Как используется паттерн Заместитель
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
Ставь 👍 и забирай 📚 Базу знаний
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
🚩Зачем нужен паттерн Заместитель
🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
🚩Типы заместителей
🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.
🚩Как используется паттерн Заместитель
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
Proxy контролирует доступ к классу RealSubject, добавляя проверку доступа и логирование.from abc import ABC, abstractmethod
class Subject(ABC):
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")
class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()
def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True
def log_access(self):
print("Заместитель: Логирование времени запроса.")
# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)
proxy.request()
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что означает %s?
%s — это форматная строка, placeholder для вставки строки. Применяется при форматировании строк через оператор %. Используется для подстановки значений в строку определённого типа (в данном случае — строка).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
%s — это форматная строка, placeholder для вставки строки. Применяется при форматировании строк через оператор %. Используется для подстановки значений в строку определённого типа (в данном случае — строка).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥4
🤔 Что такое объект первого класса?
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на Python
Присваивание функции переменной
Передача функции как аргумента
Возврат функции из функции
Ставь 👍 и забирай 📚 Базу знаний
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на Python
Присваивание функции переменной
def say_hello():
return "Hello!"
# Функция присваивается переменной
greet = say_hello
print(greet()) # Вывод: Hello!
Передача функции как аргумента
def apply_function(func, value):
return func(value)
def square(x):
return x * x
result = apply_function(square, 5)
print(result) # Вывод: 25
Возврат функции из функции
def multiplier(n):
def multiply(x):
return x * n
return multiply
double = multiplier(2)
print(double(10)) # Вывод: 20
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Как связаны for и next?
Цикл for в Python работает на основе итераторов. Он неявно вызывает метод next, чтобы получить следующий элемент из последовательности. Когда элементы заканчиваются, вызывается исключение, которое завершает цикл. Таким образом, for — это более удобная и безопасная обёртка над вызовами next.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Цикл for в Python работает на основе итераторов. Он неявно вызывает метод next, чтобы получить следующий элемент из последовательности. Когда элементы заканчиваются, вызывается исключение, которое завершает цикл. Таким образом, for — это более удобная и безопасная обёртка над вызовами next.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥1
🤔 Какие нюансы есть в использовании чисел как ключей?
Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок.
🚩Хешируемость чисел
Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как
🚩Взаимодействие `int` и `float`
Python не делает различий между
🚩Непредсказуемое поведение при работе с `float`
Числа с плавающей запятой (
🚩Производительность
Использование чисел как ключей в словарях эффективно с точки зрения производительности. Поскольку числа хешируются быстро и занимают меньше памяти, операции добавления, удаления и поиска выполняются очень быстро.
🚩Проблемы при преобразованиях
Если ключами словаря являются числа, то при обработке данных (например, чтении из файла или API) можно случайно преобразовать их в строки, что приведёт к созданию новых ключей вместо использования существующих.
🚩Пользовательские объекты с числовыми свойствами
Если вы используете пользовательские объекты как ключи и они ведут себя как числа (например, реализуют методы
Ставь 👍 и забирай 📚 Базу знаний
Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок.
🚩Хешируемость чисел
Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как
int, так и float) являются хешируемыми, поэтому их можно использовать в качестве ключей.d = {1: "один", 2: "два"}
print(d[1]) # "один"🚩Взаимодействие `int` и `float`
Python не делает различий между
int и float, если их значения равны. Это связано с тем, что у них одинаковое хеш-значение при равенстве. d = {1: "один", 1.0: "float один", 2: "два"}
print(d) # {1: 'float один', 2: 'два'}🚩Непредсказуемое поведение при работе с `float`
Числа с плавающей запятой (
float) иногда ведут себя непредсказуемо из-за ошибок округления, которые возникают из-за особенностей представления чисел в памяти компьютера.d = {0.1 + 0.2: "значение"} # 0.1 + 0.2 не равно точно 0.3 из-за округления
print(d.get(0.3)) # None, ключ не найден!🚩Производительность
Использование чисел как ключей в словарях эффективно с точки зрения производительности. Поскольку числа хешируются быстро и занимают меньше памяти, операции добавления, удаления и поиска выполняются очень быстро.
🚩Проблемы при преобразованиях
Если ключами словаря являются числа, то при обработке данных (например, чтении из файла или API) можно случайно преобразовать их в строки, что приведёт к созданию новых ключей вместо использования существующих.
d = {1: "один", 2: "два"}
print(d.get("1")) # None, строка "1" и число 1 – это разные ключи!🚩Пользовательские объекты с числовыми свойствами
Если вы используете пользовательские объекты как ключи и они ведут себя как числа (например, реализуют методы
__hash__ и __eq__), то их поведение должно быть совместимо с ожидаемым использованием. class MyNumber:
def __init__(self, value):
self.value = value
def __hash__(self):
return hash(self.value)
def __eq__(self, other):
return self.value == other.value
d = {MyNumber(1): "один"}
print(d[MyNumber(1)]) # "один"
Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что такое DNS и как он работает?
DNS (Domain Name System) — это система, которая преобразует доменное имя (например,google.com ) в IP-адрес, нужный для соединения.
Принцип работы:
1. Вводишь адрес в браузере.
2. Запрос уходит к DNS-серверу.
3. Он возвращает IP-адрес.
4. С этого момента браузер знает, куда направить HTTP-запрос.
DNS работает как телефонная книга интернета.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
DNS (Domain Name System) — это система, которая преобразует доменное имя (например,
Принцип работы:
1. Вводишь адрес в браузере.
2. Запрос уходит к DNS-серверу.
3. Он возвращает IP-адрес.
4. С этого момента браузер знает, куда направить HTTP-запрос.
DNS работает как телефонная книга интернета.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥1
🤔 Какие объекты можно положить в множество?
В Python множество (
🚩Можно добавить в `set`:
Числа (
Строки (
Кортежи (
Булевые значения (
🚩Нельзя добавить в `set`
Изменяемые объекты (
Кортежи с изменяемыми элементами
Ставь 👍 и забирай 📚 Базу знаний
В Python множество (
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Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Строка — это последовательность или нет?
Да, в Python строка (str) — это последовательность символов, поддерживающая индексацию, срезы и итерируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, в Python строка (str) — это последовательность символов, поддерживающая индексацию, срезы и итерируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥1
🤔 Что такое многопоточность/многопроцессорность?
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (Multithreading)
Многопоточность позволяет одной программе запускать несколько потоков (threads), которые работают одновременно.
Вывод
🟠2. Многопроцессорность (Multiprocessing)
Многопроцессорность запускает отдельные процессы, которые работают полностью независимо и могут использовать разные ядра процессора.
Вывод (процессы действительно работают параллельно)
Ставь 👍 и забирай 📚 Базу знаний
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (Multithreading)
Многопоточность позволяет одной программе запускать несколько потоков (threads), которые работают одновременно.
import threading
import time
def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")
# Создаём два потока
t1 = threading.Thread(target=task, args=("Поток 1",))
t2 = threading.Thread(target=task, args=("Поток 2",))
t1.start()
t2.start()
t1.join()
t2.join()
print("Все потоки завершены")
Вывод
Поток 1 начал работу
Поток 2 начал работу
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены
🟠2. Многопроцессорность (Multiprocessing)
Многопроцессорность запускает отдельные процессы, которые работают полностью независимо и могут использовать разные ядра процессора.
import multiprocessing
import time
def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=task, args=("Процесс 1",))
p2 = multiprocessing.Process(target=task, args=("Процесс 2",))
p1.start()
p2.start()
p1.join()
p2.join()
print("Все процессы завершены")
Вывод (процессы действительно работают параллельно)
Процесс 1 начал работу
Процесс 2 начал работу
Процесс 1 завершил работу
Процесс 2 завершил работу
Все процессы завершены
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое self?
Это ссылка на текущий экземпляр класса, используемая для доступа к атрибутам и методам объекта.
Он всегда первым аргументом передаётся в методы экземпляра класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это ссылка на текущий экземпляр класса, используемая для доступа к атрибутам и методам объекта.
Он всегда первым аргументом передаётся в методы экземпляра класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥2💊1
🤔 Что такое CRUD?
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
🚩Разберем CRUD на примере работы с базой данных в Python
🟠Create (Создание)
Добавление новой записи в базу данных.
🟠Read (Чтение)
Получение данных из базы.
🟠Update (Обновление)
Изменение существующей записи.
🟠Delete (Удаление)
Удаление записи из базы.
Ставь 👍 и забирай 📚 Базу знаний
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
🚩Разберем CRUD на примере работы с базой данных в Python
🟠Create (Создание)
Добавление новой записи в базу данных.
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# Создаем таблицу, если её нет
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
# Добавляем пользователя
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Алиса",))
conn.commit() # Сохраняем изменения
conn.close()
🟠Read (Чтение)
Получение данных из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
users = cursor.fetchall() # Получаем все записи
for user in users:
print(user)
conn.close()🟠Update (Обновление)
Изменение существующей записи.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ("Боб", 1))
conn.commit()
conn.close()🟠Delete (Удаление)
Удаление записи из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()
conn.close()Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Какие типы HTTP запросов знаешь? В чем их отличия?
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1