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

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

Канал на бирже: https://telega.in/c/pythonercode
Download Telegram
➡️Что такое веб-приложение?

Веб-приложение - это программное обеспечение, которое работает в веб-браузере. Основные характеристики веб-приложений включают:
💬Независимость от платформы
💬Работа на любом устройстве, включая мобильные
💬Зависимость от интернет-соединения (как минимум для начальной загрузки)
💬Динамический контент с частыми обновлениями

➡️Технологии, лежащие в основе веб-приложений

Веб-приложения создаются с использованием различных технологий:
💬Фронтенд: HTML, CSS и JavaScript
💬Бэкенд: Node.js, Python (с Django или Flask), Java и другие
💬Базы данных: SQL и NoSQL варианты (например, MongoDB, PostgreSQL)

➡️Примеры веб-приложений

Многие популярные сервисы, которые мы используем ежедневно, являются веб-приложениями:
💬Gmail
💬Google Документы
💬Trello
💬Slack
💬Онлайн-банкинг

➡️Безопасность в веб-приложениях

Веб-приложения имеют преимущество в виде встроенных функций безопасности, таких как HTTPS для шифрования передаваемых данных. Это освобождает разработчиков от необходимости создавать меры безопасности с нуля.

➡️Время загрузки веб-приложений

Типичное время загрузки веб-приложений:
💬Первая загрузка: около 7-8 секунд
💬Последующие загрузки: около 1 секунды (благодаря кэшированию)

➡️Гибридный подход

Многие компании используют гибридный подход:
💬Веб-сайт для презентации и продажи идеи (оптимизирован для SEO)
💬Веб-приложение для основного продукта (оптимизировано для удобства пользователей)

➡️Почему веб-приложения важны?

Веб-приложения имеют ряд преимуществ, которые делают их важными в современном мире:
💬Доступность с любого устройства с браузером
💬Не требуют установки и обновления на устройстве пользователя
💬Легко обновляются и поддерживаются разработчиками
💬Обеспечивают единообразный пользовательский опыт на разных платформах

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75🔥2
➡️Проблема традиционного подхода

Многие статьи рекомендуют создавать полноценный React SPA и использовать Django только как REST API. Однако такой подход имеет ряд недостатков, особенно для небольших проектов:
💬Дублирование кода (маршрутизация, аутентификация, авторизация)
💬Необходимость создания отдельных страниц ошибок
💬Дублирование состояний и моделей данных

Хотя для некоторых проектов это может быть приемлемым решением, для моего небольшого приложения такой подход кажется излишним.

➡️Альтернативное решение: React как шаблонизатор

Идея заключается в том, чтобы использовать React не как полноценный фронтенд-фреймворк, а как шаблонизатор для Django. Это позволит нам сохранить преимущества обоих инструментов.

➡️Точки монтирования React

React имеет удобное свойство: он монтируется не просто в body DOM или случайное место, а именно в указанный вами элемент. Мы можем использовать это для реализации маршрутизации, используя одну точку монтирования для каждой страницы:
ReactDOM.render(
<h1>Страница 1!</h1>,
document.getElementById('page-1')
);

ReactDOM.render(
<h1>Страница 2!</h1>,
document.getElementById('page-2')
);


➡️Маршрутизация на стороне Django

На стороне Django нам нужно только отрендерить <div> с соответствующим идентификатором:
{% extends "base.html" %}
{% load static %}

{% block content %}
<div id="{{ element_id }}"></div>
<script src="{% static 'index.js' %}"></script>
{% endblock %}


➡️Оптимизация размера пакета

Чтобы не загружать JavaScript для неиспользуемых страниц, мы можем использовать встроенную функцию React - Code Splitting:
let Page1 = React.lazy(() => import('./page1'))
let Page2 = React.lazy(() => import('./page2'))

ReactDOM.render(
<Suspense fallback={<></>}>
<Page1/>
</Suspense>,
document.getElementById('page-1')
);


➡️Передача контекстных данных

Для передачи данных из Django в React мы можем использовать встроенный в Django тег json_script:
{% extends "base.html" %}
{% load static %}

{% block content %}
<div id="{{ element_id }}"></div>
{{ page_context | json_script:'page-context' }}
<script src="{% static 'index.js' %}"></script>
{% endblock %}


➡️На стороне React мы можем получить эти данные с помощью пользовательского хука:
export let usePageContext = <T = any>() => {
let [pageContext, setPageContext] = useState<T | undefined>(undefined)
useEffect(() => {
let pageContext = document.getElementById('page-context').textContent
setPageContext(JSON.parse(pageContext))
}, [])
return pageContext as T
}

const TodosIndexPage = memo(() => {
let pageContext = usePageContext<{ todos: Todo[] }>()
let todos = pageContext?.todos
return <>
<h1>React todos page</h1>
<ul>
{todos?.map(todo => <li key={todo.id}>{todo.title}</li>)}
</ul>
</>
})


➡️Заключение

Этот подход позволяет использовать React как шаблонизатор для Django, сохраняя при этом простоту разработки и избегая дублирования кода. Основные шаги для реализации:
💬Создание отдельных точек монтирования для React
💬Настройка разделения кода для оптимизации производительности
💬Реализация маршрутизации на стороне Django
💬Передача контекста страницы из Django в React
💬Получение и использование контекста страницы на стороне React

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

➡️Настройка проекта

Если у вас еще нет готового проекта Django, вы можете создать новый, выполнив следующие шаги:
virtualenv .env
source .env/bin/activate
pip install django
django-admin startproject languages
cd languages
python manage.py migrate


➡️Включение i18n и l10n

Убедитесь, что в вашем файле [settings.py](http://settings.py) включены следующие настройки:
USE_I18N = True
USE_L10N = True


➡️Перевод в шаблонах

Для перевода текста в шаблонах используйте тег {% trans %}:
{% load i18n %}
{% trans "Hello world! This is an HTML5 Boilerplate." %}


➡️Перевод в представлениях

Для перевода текста в представлениях используйте функцию gettext:
from django.utils.translation import gettext as _

def index(request):
text = _("this is some random text")
return render(request, 'home.html', {'text': text})


➡️Создание файлов перевода

Создайте каталог для хранения переводов и выполните команду для создания файлов перевода:
mkdir -p locale
django-admin makemessages --ignore="static" --ignore=".env" -l nl


➡️Редактирование файлов перевода

Отредактируйте файл django.po в созданном каталоге locale, добавив переводы для каждой строки:
#: home/templates/home.html:19
msgid "Hello world! This is an HTML5 Boilerplate."
msgstr "Hallo wereld! Dit is een HTML5 Boilerplate."


➡️Компиляция файлов перевода

После редактирования файлов перевода, скомпилируйте их:
django-admin compilemessages


➡️Настройка языка на основе пользовательских предпочтений

Добавьте поле для выбора языка в модель пользователя:
LANGUAGE_CHOICES = (
('en-us', 'English'),
('nl', 'Dutch'),
)
language = models.CharField(default='en-us', choices=LANGUAGE_CHOICES, max_length=5)


В представлении активируйте язык на основе настроек пользователя:
from django.utils import translation

def index(request):
if request.user.is_authenticated:
translation.activate(request.user.language)
return render(request, 'home.html')


➡️Заключение

Следуя этим шагам, вы сможете добавить поддержку нескольких языков в ваш Django-проект. Не забывайте обновлять файлы перевода при добавлении нового текста и компилировать их после внесения изменений.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83🔥1
Forwarded from IT memer
Please open Telegram to view this post
VIEW IN TELEGRAM
😁25👍5🤣51
✈️Tkinter - это мощный модуль Python для создания графических пользовательских интерфейсов (GUI). Хотя он часто используется для создания стандартных элементов интерфейса, таких как кнопки и текстовые поля, Tkinter также предоставляет возможности для создания приложений для рисования, подобных Paint.

➡️Создание холста для рисования

Основой для рисования в Tkinter является виджет Canvas (холст). Вот как можно создать простое окно с холстом:
from tkinter import *

class Application(Frame):
def __init__(self, master):
super().__init__(master)
self.master = master
self.pack()
self.create_widget()

def create_widget(self):
self.canvas = Canvas(self, width=200, height=200, bg='white')
self.canvas.pack()
self.canvas.bind('<B1-Motion>', self.draw)

def draw(self, event):
self.canvas.create_oval(event.x, event.y, event.x+1, event.y+1)

root = Tk()
root.geometry('200x200')
app = Application(root)
root.mainloop()


➡️Как работает рисование

Ключевой метод для рисования - это функция draw:
def draw(self, event):
self.canvas.create_oval(event.x, event.y, event.x+1, event.y+1)


⬆️Этот метод создает маленький овал (фактически, точку) в позиции курсора мыши. Метод вызывается каждый раз, когда пользователь перемещает мышь с зажатой левой кнопкой (событие &lt;B1-Motion&gt;).

➡️Настройка размера кисти

Вы можете легко изменить размер "кисти", увеличив размер создаваемого овала:
def draw(self, event):
brush_size = 5
x1, y1 = (event.x - brush_size), (event.y - brush_size)
x2, y2 = (event.x + brush_size), (event.y + brush_size)
self.canvas.create_oval(x1, y1, x2, y2, fill='black')


➡️Добавление функциональности

Вы можете расширить функциональность вашего приложения для рисования, добавив следующие возможности:
💬Выбор цвета кисти
💬Изменение размера кисти
💬Очистка холста
💬Сохранение рисунка

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥43🤝2
✈️Memray - это библиотека для профилирования памяти и она является важным инструментом оптимизации производительности Python программ.

➡️Библиотека отслеживает выделение и освобождение памяти при работе программы, поддерживает отслеживание ссылок на объект, применятся для профилирования на серверах и в виртуальных окружениях.

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

➡️Пример использования:
Чтобы использовать Memray, нужно сначала установить его с помощью pip:
pip install memray


Затем можно использовать Memray для профилирования вашего Python-кода. Вот простой пример:
import memray

@memray.start()
def my_function():
# Пример кода, который может выделять память
a = [i for i in range(100000)]
b = [j ** 2 for j in a]
return b

my_function()

# Сохранение отчета о профилировании
memray.stop()


После завершения работы вашей функции Memray создаст файл отчета, который можно анализировать с использованием команд:
memray flamegraph <report_file>


⬆️Это визуализирует распределение памяти, что поможет вам лучше понять, как ваша программа использует память и где могут возникнуть проблемы.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥83👍2
✈️Полиморфизм - ключевой принцип объектно-ориентированного программирования (ООП), позволяющий объектам различных классов иметь одинаковый интерфейс. Термин "полиморфизм" происходит от греческого слова, означающего "множество форм". В Python полиморфизм реализуется двумя основными способами: перегрузкой методов и их переопределением.

➡️Перегрузка методов

Перегрузка методов - это возможность класса иметь несколько методов с одинаковым именем, но разными параметрами. В Python прямая перегрузка методов не поддерживается, но похожего эффекта можно достичь с помощью параметров по умолчанию и аргументов переменной длины.

➡️Пример перегрузки метода

class MathOperations:
def add(self, a, b, c=0):
return a + b + c

math_op = MathOperations()
print(math_op.add(10, 20)) # Вывод: 30
print(math_op.add(10, 20, 30)) # Вывод: 60


⬆️В этом примере метод add() может принимать два или три аргумента, имитируя перегрузку метода.

➡️Переопределение методов

Переопределение методов - это механизм, позволяющий подклассу предоставить свою реализацию метода, уже определенного в родительском классе. Это позволяет изменять или расширять поведение унаследованных методов.

Пример переопределения метода

class Animal:
def sound(self):
return "Какой-то звук"

class Dog(Animal):
def sound(self):
return "Гав"

class Cat(Animal):
def sound(self):
return "Мяу"

dog = Dog()
cat = Cat()
print(dog.sound()) # Вывод: Гав
print(cat.sound()) # Вывод: Мяу


⬆️В этом примере классы Dog и Cat переопределяют метод sound(), унаследованный от класса Animal.

➡️Практическое применение полиморфизма

Рассмотрим пример использования полиморфизма в системе обработки платежей:
class Payment:
def process(self, amount):
raise NotImplementedError("Подклассы должны реализовать этот метод")

class CreditCardPayment(Payment):
def process(self, amount):
return f"Обработан платеж кредитной картой на сумму {amount}."

class PayPalPayment(Payment):
def process(self, amount):
return f"Обработан платеж через PayPal на сумму {amount}."

credit_card = CreditCardPayment()
paypal = PayPalPayment()

print(credit_card.process(100))
print(paypal.process(200))


⬆️Этот пример демонстрирует, как полиморфизм позволяет работать с разными типами платежей через единый интерфейс.

➡️Заключение

Полиморфизм в Python, реализуемый через переопределение методов и имитацию перегрузки, обеспечивает гибкость и возможность повторного использования кода. Эти концепции позволяют создавать более модульные, расширяемые и легко поддерживаемые программы. Эффективное использование полиморфизма - ключ к написанию чистого и элегантного кода на Python.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93🔥2
👍6
Что выдаст код выше
Anonymous Quiz
23%
6
3%
5
17%
0
37%
-1
21%
Error
🔥8👍3
🐍Разбор

Метод find() возвращает индекс первого вхождения указанного символа или подстроки в строке. Если символ или подстрока не найдены, метод find() возвращает -1

Регистр тоже играет важную роль! Помни, что "a" - это не то же самое что "A"
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍10🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍31
Сделали для подписчиков наших каналов по Python небольшой розыгрыш звёзд😘

1 ноября в 18 часов по мск, 5 победителей получат по 100 звёзд, которые можно тратить в нашем и других каналах, дарить подарки и другое, удачи!


P.S. говорят если переслать этот розыгрыш друзьям, то шанс увеличится.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥71🥰1
Forwarded from IT memer
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣19👍2🙈2💯1
message_effect_id - это уникальный идентификатор, используемый в Telegram Bot API для определения конкретного визуального эффекта, который можно применить к сообщению. Эти эффекты представляют собой анимированные реакции, которые пользователи могут добавлять к сообщениям.

➡️Основные характеристики message_effect_id:

Уникальность: Каждый эффект имеет свой уникальный числовой идентификатор.Формат: Идентификаторы представлены в виде строк, содержащих длинные числовые значения.Связь с эмодзи: Каждый message_effect_id соответствует определенному эмодзи, которое визуально представляет эффект.

➡️Примеры message_effect_id:

{
'🔥': "5104841245755180586",
'👍': "5107584321108051014",
'👎': "5104858069142078462",
'❤️': "5044134455711629726",
'🎉': "5046509860389126442",
'💩': "5046589136895476101"
}


➡️Использование в Telegram Bot API:

Применение эффектов: Боты могут использовать эти идентификаторы для добавления анимированных реакций к сообщениям.Интерактивность: Позволяет создавать более динамичные и интерактивные взаимодействия в чатах.Кастомизация: Разработчики могут выбирать конкретные эффекты для различных сценариев использования бота.

➡️Значение для разработчиков:

Понимание и правильное использование message_effect_id позволяет разработчикам ботов создавать более привлекательные и интерактивные интерфейсы, улучшая пользовательский опыт в Telegram.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍64🔥3
➡️Что такое итерируемый счетчик?

Итерируемый счетчик в Python - это объект, который можно использовать в цикле for и других итерационных контекстах. Он позволяет последовательно получать значения, обычно числовые, в заданном диапазоне или по определенному правилу.

➡️Реализация итерируемого счетчика

Давайте рассмотрим пример реализации простого итерируемого счетчика:
class IterableCounter:
def __init__(self, start, end):
self.current = start
self.end = end

def __iter__(self):
return self

def __next__(self):
if self.current > self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1


В этом примере:
💬init инициализирует счетчик начальным и конечным значениями.
💬iter возвращает сам объект, делая его итератором.
💬next определяет логику получения следующего значения.

➡️Использование итерируемого счетчика

Теперь мы можем использовать наш счетчик в цикле for:
counter = IterableCounter(1, 5)
for num in counter:
print(num)


⬆️Этот код выведет числа от 1 до 5.

➡️Преимущества итерируемого счетчика

💬Гибкость: можно легко изменить логику генерации значений.
💬Экономия памяти: значения генерируются по мере необходимости.
💬Интеграция с циклами: легко использовать в стандартных конструкциях Python.

➡️Альтернативы

В Python есть встроенные альтернативы для простых случаев:
💬range(): для последовательностей целых чисел.
💬enumerate(): для нумерации элементов итерируемого объекта.

➡️Заключение

Итерируемые счетчики в Python - мощный инструмент для создания пользовательских последовательностей. Они особенно полезны, когда стандартные функции не удовлетворяют специфическим требованиям вашей задачи.

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥52🤔1
✈️Manim — это библиотека, которая используется для создания анимированных визуализаций и математических демонстраций. Manim позволяет легко оптимизировать визуализацию математических концепций с помощью анимаций, графиков и других визуальных элементов.

➡️Применение

С помощью Manim можно создавать как простые анимации, так и сложные сцены с множеством объектов и эффектов. Библиотека предоставляет обширные возможности по работе с графикой, анимацией и текстом.

➡️Пример:
from manim import *

class SquareNumber(Scene):
def construct(self):
# Создаем квадрат и текст
square = Square(side_length=2)
number = MathTex("0").scale(2)

# Центрируем квадрат и текст
square.move_to(ORIGIN)
number.next_to(square, DOWN)

# Добавляем квадрат и текст на экран
self.play(Create(square), Write(number))
self.wait(1)

# Изменяем текст на 1
self.play(Transform(number, MathTex("1").scale(2)))
self.wait(1)

# Изменяем текст на 4 и меняем размер квадрата
self.play(Transform(number, MathTex("4").scale(2)),
square.animate.scale(2))
self.wait(1)

# Изменяем текст на 9 и меняем размер квадрата
self.play(Transform(number, MathTex("9").scale(2)),
square.animate.scale(3))
self.wait(1)

# Завершаем сцену
self.play(FadeOut(square), FadeOut(number))

# Для запуска сцены используйте следующую команду в терминале
# manim -pql имя_файла.py SquareNumber


⬆️Чтобы запустить данный код и увидеть анимацию, сохраните его в файл, например, square_number.py, и выполните указанную команду в терминале.

➡️Заключение

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

🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114🔥4
Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
😢12👍3
✈️Хэш-функции играют важную роль в компьютерных науках, особенно в структурах данных и криптографии. В этой статье мы рассмотрим различные типы хэш-функций, реализованные на Python, и проанализируем их характеристики.

🔎 Типы хэш-функций

➡️1. Простая хэш-функция (simple_hash)

Эта функция суммирует ASCII-значения символов входной строки и применяет операцию модуля. Она проста в реализации, но может привести к неравномерному распределению.

def simple_hash(input_str, table_size):
hash_value = 0
for char in input_str:
hash_value += ord(char)
return hash_value % table_size


➡️2. Полиномиальный хэш (polynomial_hash)

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

def polynomial_hash(input_str, table_size, prime=31):
hash_value = 0
for i, char in enumerate(input_str):
hash_value += ord(char) * (prime ** i)
return hash_value % table_size


➡️3. FNV-1a хэш (fnv1a_hash)

32-битная версия FNV-1a хэша, известная своими хорошими характеристиками распределения.

def fnv1a_hash(key, table_size):
FNV_prime = 16777619
FNV_offset_basis = 2166136261
hash_value = FNV_offset_basis
for char in key:
hash_value ^= ord(char)
hash_value *= FNV_prime
hash_value &= 0xffffffff # Обеспечивает 32-битный хэш
return hash_value % table_size


➡️4. XXХэш (xx_hash)

Использует библиотеку xxhash для быстрого некриптографического хэширования, эффективного для больших объемов данных.

def xx_hash(input_str, table_size):
return xxhash.xxh32(input_str).intdigest() % table_size


➡️5. SipHash (sip_hash)

Применяет HMAC с SHA-256 для повышенной безопасности, но может быть медленнее некриптографических хэшей.

def sip_hash(input_str, table_size, key=b'secretkey'):
hash_value = hmac.new(key, input_str.encode(), digestmod='sha256').hexdigest()
return int(hash_value, 16) % table_size


➡️6. MurmurHash (murmur_hash)

Быстрая некриптографическая хэш-функция, часто используемая в хэш-таблицах и фильтрах Блума.

def murmur_hash(input_str, table_size):
hash_value = mmh3.hash(input_str) % table_size
return hash_value


🐍Pythoner
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75🔥3
✈️А в этой части рассмотрим тестирование хэш-функций

➡️Генерация тестовых данных

Для тестирования используется функция generate_random_strings, которая создает случайные строки заданной длины.

➡️Анализ распределения и коллизий

Функция test_distribution_and_collisions оценивает качество распределения элементов по хэш-таблице и подсчитывает количество коллизий.

➡️Измерение времени выполнения

Функция test_execution_time измеряет время, необходимое для хэширования набора элементов, что позволяет сравнить производительность разных хэш-функций.

➡️Проверка чувствительности

Функция test_sensitivity проверяет, насколько хэш-функция чувствительна к небольшим изменениям во входных данных.

➡️Заключение

Выбор подходящей хэш-функции зависит от конкретных требований приложения. Простые хэш-функции могут быть достаточными для небольших наборов данных, в то время как для больших объемов данных или повышенных требований к безопасности могут потребоваться более сложные алгоритмы. Важно учитывать баланс между скоростью выполнения, качеством распределения и устойчивостью к коллизиям при выборе хэш-функции для конкретной задачи.

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