Pythoner
7.22K subscribers
860 photos
27 videos
4 files
654 links
Полезные материалы по Python, которые будут интересны опытному и начинающему разработчику.

Сотрудничество - @flattys
Цены - @serpent_media

Канал на бирже: https://telega.in/c/pythonercode
Download Telegram
🤔Разбор

sorted("Python") → ['P', 'h', 'n', 'o', 't', 'y'].
[::-1] переворачивает список → ['y', 't', 'o', 'n', 'h', 'P'].
[0] возвращает первый элемент → "y".


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥7👀2👍1
✈️В FastAPI есть мощный инструмент для управления ресурсами приложения – @ asynccontextmanager в связке с lifespan. Это позволяет выполнить код инициализации при запуске и очистки при завершении приложения.

➡️Зачем это нужно?
- Подготовка базы данных: Создание таблиц, миграции.
- Инициализация соединений: Подключение к 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 приложения!

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍32🔥1
➡️В Python is проверяет, один ли это объект в памяти, а не равны ли значения:
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:
...


🔫Неправильное использование is может вызвать странные баги, особенно в сравнениях. Будь точен — is не для значений.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍844🔥2
✈️Dict comprehension – это удобный способ создания словарей в одну строку, используя генераторы. Он позволяет преобразовывать данные компактно и эффективно.

➡️Основной синтаксис:
{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}


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍72🔥2🤬1
✈️Context Manager в Python - это объект, который позволяет работать с ресурсами в блоках кода с помощью ключевого слова "with". Context Manager предоставляет возможность автоматически захватывать и освобождать ресурсы, такие как файлы, сокеты, соединения с базами данных и т. д.

➡️Основные возможности контекстных менеджеров:
- Автоматическое управление ресурсами: Контекстные менеджеры автоматически управляют ресурсами, что позволяет избежать утечек и ошибок.

- Поддержка различных ресурсов: Контекстные менеджеры могут использоваться для управления различными ресурсами, такими как файлы, сетевые соединения, базы данных и другие.

- Создание собственных контекстных менеджеров: Вы можете создавать свои собственные контекстные менеджеры, используя протокол контекстных менеджеров.

➡️Примеры:
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 удобен и надежен для работы с ресурсами, так как гарантирует их корректное освобождение и упрощает работу с ними.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍732🔥1
✈️Функция filter() в Python используется для фильтрации элементов из итерируемого объекта (например, списка, кортежа и т.д.) на основе заданного условия. Она принимает два аргумента: функцию и итерируемый объект.

Функция должна возвращать True или False для каждого элемента, и filter() вернет только те элементы, для которых функция вернула True.

➡️Синтаксис:
filter(function, iterable)


- function: Функция, которая проверяет каждый элемент. Если None, то возвращаются все элементы, которые являются истинными (truthy).
- iterable: Итерируемый объект, который нужно фильтровать.

➡️Пример. filter() для фильтрации четных чисел из списка::
# Функция, которая проверяет, является ли число четным
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]


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍105🔥32
✈️Устал от REST с кучей эндпоинтов? Взгляни на GraphQL — один гибкий запрос вместо 5 ручек.

➡️Для Python есть два удобных инструмента:
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

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
73👍3🔥1
➡️В современном мире базы данных являются неотъемлемой частью многих приложений. Однако, перед выбором базы данных, необходимо понимать различия между типами баз данных. Сегодня мы рассмотрим разницу между SQL и NoSQL базами данных.

➡️SQL базы данных:
SQL (Structured Query Language) - это язык программирования, который используется для управления реляционными базами данных. SQL базы данных используют таблицы для хранения информации, а каждая таблица состоит из строк и столбцов. SQL базы данных поддерживают транзакции, что обеспечивает целостность данных. Они также легко масштабируются, что позволяет управлять большими объемами данных.

➡️NoSQL базы данных:
NoSQL (Not Only SQL) базы данных - это новый тип баз данных, который не использует традиционные таблицы для хранения информации. Вместо этого, они используют документы, ключи и значения, графы или колоночные семейства. NoSQL базы данных были созданы для управления большими объемами данные с высокой скоростью и производительностью. Они также легко масштабируются, что делает их отличным выбором для приложений, которые необходимо расширять.

➡️Различия между SQL и NoSQL базами данных:
Основное различие между SQL и NoSQL базами данных заключается в том, как они хранят и управляют данными. SQL базы данных используют таблицы, которые связаны друг с другом по ключам внешних таблиц. NoSQL базы данных используют документы, ключи и значения, графы или колоночные семейства, которые могут хранить неструктурированные данные. SQL базы данных имеют строгую схему, что означает, что каждый элемент данных должен соответствовать заданной схеме. NoSQL базы данных, с другой стороны, не имеют строгой схемы, что позволяет добавлять данные без необходимости изменения схемы.

🐍 Pythoner
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


💡Заключение:
Это полезно для логирования, измерения времени работы функций и других задач.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3🔥31
7🔥3
Что выдаст код выше
Anonymous Quiz
55%
hello
34%
hello world
3%
world
7%
Error
6👍3👌2
🤔Разбор

Всё просто! Функция не изменяет исходную переменную string, потому что строки неизменяемы и присваивание внутри функции не влияет на внешние переменные.
Поэтому print(string) выведет: hello


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
105🔥5
✈️Python использует оптимизации хранения неизменяемых объектов, чтобы ускорить работу и экономить память.

➡️Small Integer Cache
Числа от -5 до 256 кешируются и переиспользуются:
a = 256
b = 256
print(a is b) # True

c = 257
d = 257
print(c is d) # False (новые объекты)

🔫Это работает, потому что Python заранее создаёт эти числа в памяти.

➡️String Interning
Короткие строки и строки, состоящие только из букв и _, могут кешироваться:
s1 = "hello"
s2 = "hello"
print(s1 is s2) # True

s3 = "hello world!"
s4 = "hello world!"
print(s3 is s4) # False (слишком длинная строка)

🔫Используется в компиляторе Python для ускорения работы со строками.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍2🔥21
✈️Метод .bit_count() - это новый метод в Python, который возвращает количество единичных битов в двоичном представлении числа. Этот метод был впервые введен в Python 3.10 и может быть очень полезен в некоторых специфических сценариях.

➡️Как использовать .bit_count()?
Для использования метода .bit_count() вам просто нужно вызвать его на числовом значении. Это возвращает количество единичных битов в двоичном представлении числа. Например, число 7 в двоичном формате представляется как 111. (3 по 1)
print((7).bit_count())  # выводит: 3


➡️Когда .bit_count() был введен?
Метод .bit_count() был введен в Python 3.10. Этот метод был добавлен для более эффективной работы с битами и двоичными данными.

➡️Примеры использования .bit_count()
# Пример с маской подсети
subnet_mask = 0b11111111_11111111_11111111_00000000
print(subnet_mask.bit_count()) # выводит: 24

# Пример с битовым флагом
bit_flag = 0b1001
print(bit_flag.bit_count()) # выводит: 2


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥2
➡️PostgreSQL

PostgreSQL - это реляционная система управления базами данных (СУБД), использующая язык SQL для запросов. Она была разработана в университете Беркли и является одной из самых надежных и производительных СУБД на рынке. PostgreSQL предоставляет мощные функциональные возможности, включая поддержку многопользовательских сред и транзакций. PostgreSQL также имеет встроенную поддержку геоданных и полнотекстового поиска.

➡️MySQL

MySQL - это также реляционная СУБД, которая используется для хранения и управления данными. MySQL была приобретена компанией Oracle Corporation в 2010 году. MySQL является одной из самых популярных СУБД на рынке, и она широко используется в веб-разработке. MySQL предоставляет множество функций, включая поддержку транзакций и многопользовательских сред, а также хорошо работает с большими объемами данных.

➡️При сравнении PostgreSQL и MySQL можно сказать, что обе СУБД имеют свои преимущества и недостатки. PostgreSQL обычно используется в крупных проектах, где необходима высокая надежность и производительность. Она также имеет более продвинутые функциональные возможности, такие как поддержка геоданных и полнотекстового поиска. Однако PostgreSQL может быть сложной для настройки и использования, особенно для новичков.

➡️MySQL, с другой стороны, обычно используется для небольших и средних проектов. Она легче в использовании и настройке, чем PostgreSQL, и предоставляет хорошую производительность для больших объемов данных. Однако MySQL имеет ограниченную поддержку функций и может быть менее надежной, чем PostgreSQL.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113🔥2
✈️Docker - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеры позволяют упаковать приложения и все необходимые для их работы компоненты в одну единицу, которая может быть легко перенесена между окружениями.

➡️Контейнеры и образы

Docker использует контейнеры для упаковки и запуска приложений. Контейнеры представляют собой изолированные среды, которые содержат все необходимые компоненты для работы приложения. Контейнеры создаются из образов, которые являются основой для контейнеров. Образы содержат все необходимые компоненты, включая операционную систему, библиотеки и зависимости приложения.

➡️Dockerfile

Dockerfile - это текстовый файл, который содержит инструкции для создания Docker-образа. Dockerfile определяет операционную систему, настройки окружения, установку зависимостей и т. д. Создание Docker-образа с помощью Dockerfile позволяет автоматизировать процесс сборки и развертывания приложения.

➡️Docker Compose

Docker Compose - это инструмент для определения и запуска многоконтейнерных Docker-приложений. Docker Compose использует файл docker-compose.yml для определения сервисов, которые необходимо запустить, а также их настроек. Docker Compose позволяет легко запускать и масштабировать приложения, состоящие из нескольких сервисов.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍106🔥2
✈️Библиотека itertools позволяет легко работать с перестановками и комбинациями.

➡️Перестановки (permutations) создают все возможные порядки элементов:
from itertools import permutations

items = [1, 2, 3]
print(list(permutations(items, 2)))
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]


➡️Комбинации (combinations) выбирают элементы без учета порядка:
from itertools import combinations

print(list(combinations(items, 2)))
# [(1, 2), (1, 3), (2, 3)]


💡Заключение:
Это очень полезно для генерации вариантов решений, паролей или анализа данных!

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83🔥3
✈️Когда ваша функция часто вызывается с одинаковыми параметрами, можно значительно повысить её производительность с помощью кэширования. В Python для этого есть удобный декоратор functools.lru_cache(), который запоминает результаты вызовов и при повторных обращениях с теми же аргументами просто возвращает сохранённый результат, не выполняя вычисления заново.

➡️Пример использования:
from functools import lru_cache

@lru_cache(maxsize=128) # Ограничиваем объем кэша
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)

print(factorial(50)) # Результат будет кэширован


💡Как работает?
- При первом вызове функции с определёнными аргументами результат сохраняется в кэше.
- При последующих вызовах с теми же аргументами результат берётся из кэша без повторных вычислений.
- Когда кэш заполняется, старые записи удаляются согласно принципу LRU (Least Recently Used — наименее часто используемые).

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6🔥4
Forwarded from IT memer
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣125🔥3😁2👍1
✈️FastAPI поддерживает механизм Content Negotiation — это способ договориться, в каком формате клиент хочет получить ответ: JSON, HTML, XML и т.д.

➡️Как это работает?
Клиент отправляет в заголовке:
Accept: application/json

FastAPI проверяет Accept и возвращает наиболее подходящий формат, если он доступен.

➡️Пример:
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, HTMLResponse

app = FastAPI()

@app.get("/")
async def get_root(request: Request):
if "text/html" in request.headers.get("accept", ""):
return HTMLResponse(content="<h1>Hello, HTML!</h1>")
return JSONResponse(content={"message": "Hello, JSON!"})


🔫В зависимости от Accept, клиент получит либо JSON, либо HTML.

➡️Подходит для:

• REST API с возможностью HTML-ответа (Swagger, docs)
• API, которые отдают разный формат в зависимости от платформы (например, Web vs Mobile)

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍6🔥4