Циклы — это конструкции языка, позволяющие повторять блок кода несколько раз. В Python есть два основных вида циклов: for — используется для итерирования по последовательностям и итераторам, и while — выполняется, пока истинно заданное условие. Циклы позволяют автоматизировать повторяющиеся действия.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1💊1
Асинхронность в Python позволяет не блокировать выполнение программы во время ожидания операций ввода-вывода (I/O). Это делает её намного быстрее в задачах, где программа тратит много времени на ожидание (например, загрузка файлов, работа с сетью, запросы к базам данных).
В обычном (синхронном) коде каждая операция ждёт завершения предыдущей.
import requests
import time
start = time.time()
def fetch(url):
response = requests.get(url) # Ждём ответа от сервера
return response.text
urls = ["https://example.com"] * 3
for url in urls:
fetch(url) # Ждём каждый запрос
print("Время выполнения:", time.time() - start)
Асинхронность в Python использует event loop (цикл событий), который позволяет не ждать выполнения операции, а переключаться на другие задачи.
import asyncio
import aiohttp
import time
start = time.time()
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com"] * 3
tasks = [fetch(url) for url in urls]
await asyncio.gather(*tasks) # Запускаем все запросы одновременно
asyncio.run(main())
print("Время выполнения:", time.time() - start)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
SQL (Structured Query Language) — это язык структурированных запросов, используемый для работы с реляционными базами данных: создание, чтение, изменение и удаление данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3💊2
В Python есть встроенные функции (built-in functions) — это функции, которые можно использовать без импорта. Они делают код проще и удобнее.
Полный список встроенных функций можно посмотреть так:
print(dir(__builtins__))
Работа с числами
print(abs(-5)) # 5
print(round(3.14159, 2)) # 3.14
print(pow(2, 3)) # 8
print(min([3, 1, 4])) # 1
Работа со строками
print(len("hello")) # 5
print(str(123)) # '123'
print(ord('A')) # 65
print(chr(65)) # 'A'
Работа с коллекциями (списки, кортежи, множества)
a = [3, 1, 2]
print(sorted(a)) # [1, 2, 3]
nums = [1, 2, 3]
names = ["Alice", "Bob", "Charlie"]
print(list(zip(nums, names))) # [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]
Работа с логикой и проверками
print(bool("")) # False
print(all([True, 1, "Hello"])) # True
print(any([0, "", None, 5])) # True (есть хотя бы один True)
Работа с функциями
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16]
evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]
Работа с файлами
with open("file.txt", "w") as f:
f.write("Hello, world!")
name = input("Введите имя: ")
print("Привет,", name)
Работа с объектами и атрибутами
print(type(42)) # <class 'int'>
print(isinstance(42, int)) # True
print(dir([])) # Методы списка
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Индексация, срезы, итерация и проверка на вхождение — общие операции для последовательностей. Также поддерживаются операции длины, конкатенации и умножения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Обработка исключений — это механизм в программировании, который позволяет предотвращать аварийное завершение программы, если во время выполнения возникает ошибка. Вместо того чтобы программа просто "упала", обработка исключений дает возможность перехватить ошибку и обработать её безопасным способом.
В реальном коде ошибки неизбежны:
деление на ноль (
ZeroDivisionError
), обращение к несуществующему индексу (
IndexError
), работа с несуществующим файлом (
FileNotFoundError
) и т. д. В Python для обработки исключений используется конструкция try-except.
Обработка деления на ноль
try:
x = 10 / 0 # Ошибка: деление на ноль
except ZeroDivisionError:
print("Ошибка! Деление на ноль невозможно.")
Результат: вместо аварийного завершения программы мы получаем сообщение
Ошибка! Деление на ноль невозможно.
Обработка нескольких типов исключений
try:
num = int(input("Введите число: ")) # Возможна ошибка ValueError
result = 10 / num # Возможна ошибка ZeroDivisionError
except ZeroDivisionError:
print("Ошибка! Деление на ноль.")
except ValueError:
print("Ошибка! Введите число.")
Если пользователь введет "abc", программа не завершится с ошибкой, а выведет
Ошибка! Введите число.
Использование
finally
(код, который выполняется всегда) try:
file = open("data.txt", "r") # Возможна ошибка FileNotFoundError
content = file.read()
except FileNotFoundError:
print("Файл не найден!")
finally:
print("Программа завершена.") # Выполнится в любом случае
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Это возможность класса наследовать от нескольких родительских классов. В Python такая конструкция допустима и реализуется через порядок разрешения методов (MRO), но требует осторожности из-за потенциальных конфликтов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность).
Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах.
Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр.
Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи).
Операции проверки принадлежности (
in
), добавления и удаления элементов работают очень быстро, благодаря использованию хэш-таблиц в реализации множества.Для создания пустого множества используется функция
set()
, так как {}
создаёт пустой словарьempty_set = set()
print(empty_set) # Output: set()
Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию
set()
. # Создание множества из списка
numbers = set([1, 2, 3, 4, 5])
print(numbers) # Output: {1, 2, 3, 4, 5}
# Создание множества из строки (уникальные символы)
chars = set("hello")
print(chars) # Output: {'h', 'e', 'l', 'o'} (порядок может быть разным)
Вы также можете использовать фигурные скобки
{}
для создания множестваfruits = {"apple", "banana", "cherry"}
print(fruits) # Output: {'apple', 'banana', 'cherry'}
Используется метод
add()
my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # Output: {1, 2, 3, 4}
remove()
— удаляет элемент, выбрасывая ошибку, если его нет.discard()
— удаляет элемент, не выбрасывая ошибку, если его нет.my_set = {1, 2, 3}
my_set.remove(2) # Удаляем элемент 2
print(my_set) # Output: {1, 3}
my_set.discard(5) # Ошибки не будет, если элемента 5 нет
pop()
— удаляет и возвращает случайный элемент (так как множество неупорядочено)my_set = {1, 2, 3}
removed_element = my_set.pop()
print(removed_element) # Например: 1
print(my_set) # Например: {2, 3}
my_set = {1, 2, 3}
my_set.clear()
print(my_set) # Output: set()
Используется оператор
in
my_set = {1, 2, 3}
print(2 in my_set) # Output: True
print(5 in my_set) # Output: False
Python поддерживает классические операции теории множеств:
Возвращает множество, содержащее все элементы из двух множеств.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2) # Output: {1, 2, 3, 4, 5}
print(set1.union(set2)) # То же самое
Возвращает элементы, которые присутствуют в обоих множествах.
print(set1 & set2) # Output: {3}
print(set1.intersection(set2)) # То же самое
Возвращает элементы, которые присутствуют только в одном множестве (а не в другом).
print(set1 - set2) # Output: {1, 2} (только в set1)
print(set1.difference(set2)) # То же самое
Возвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
print(set1 ^ set2) # Output: {1, 2, 4, 5}
print(set1.symmetric_difference(set2)) # То же самое
Если вам нужно создать множество, которое нельзя изменить, используйте
frozenset
frozen = frozenset([1, 2, 3])
print(frozen) # Output: frozenset({1, 2, 3})
# frozen.add(4) # Ошибка: 'frozenset' object has no attribute 'add'
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Библиотека Pydantic валидирует и преобразует данные согласно типам:
- Примитивы (str, int, float, bool)
- Коллекции (List, Dict, Tuple, Set)
- Даты и UUID
- Вложенные модели
Pydantic полезен при создании API (например, с FastAPI), где входящие данные из запросов должны быть проверены и типизированы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
Добавление новой записи в базу данных.
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()
Получение данных из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
users = cursor.fetchall() # Получаем все записи
for user in users:
print(user)
conn.close()
Изменение существующей записи.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ("Боб", 1))
conn.commit()
conn.close()
Удаление записи из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()
conn.close()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
- REST — архитектурный стиль. Использует HTTP-методы (GET, POST, PUT, DELETE), ресурсы представлены как URL (например, /users/1).
- RPC (Remote Procedure Call) — модель, в которой клиент вызывает конкретную функцию или метод на сервере, как будто она локальная (getUserData, saveOrder).
REST работает с ресурсами, RPC — с действиями. REST проще кэшировать, а RPC может быть более гибким в функциональности.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
Блокировка (lock) — это механизм, который предотвращает одновременный доступ к данным разными транзакциями, чтобы избежать конфликтов, повреждения данных или "гонки" процессов.
Представь, что два человека редактируют один и тот же документ. Если они начнут менять его одновременно, файл может испортиться. Блокировки в БД работают так же — если один процесс изменяет данные, другой должен подождать, пока первый закончит.
предотвращает одновременные изменения одних и тех же строк.
когда два запроса пытаются изменить одно и то же значение.
разные операции не мешают друг другу.
Строчная (Row Lock) – блокирует только одну строку таблицы.
Табличная (Table Lock) – блокирует всю таблицу целиком.
Блокировка всей базы (Database Lock) – редко используется, но блокирует всю БД.
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE; -- Блокирует строку, пока транзакция не завершится
Эксклюзивная (Exclusive, X-Lock) – блокирует запись для всех (никакие другие операции её не изменят).
Разделяемая (Shared, S-Lock) – блокирует только на запись (чтение возможно).
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- Пока транзакция не завершится, другая транзакция не сможет изменить balance пользователя 1.
Явные (ручные) – задаются программистом (
SELECT ... FOR UPDATE
). Неявные (автоматические) – создаются СУБД при
INSERT
, UPDATE
, DELETE
. Если два запроса ждут друг друга, система "зависает". Решение: правильный порядок выполнения транзакций.
Если транзакция не закрывается (
COMMIT
/ROLLBACK
), другие запросы ждут бесконечно. Решение: короткие транзакции, автоматическое завершение. Чем больше блокировок, тем медленнее работа БД.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
Host (хост) — это устройство или сервер, подключённый к сети, который может предоставлять или запрашивать данные.
GET /index.html HTTP/1.1
Host: example.com
Когда браузер запрашивает сайт, он отправляет заголовок
Host
, чтобы сервер знал, какой сайт нужно отдать. GET / HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0
Host — это доменное имя, привязанное к IP-адресу.
-
example.com
→ 192.168.1.100
-
mail.example.com
→ 192.168.1.101
127.0.0.1 mysite.local
Внутри сети устройства тоже считаются хостами (
192.168.1.10
, 192.168.1.20
). localhost
(127.0.0.1
) — это всегда локальный компьютер.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Динамическая типизация означает, что тип переменной определяется автоматически в момент её инициализации.
Это упрощает код, но может привести к ошибкам в случае некорректного использования типов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1🤔1
Сортировка слиянием (
Merge Sort
) — это алгоритм, который использует разделяй и властвуй (divide & conquer). В худшем случае сложность O(n log n).
до тех пор, пока не останутся отдельные элементы.
полученные подмассивы.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
sorted_arr = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_arr.append(left[i])
i += 1
else:
sorted_arr.append(right[j])
j += 1
sorted_arr.extend(left[i:])
sorted_arr.extend(right[j:])
return sorted_arr
arr = [5, 2, 9, 1, 5, 6]
print(merge_sort(arr))
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2. Объектно-ориентированная: работа с классами и объектами.
3. Функциональная: поддержка высших функций, замыканий и итераторов.
4. Процедурная: выполнение программ как последовательности процедур.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Это такие типы данных, которые имеют постоянное (неизменяемое) хеш-значение на протяжении всего времени их существования. Это означает, что их можно использовать в качестве ключей в словарях (
dict
) и элементов в множествах (set
), так как они поддерживают вычисление хеша с помощью функции hash()
.если объект можно изменить после создания, его хеш тоже изменится, что нарушает работу структур данных (словари, множества).
который возвращает уникальный идентификатор объекта.
Числа (
int
, float
, complex
)print(hash(42)) # 42
print(hash(3.14)) # 322818021289917443
print(hash(1 + 2j)) # 8389048192121911274
Строки (
str
)print(hash("hello")) # Например, 5320385861927423548
Кортежи (
tuple
), если все их элементы тоже хешируемые:print(hash((1, 2, 3))) # 529344067295497451
Булевы значения (
bool
):print(hash(True)) # 1
print(hash(False)) # 0
Списки (
list
)hash([1, 2, 3]) # TypeError: unhashable type: 'list'
Множества (
set
)hash({1, 2, 3}) # TypeError: unhashable type: 'set'
Словари (
dict
)hash({"a": 1}) # TypeError: unhashable type: 'dict'
Хешируемые типы используются в словари (
dict
) и множества (set
), так как они используют хеш-функцию для быстрого поиска данных.my_dict = { (1, 2, 3): "tuple_key" } # Работает, потому что кортеж неизменяемый
my_set = { 42, "hello", (1, 2) } # Все элементы хешируемые
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Python ищет переменные по правилу LEGB:
- Local — локальная область внутри функции.
- Enclosing — области вложенных функций (для замыканий).
- Global — глобальная область модуля.
- Built-in — встроенные объекты Python.
Поиск идёт сверху вниз, и как только переменная найдена — поиск останавливается.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Хвостовая рекурсия (tail recursion) — это особый вид рекурсии, когда рекурсивный вызов является последней операцией в функции. В языках, поддерживающих оптимизацию хвостовой рекурсии (TCO – Tail Call Optimization), такие вызовы не создают новый стек вызовов, а переиспользуют текущий, что предотвращает переполнение стека.
Но в Python хвостовая рекурсия НЕ оптимизируется из-за особенностей интерпретатора (Python хранит полную историю вызовов для отладки).
Лучший способ избежать проблем с глубокой рекурсией — заменить её циклом.
def factorial(n, acc=1):
if n == 0:
return acc
return factorial(n - 1, acc * n) # Хвостовая рекурсия (но Python не оптимизирует!)
Решение: заменить на цикл (итеративный подход)
def factorial_iter(n):
acc = 1
while n > 0:
acc *= n
n -= 1
return acc
print(factorial_iter(10000)) # Работает без ошибок
Python имеет ограничение на глубину рекурсии (обычно около
1000
). Можно его увеличитьimport sys
sys.setrecursionlimit(20000) # Увеличение лимита
Если рекурсивная функция пересчитывает одни и те же значения, можно кешировать результаты.
from functools import lru_cache
@lru_cache(None) # Кеширует все вызовы функции
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(100)) # Работает быстро, без переполнения стека
Если алгоритм требует рекурсии, но стек ограничен, можно использовать список как стек.
def factorial_stack(n):
stack = [(n, 1)]
while stack:
n, acc = stack.pop()
if n == 0:
return acc
stack.append((n - 1, acc * n))
print(factorial_stack(10000)) # Работает без ошибок
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5