А ведь он нужен там, где что бы ни случилось — надо прибраться:
1. Закрытие файлов / соединений:
f = open("data.txt")
try:
process(f)
finally:
f.close() # всегда выполнится2. Откат транзакций:
try:
db.begin()
db.do_stuff()
finally:
db.rollback_or_commit()
3. Остановка фоновых задач:
try:
start_worker()
finally:
stop_worker()
Это твоя гарантированная уборка.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4👍4⚡2
import secrets
# Хранение паролей
password_storage = {}
# Функция для создания и хранения хэша пароля
def store_password(username, password):
# Генерация случайного токена
token = secrets.token_hex(16)
password_storage[username] = {'token': token, 'password': password}
# Проверка пароля
def verify_password(username, provided_password):
if username in password_storage:
stored_password = password_storage[username]['password']
# Сравнение паролей с использованием secrets.compare_digest
return secrets.compare_digest(stored_password, provided_password)
return False
# Использование
store_password("user1", "my_secure_password")
# Проверка входящего пароля
if verify_password("user1", "my_secure_password"):
print("Пароль верный!")
else:
print("Неверный пароль.")
- Библиотека
secrets используется для генерации криптографически стойкого токена, который можно хранить, но в этом примере основной акцент сделан на безопасном сравнении паролей.- Функция
compare_digest сравнивает пароли безопасным способом, защищая от тайминговых атак.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍7⚡2🔥2
Во многих языках (
- Читаемость — код без лишних
- Принудительная структурность — нельзя "забыть закрыть скобку".
- Исторический фактор — Гвидо ван Россум вдохновлялся языком ABC.
➡️ Пример кода на Python:
➡️ Тот же код на C:
🐍 Pythoner
C, Java, JavaScript) блоки кода обозначаются {}. В Python же используются отступы. Почему так?- Читаемость — код без лишних
{} и end выглядит чище.- Принудительная структурность — нельзя "забыть закрыть скобку".
- Исторический фактор — Гвидо ван Россум вдохновлялся языком ABC.
for i in range(3):
print(i) # Отступ обязателен
for (int i = 0; i < 3; i++) {
printf("%d\n", i);
}Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤4👍4
🤔6🤷♀5❤2🤨1
sorted("Python") → ['P', 'h', 'n', 'o', 't', 'y'].
[::-1] переворачивает список → ['y', 't', 'o', 'n', 'h', 'P'].
[0] возвращает первый элемент → "y".
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11🔥7👀2👍1
- Подготовка базы данных: Создание таблиц, миграции.
- Инициализация соединений: Подключение к Redis, Kafka.
- Очистка ресурсов: Закрытие соединений, удаление временных файлов.
Декоратор @ asynccontextmanager создает асинхронный контекстный менеджер. Функция lifespan определяет, какой код выполняется до и после запуска приложения.
from contextlib import asynccontextmanager
from fastapi import FastAPI
# (Предположим, у вас есть функции create_db и close_db)
async def create_db():
print("Подключаемся к базе данных...")
# Здесь будет код подключения к БД
await asyncio.sleep(1) # Имитация асинхронной операции
print("База данных подключена!")
async def close_db():
print("Закрываем соединение с базой данных...")
# Здесь будет код закрытия соединения с БД
await asyncio.sleep(1) # Имитация асинхронной операции
print("Соединение с базой данных закрыто!")
@asynccontextmanager
async def lifespan(app: FastAPI):
print("Запуск приложения...")
await create_db()
yield
print("Завершение приложения...")
await close_db()
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root():
return {"message": "Hello World"}
# Запуск: uvicorn main:app --reload
- При запуске FastAPI (uvicorn main:app --reload) выполнится код до yield (создание таблиц).
- При остановке FastAPI выполнится код после yield (удаление таблиц).
lifespan + @ asynccontextmanager - это чистый и эффективный способ управлять ресурсами вашего FastAPI приложения!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3⚡2🔥1
a = 1000
b = 1000
print(a is b) # False
Даже если
a == b, a is b может вернуть False, потому что это разные объекты. Python кэширует только небольшие числа и короткие строки.if value is "test": # ❌
Правильно:
if value == "test": # ✅
is уместен?Только для сравнения с singleton'ами, такими как:
if x is None:
...
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4⚡4🔥2
{key: value for item in iterable}numbers = [1, 2, 3, 4]
squared = {x: x**2 for x in numbers}
print(squared) # {1: 1, 2: 4, 3: 9, 4: 16}
original = {"a": 10, "b": 20, "c": 30}
filtered = {k: v for k, v in original.items() if v > 15}
print(filtered) # {'b': 20, 'c': 30}text = "hello"
char_count = {char: text.count(char) for char in set(text)}
print(char_count) # {'o': 1, 'l': 2, 'e': 1, 'h': 1}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍7⚡2🔥2🤬1
- Автоматическое управление ресурсами: Контекстные менеджеры автоматически управляют ресурсами, что позволяет избежать утечек и ошибок.
- Поддержка различных ресурсов: Контекстные менеджеры могут использоваться для управления различными ресурсами, такими как файлы, сетевые соединения, базы данных и другие.
- Создание собственных контекстных менеджеров: Вы можете создавать свои собственные контекстные менеджеры, используя протокол контекстных менеджеров.
1. Создание контекстного менеджера с помощью класса:
class MyResource:
def __enter__(self):
print("Resource opened")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("Resource closed")
# Использование контекстного менеджера
with MyResource() as resource:
print("Inside with block")
2. Работа с сетевыми соединениями:
import socket
class SocketManager:
def __init__(self, host, port):
self.host = host
self.port = port
self.socket = None
def __enter__(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
return self.socket
def __exit__(self, exc_type, exc_val, exc_tb):
self.socket.close()
# Использование контекстного менеджера
with SocketManager('example.com', 80) as sock:
sock.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = sock.recv(4096)
print(response.decode())
Context Manager в Python удобен и надежен для работы с ресурсами, так как гарантирует их корректное освобождение и упрощает работу с ними.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3⚡2🔥1
Функция должна возвращать
True или False для каждого элемента, и filter() вернет только те элементы, для которых функция вернула True.filter(function, iterable)
- function: Функция, которая проверяет каждый элемент. Если None, то возвращаются все элементы, которые являются истинными (truthy).
- iterable: Итерируемый объект, который нужно фильтровать.
# Функция, которая проверяет, является ли число четным
def is_even(n):
return n % 2 == 0
# Исходный список
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Фильтрация четных чисел
even_numbers = filter(is_even, numbers)
# Преобразуем результат в список и выводим
even_numbers_list = list(even_numbers)
print(even_numbers_list) # Вывод: [2, 4, 6, 8, 10]
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5🔥3⚡2
1. Strawberry:
На базе dataclass + type hints = лаконично и читаемо.
@strawberry.type
class User:
name: str
@strawberry.type
class Query:
@strawberry.field
def hello(self) -> str:
return "Привет!"
schema = strawberry.Schema(Query)
Работает с FastAPI и ASGI
2.Ariadne:
GraphQL-схема через SDL (как в JS/GraphQL-ecosystem). Гибкость + контроль:
type_defs = """
type Query {
hello: String!
}
"""
@query.field("hello")
def resolve_hello(_, info):
return "Привет из Ariadne"
Легко интегрируется с Starlette / FastAPI, поддерживает subscriptions
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7⚡3👍3🔥1
SQL (Structured Query Language) - это язык программирования, который используется для управления реляционными базами данных. SQL базы данных используют таблицы для хранения информации, а каждая таблица состоит из строк и столбцов. SQL базы данных поддерживают транзакции, что обеспечивает целостность данных. Они также легко масштабируются, что позволяет управлять большими объемами данных.
NoSQL (Not Only SQL) базы данных - это новый тип баз данных, который не использует традиционные таблицы для хранения информации. Вместо этого, они используют документы, ключи и значения, графы или колоночные семейства. NoSQL базы данных были созданы для управления большими объемами данные с высокой скоростью и производительностью. Они также легко масштабируются, что делает их отличным выбором для приложений, которые необходимо расширять.
Основное различие между SQL и NoSQL базами данных заключается в том, как они хранят и управляют данными. SQL базы данных используют таблицы, которые связаны друг с другом по ключам внешних таблиц. NoSQL базы данных используют документы, ключи и значения, графы или колоночные семейства, которые могут хранить неструктурированные данные. SQL базы данных имеют строгую схему, что означает, что каждый элемент данных должен соответствовать заданной схеме. NoSQL базы данных, с другой стороны, не имеют строгой схемы, что позволяет добавлять данные без необходимости изменения схемы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥4👍3
__call__ позволяет использовать класс как декоратор:class Logger:
def __call__(self, func):
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с аргументами {args} {kwargs}")
result = func(*args, **kwargs)
print(f"Результат: {result}")
return result
return wrapper
@Logger()
def add(a, b):
return a + b
add(3, 4)
# Вызов add с аргументами (3, 4) {}
# Результат: 7
Это полезно для логирования, измерения времени работы функций и других задач.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🔥3⚡1
❤6👍3👌2
Всё просто! Функция не изменяет исходную переменную string, потому что строки неизменяемы и присваивание внутри функции не влияет на внешние переменные.
Поэтому print(string) выведет: hello
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10⚡5🔥5
Числа от -5 до 256 кешируются и переиспользуются:
a = 256
b = 256
print(a is b) # True
c = 257
d = 257
print(c is d) # False (новые объекты)
Короткие строки и строки, состоящие только из букв и _, могут кешироваться:
s1 = "hello"
s2 = "hello"
print(s1 is s2) # True
s3 = "hello world!"
s4 = "hello world!"
print(s3 is s4) # False (слишком длинная строка)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍2🔥2⚡1
Для использования метода .bit_count() вам просто нужно вызвать его на числовом значении. Это возвращает количество единичных битов в двоичном представлении числа. Например, число 7 в двоичном формате представляется как 111. (3 по 1)
print((7).bit_count()) # выводит: 3
Метод .bit_count() был введен в Python 3.10. Этот метод был добавлен для более эффективной работы с битами и двоичными данными.
# Пример с маской подсети
subnet_mask = 0b11111111_11111111_11111111_00000000
print(subnet_mask.bit_count()) # выводит: 24
# Пример с битовым флагом
bit_flag = 0b1001
print(bit_flag.bit_count()) # выводит: 2
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🔥2
PostgreSQL - это реляционная система управления базами данных (СУБД), использующая язык SQL для запросов. Она была разработана в университете Беркли и является одной из самых надежных и производительных СУБД на рынке. PostgreSQL предоставляет мощные функциональные возможности, включая поддержку многопользовательских сред и транзакций. PostgreSQL также имеет встроенную поддержку геоданных и полнотекстового поиска.
MySQL - это также реляционная СУБД, которая используется для хранения и управления данными. MySQL была приобретена компанией Oracle Corporation в 2010 году. MySQL является одной из самых популярных СУБД на рынке, и она широко используется в веб-разработке. MySQL предоставляет множество функций, включая поддержку транзакций и многопользовательских сред, а также хорошо работает с большими объемами данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3🔥2