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

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

Канал на бирже: https://telega.in/c/pythonercode
Download Telegram
✈️В Python почти всё рассматривается как объект: числа, строки, функции, классы и модули — всё это объекты. Тем не менее, есть некоторые элементы, которые объектами не являются:

➡️Операторы и синтаксис:
Операторы (например, +, -, *, and, or, not и другие) — это части языка, которые не представлены как объекты в памяти.

➡️Аннотации типов:
Аннотации типов, такие как list[str], не создают объекты во время выполнения программы, а используются лишь для статического анализа кода.
def func(x: int) -> str:
return str(x)


➡️Имена переменных:
Имена переменных — это просто ссылки на объекты, а не сами объекты. Переменная указывает на объект в памяти, но сама по себе не объект.
x = 42  # 'x' — это имя, а не объект
print(type(x)) # Объектом является число 42, а не имя 'x'


➡️Ключевые слова:
Ключевые слова Python (if, else, while, for, def, class, return и т.д.) — это зарезервированные слова, которые используются для управления логикой программы, и они не являются объектами.
print(type(if))  # Ошибка: ключевое слово не объект


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍5🔥4
✈️Декоратором называется функция, которая принимает функцию с таким же именем, как у исходной, но с расширенной функциональностью. Декораторы часто используются во фреймворках, чтобы упростить интеграцию пользовательских функций с фреймворком.

➡️Паттерн Декоратор настолько полезен, что в Python встроена специальная поддержка для него. Декорировать можно как функции, так и методы.

➡️Кроме того, Python поддерживает декораторы классов: функции, которые принимают класс в качестве аргумента и возвращают новый класс с таким же именем, как у исходного, но с дополненной функциональностью.

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

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍5🔥3
👍9👌3
Что выдаст код выше
Anonymous Quiz
3%
1
19%
True
9%
0
54%
False
14%
Error
🤔8🤨32🤓2
🤔Разбор

Функция any() используется для проверки наличия хотя бы одного True элемента в итерируемом объекте.
У нас есть:
False —> False
0 —> False
[] —> пустой список —> False
() —> пустой кортеж —> False

Все элементы - False, а функция any() требует хотя бы один True.
Ответ: False


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
135🔥5
🌐GitLab - это веб-платформа для управления репозиториями Git, используемыми для хранения и управления исходным кодом приложений. Это инструмент для разработки программного обеспечения, который предоставляет широкий набор функций, в том числе управление версиями, совместную работу, непрерывную интеграцию и непрерывную доставку.

➡️Управление версиями

Одной из основных функций GitLab является управление версиями. Эта функция позволяет разработчикам сохранять различные версии кода, которые могут быть использованы для восстановления предыдущих версий при необходимости. Благодаря системе контроля версий, которая реализована в GitLab, разработчики могут работать над одним и тем же проектом, не опасаясь потерять свою работу.

➡️Совместная работа

GitLab также предоставляет широкие возможности для совместной работы над проектами. Разработчики могут создавать задачи, определять приоритеты и назначать ответственных за их выполнение. Это позволяет упростить коммуникацию между разработчиками и ускорить процесс разработки.

➡️Непрерывная интеграция и доставка

GitLab также предоставляет инструменты для непрерывной интеграции и доставки (CI/CD), что позволяет автоматизировать процесс сборки, тестирования и развертывания кода. Это ускоряет процесс разработки и повышает качество кода.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍2🔥2
✈️Requests-HTML — это библиотека Python, которая объединяет простоту Requests и мощность PyQuery для парсинга HTML. Она позволяет не только извлекать данные из веб-страниц, но и выполнять JavaScript, что делает её идеальным инструментом для веб-скрапинга современных сайтов с динамическим контентом.

➡️Основные возможности Requests-HTML:
- Парсинг HTML: Requests-HTML предоставляет удобные методы для парсинга HTML-документов с помощью CSS-селекторов и XPath.

- Выполнение JavaScript: Библиотека может выполнять JavaScript на странице, что позволяет получать данные, загруженные динамически.

- Сессии и куки: Поддерживает работу с сессиями и куки, что полезно для авторизации и поддержания состояния.

➡️Примеры использования:
1. Парсинг HTML с CSS-селекторами:
from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://example.com')

# Извлечение заголовков
titles = r.html.find('h1')
for title in titles:
print(title.text)


2. Выполнение JavaScript:
from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://example.com')

# Выполнение JavaScript на странице
r.html.render()

# Извлечение динамического контента
dynamic_content = r.html.find('#dynamic-element', first=True)
print(dynamic_content.text)


Полезные ссылки:
Официальный сайт
GitHub

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍107🔥2
✈️Пагинация — это разбиение большого списка данных на страницы. Она помогает не перегружать интерфейс и backend. Например, когда выводим 10 товаров на страницу, а не все 1000 сразу.

➡️Вот простой пример пагинации с использованием Python и Flask:
from flask import Flask, request, jsonify

app = Flask(__name__)

# Наши "данные" — список из 100 чисел
DATA = list(range(1, 101))

@app.route('/items')
def get_items():
# Получаем параметры из запроса
page = int(request.args.get('page', 1))
per_page = int(request.args.get('per_page', 10))

# Вычисляем границы
start = (page - 1) * per_page
end = start + per_page

# Отдаём нужный кусок
return jsonify({
'page': page,
'per_page': per_page,
'items': DATA[start:end]
})

if __name__ == '__main__':
app.run(debug=True)


🔫Пример запроса:
http://localhost:5000/items?page=3&per_page=5

#Ответ: элементы с 11 по 15


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94🔥3
👍5👀4👌2
Что выдаст код выше
Anonymous Quiz
5%
3, 3, 3
9%
3, 6, 9
4%
9, 6, 3
64%
3, 9, 27
18%
Error
🤔7🤨4👍3🤓2
🤔Разбор

Лямбда-функция принимает x и возвращает кортеж (x, x ** 2, x ** 3)
Для x = 3: (3, 3нкция приним3) (3, 9, 27)


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍3🔥2
✈️Функция .strip() в Python по умолчанию удаляет пробелы в начале и конце строки. Это может быть особенно полезно при работе с данными, которые могут содержать случайные пробелы, которые могут помешать анализу данных или программированию. Например, строка ' Привет, мир! ' станет 'Привет, мир!' после использования .strip().

s = '     Привет, мир!     '
print(s.strip()) # Выведет: 'Привет, мир!'


➡️.strip() с аргументами
В дополнение к удалению пробелов, .strip() также может быть использован для удаления определенных символов из строки, передав их в качестве аргумента. Например, если мы хотим удалить определенный символ, такой как '#', из строки, мы можем это сделать, вызвав .strip('#'). Это удалит все экземпляры '#' из начала и конца строки.

s = '###Привет, мир!###'
print(s.strip('#')) # Выведет: 'Привет, мир!'


➡️.lstrip() и .rstrip()
Python также предлагает две вариации функции .strip(), которые являются .lstrip() и .rstrip(). Эти функции работают так же, как .strip(), но .lstrip() удаляет символы только с левой стороны строки, а .rstrip() - только с правой стороны.

s = '###Привет, мир!###'
print(s.lstrip('#')) # Выведет: 'Привет, мир!###'
print(s.rstrip('#')) # Выведет: '###Привет, мир!'


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

➡️Цель модульного теста — убедиться, что маленький блок кода работает правильно при разных входных данных:
# Функция, которую будем тестировать
def add(a, b):
return a + b

Теперь напишем модульный тест с использованием стандартного модуля unittest:
import unittest

class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)

def test_add_negative_numbers(self):
self.assertEqual(add(-1, -2), -3)

def test_add_zero(self):
self.assertEqual(add(0, 5), 5)

if __name__ == '__main__':
unittest.main()


➡️Зачем нужны модульные тесты:
- Находят ошибки в логике функции.
- Упрощают рефакторинг (можно смело менять код — тесты покажут, что сломалось).
- Помогают при разработке: можно быстро проверить, работает ли новый код.
- Улучшают структуру кода — приходится писать функции так, чтобы их легко тестировать.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍3🔥3
✈️Основное различие между этими двумя методами состоит в том, что __new__ обрабатывает создание объекта, а __init__ обрабатывает его инициализацию.

__new__ вызывается автоматически при вызове имени класса (при создании экземпляра), тогда как init вызывается каждый раз, когда экземпляр класса возвращается __new__, передавая возвращаемый экземпляр в __init__ в качестве параметра self, поэтому даже если вы сохранили экземпляр где-нибудь глобально/статически и возвращали его каждый раз из __new__, для него все-равно будет каждый раз вызываться __init__.

Пример:

class Singleton:
_instance = None

def __new__(cls):
if cls._instance is None:
print("Создание объекта")
cls._instance = super().__new__(cls)
return cls._instance

def __init__(self):
print("Инициализация объекта")

a = Singleton()
b = Singleton()

⬆️Вывод:
Создание объекта
Инициализация объекта
Инициализация объекта


__new__ сработал один раз — объект создан.
__init__ вызвался дважды — каждый раз при создании экземпляра.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥3👾3
✈️Зависимость (dependency) — это внешний объект, который нужен какому-то компоненту для работы. Внедрение зависимостей (Dependency Injection) — это способ передать нужные зависимости извне, а не создавать их внутри.

➡️Простой пример:
class Engine:
def start(self):
print("Engine started")

class Car:
def __init__(self, engine: Engine):
self.engine = engine

def run(self):
self.engine.start()

⬆️Здесь Car не создает Engine внутри себя. Внедрение происходит через конструктор.
engine = Engine()
car = Car(engine) # <-- внедрили зависимость
car.run()


➡️Как реализовать вручную в Python?
В Python DI часто реализуется через:

1. Конструктор (constructor injection):
class Service:
def __init__(self, db_client):
self.db = db_client


2. Setter-инъекция (через метод):
class Service:
def set_db(self, db_client):
self.db = db_client


3. Передача через параметры функции:
def handler(service: Service):
return service.do_stuff()


➡️Зачем это нужно?
- Легко тестировать (можно подменить зависимости моками)
- Повышает гибкость (меняем реализацию зависимости)
- Разделяет ответственность (класс делает только то, что должен)

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4🔥2
👌2🤨2😐1🤓1
Что выдаст код выше
Anonymous Quiz
11%
True True
39%
True False
36%
False False
9%
False True
1%
None
3%
Error
🔥6👏2🤔2💯1👀1
🤔Разбор

str.isupper() -> bool
Возвращает флаг, указывающий не то, содержит ли строка символы только верхнего регистра.

Аналогично с islower, только для нижнего регистра.

Метод upper() возращает копию строки, в которой все буквы сконвертированы к большому регистру (заглавные буквы). Все остальные символы остаются неизмененными.

Аналогично с lower(), только к нижнему регистру.

В итоге получаем False == False, THIS IS NOW! == this is now! —> True, False


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3👾31
👀Включите логирование медленных запросов, задав параметр log_min_duration_statement в конфигурации. Это позволит записывать все запросы, выполняющиеся дольше указанного времени.

👀Используйте команды EXPLAIN или EXPLAIN ANALYZE для просмотра плана выполнения запроса и оценки, где возникают задержки.

👀Проверьте, правильно ли настроены индексы для ускорения работы запросов, и при необходимости оптимизируйте сам запрос.

👀Анализируйте статистику запросов с помощью расширения pg_stat_statements, которое собирает информацию о времени выполнения и частоте запросов.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥3
✈️Менеджер контекста позволяет выделять и освобождать ресурсы строго по необходимости. В Python за это отвечает блок с оператором with.
[async] with <функция> as <переменная>:
# до и после гарантированно срабатывают события входа в блок with и выхода из него.


__exit__ срабатывает в момент выхода из блока, в том числе по причине возникновения исключения. В этом случае в метод будут переданы exc_class, exc_instance и traceback.

➡️Пример:
with open('file.txt') as f:
data = f.read()
process_data(data)

Файл гарантированно закроется.

➡️Реализация своего контекстного менеджера на основе класса:
class Printable:
def __enter__(self):
print('enter')

def __exit__(self, type, value, traceback):
print('exit')


➡️Реализация своего контекстного менеджера с использованием встроенной библиотеки contextlib:
from contextlib import contextmanager

@contextmanager
def printable():
print('enter')
try:
yield
finally:
print('exit')


💡Контекстные менеджеры также можно использовать для временной замены параметров, переменных окружения, управления транзакциями в БД и других задач, где важен контроль за ресурсами.

🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3🥰2🔥1🤔1
✈️Elasticsearch — это распределенная поисковая система на основе Lucene, которая предоставляет мощные инструменты для поиска и анализа данных. Elasticsearch поддерживает множество функций, включая полнотекстовый поиск, агрегацию данных, машинное обучение и многое другое. Elasticsearch-py — это официальный клиент для работы с Elasticsearch в Python, который позволяет легко интегрировать Elasticsearch в ваши проекты.

➡️Основные возможности Elasticsearch:
- Полнотекстовый поиск: Elasticsearch предоставляет мощные инструменты для полнотекстового поиска, что позволяет быстро находить данные в больших объемах текста.

- Агрегация данных: Elasticsearch позволяет агрегировать данные, что полезно для аналитики и создания дашбордов.

- Машинное обучение: Elasticsearch поддерживает машинное обучение, что позволяет автоматически обнаруживать аномалии и тенденции в данных.

- Распределенная архитектура: Elasticsearch является распределенной системой, что позволяет масштабировать поиск и анализ данных.

➡️Пример cоздания клиента и индекса:
from elasticsearch import Elasticsearch

# Создание клиента Elasticsearch
es = Elasticsearch()

# Создание индекса
index_name = 'my_index'
es.indices.create(index=index_name)


➡️Агрегация данных:
# Агрегация данных
res = es.search(index=index_name, body={
'aggs': {
'author_count': {
'terms': {'field': 'author.keyword'}
}
}
})
print(res['aggregations'])


🐍 Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍832🔥1