Python Hub - сборище Питонистов
1.71K subscribers
657 photos
1 video
37 files
276 links
Уголок счастья для любого питониста.

Сотрудничество или заказы: @leshunist

https://shcoder.dev - студия разработки ShcoderDevelopment

https://t.me/pythonhub_chat - чат
Download Telegram
📕 Точность целых чисел в Python бесконечна

В Python целые числа имеют "бесконечную" точность. Это означает, что вы можете работать с целыми числами любого размера, не беспокоясь о переполнении.

Например, давайте возьмем число 2 и возведем его в степень 1000:

print(2**1000)


Результат:

10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376


Это число содержит 302 цифры!

В других языках программирования, таких как C или Java, вы бы столкнулись с ограничениями при работе с такими большими числами. Но в Python вы можете спокойно работать с числами практически любого размера.

Это очень удобно для таких областей, как криптография или научные вычисления, где часто требуется работа с очень большими числами.

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

В целом, эта особенность Python делает его очень мощным инструментом для работы с целыми числами любого размера.


Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🦀 vs 🐍: Rust против Python – Решающее сравнение скорости и простоты на 2024 год

🚀 Почему Rust?

Rust – это системный язык программирования, известный своей скоростью, безопасностью памяти и абстракциями с нулевой стоимостью. Его часто сравнивают с C/C++, но он более современный и безопасный.

- Безопасность памяти без сборщика мусора: Rust предотвращает проблемы, такие как разыменование нулевых указателей и гонки данных.
- Высокая производительность: Rust компилируется в нативный код, что делает его одним из самых быстрых языков.
- Параллелизм: Система владения Rust гарантирует безопасность потоков.

🐍 Почему Python?

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

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

🧑‍💻 Сравнение примеров кода: Rust vs Python

Рассмотрим простую задачу: чтение файла и подсчет количества строк.

🦀 Пример на Rust:

use std::fs::File;
use std::io::{self, BufRead};
use std::path::Path;

fn count_lines_in_file(filename: &str) -> io::Result<usize> {
let file = File::open(filename)?;
let reader = io::BufReader::new(file);
let line_count = reader.lines().count();
Ok(line_count)
}

fn main() -> io::Result<()> {
let filename = "example.txt";
let line_count = count_lines_in_file(filename)?;
println!("Файл содержит {} строк.", line_count);
Ok(())
}


Сильные стороны Rust

- Безопасность памяти: Оператор ? обеспечивает правильную обработку ошибок без сбоев.
- Скорость: Rust компилируется в нативный код, что делает операции с файлами быстрее.

🐍 Пример на Python:

def count_lines_in_file(filename):
with open(filename, 'r') as file:
return sum(1 for _ in file)

if __name__ == "__main__":
filename = "example.txt"
line_count = count_lines_in_file(filename)
print(f"Файл содержит {line_count} строк.")


Сильные стороны Python

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

⚡️ Сравнение производительности

Читайте в статье

⚙️ Параллелизм и многопоточность

Параллелизм является ключевой сильной стороной Rust благодаря его системе владения, которая обеспечивает безопасность потоков на этапе компиляции. С другой стороны, глобальная блокировка интерпретатора (GIL) Python ограничивает его возможности параллелизма в многопоточных приложениях.

🦀 Пример параллелизма на Rust:

use std::thread;

fn main() {
let handles: Vec<_> = (0..10).map(|_| {
thread::spawn(|| {
println!("Привет из потока!");
})
}).collect();

for handle in handles {
handle.join().unwrap();
}
}


🐍 Пример параллелизма на Python:

import threading

def hello_from_thread():
print("Привет из потока!")

threads = []
for _ in range(10):
thread = threading.Thread(target=hello_from_thread)
threads.append(thread)
thread.start()

for thread in threads:
thread.join()
2👍2
Python-библиотека `googlesearch`: Google-поиск прямо из питона 🐍

🔎 googlesearch — это простая в использовании библиотека для Python, которая позволяет отправлять запросы в Google и получать ссылки на результаты поиска прямо из вашего кода. Она предоставляет гибкий и мощный интерфейс, который можно настроить для различных задач поиска.

Основной функционал

Основной метод библиотеки — это функция search(), которая возвращает результаты поиска в виде генератора, содержащего объекты SearchResult или URL-ссылки в зависимости от параметров.

Аргументы функции:
- term — строка с запросом, которую вы хотите найти в Google.
- num_results — количество результатов, которые нужно вернуть (по умолчанию 10).
- lang — язык результатов поиска (по умолчанию "en").
- proxy — возможность использования прокси для запросов (по умолчанию None).
- advanced — расширенный режим поиска, возвращает объекты с более детализированной информацией, такими как заголовок и описание страницы (по умолчанию False).
- sleep_interval — время ожидания между запросами в секундах (по умолчанию 0).
- timeout — максимальное время ожидания ответа от Google (по умолчанию 5 секунд).
- safe — настройка безопасного поиска: "off" для отключения, "active" для фильтрации контента для взрослых (по умолчанию "active").
- ssl_verify — возможность включить или отключить проверку SSL-сертификатов (по умолчанию None).
- region — регион для таргетирования поиска (по умолчанию None).

💻 Примеры использования

Простой поиск:
from googlesearch import search

query = "Python best practices"
for result in search(query, num_results=5):
print(result)

Этот код отправляет запрос "Python best practices" и возвращает первые пять ссылок на результаты поиска.

Расширенный поиск с дополнительными параметрами:
for result in search("новости технологий", num_results=3, lang='ru', safe='off', region='RU', advanced=True):
print(result.title, result.url)

Поиск по русскоязычным ресурсам с отключенным безопасным поиском и указанием региона RU. В данном случае возвращаются не только ссылки, но и заголовки страниц.

🚀 В общем, googlesearch это это мощный инструмент, который позволяет интегрировать Google-поиск в Python-приложения, делая его отличным для автоматизации и поиска данных.

Лайк, репост, подписка, все по стандарту, помнишь, да?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
📕 Как создать QR-генератор с помощью Flask и qrcode


➡️ Настройка четверга среды

Шаг 1: Настройка проекта

- Установите Python с официального сайта
- Создайте файлы: app.py templates/index.html`

Шаг 2: Установка библиотек

pip install qrcode Flask


➡️ Реализация

Шаг 3: Написание кода

Откройте файл app.py и добавьте следующий код:

import qrcode
from flask import Flask, request, render_template, send_file

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def generate_qr():
if request.method == "POST":
data = request.form["data"]
qr_img = qrcode.make(data)

qr_path = "static/qr_code.png"
qr_img.save(qr_path)

return send_file(qr_path, mimetype='image/png')

return render_template("index.html")

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


Теперь откройте файл templates/index.html и добавьте следующий HTML-код:

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>QR-код генератор</title>
</head>
<body>
<h1>QR-код генератор</h1>
<form method="POST">
<input type="text" name="data" placeholder="Введите текст или URL">
<button type="submit">Сгенерировать QR-код</button>
</form>
{% if qr_code %}
<img src="{{ qr_code }}" alt="QR-код">
{% endif %}
</body>
</html>


➡️ Тестирование приложения

Запустите приложение командой:

python app.py


Откройте браузер и перейдите по адресу http://127.0.0.1:5000. Вы увидите форму для ввода текста или URL. После ввода данных и нажатия кнопки "Сгенерировать QR-код", вы получите изображение с QR-кодом.



Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
📕 Веб-приложения: Что это такое и почему они важны

➡️ Что такое веб-приложение?

Веб-приложение - это программное обеспечение, которое работает в веб-браузере. Основные характеристики веб-приложений включают:

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

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

Веб-приложения создаются с использованием различных технологий:

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

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

Многие популярные сервисы, которые мы используем ежедневно, являются веб-приложениями:

- Gmail
- Google Документы
- Trello
- Slack
- Онлайн-банкинг

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

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

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

Типичное время загрузки веб-приложений:

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

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

Многие компании используют гибридный подход:

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

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

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

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


Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
2
📕 Интеграция React с шаблонами Django: Эффективный подход

В этой статье мы рассмотрим, как можно эффективно интегрировать React с Django, не создавая полноценное SPA-приложение.

➡️ Проблема традиционного подхода

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

- Дублирование кода (маршрутизация, аутентификация, авторизация)
- Необходимость создания отдельных страниц ошибок
- Дублирование состояний и моделей данных

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

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

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

➡️ Реализация

1. Точки монтирования React

React имеет удобное свойство: он монтируется не просто в body DOM или случайное место, а именно в указанный вами элемент. Мы можем использовать это для реализации маршрутизации, используя одну точку монтирования для каждой страницы:

ReactDOM.render(
&lt;h1&gt;Страница 1!&lt;/h1&gt;,
document.getElementById('page-1')
);

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


2. Маршрутизация на стороне Django

На стороне Django нам нужно только отрендерить &lt;div&gt; с соответствующим идентификатором:

{% extends "base.html" %}
{% load static %}

{% block content %}
&lt;div id="{{ element_id }}"&gt;&lt;/div&gt;
&lt;script src="{% static 'index.js' %}"&gt;&lt;/script&gt;
{% endblock %}


3. Оптимизация размера пакета

Чтобы не загружать JavaScript для неиспользуемых страниц, мы можем использовать встроенную функцию React - Code Splitting:

let Page1 = React.lazy(() => import('./page1'))
let Page2 = React.lazy(() => import('./page2'))

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


4. Передача контекстных данных

Для передачи данных из Django в React мы можем использовать встроенный в Django тег json_script:

{% extends "base.html" %}
{% load static %}

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


На стороне React мы можем получить эти данные с помощью пользовательского хука:

export let usePageContext = &lt;T = any&gt;() => {
let [pageContext, setPageContext] = useState&lt;T | undefined&gt;(undefined)
useEffect(() => {
let pageContext = document.getElementById('page-context').textContent
setPageContext(JSON.parse(pageContext))
}, [])
return pageContext as T
}

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


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

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

- Создание отдельных точек монтирования для React
- Настройка разделения кода для оптимизации производительности
- Реализация маршрутизации на стороне Django
- Передача контекста страницы из Django в React
- Получение и использование контекста страницы на стороне React

Рабочий пример этого подхода можно найти на GitHub в репе этого парня:
https://github.com/kozlovzxc/djangoReactTemplates


Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
📕 Добавление многоязычности в Django


Добавление поддержки нескольких языков в Django может быть сложной задачей для новичков. В этой статье мы рассмотрим пошаговый процесс реализации многоязычности в вашем Django-проекте.

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

Если у вас еще нет готового проекта Django, вы можете создать новый, выполнив следующие шаги:

virtualenv .env
source .env/bin/activate
pip install django
django-admin startproject languages
cd languages
python manage.py migrate


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

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

USE_I18N = True
USE_L10N = True


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

Для перевода текста в шаблонах используйте тег {% trans %}:

{% load i18n %}
{% trans "Hello world! This is an HTML5 Boilerplate." %}


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

Для перевода текста в представлениях используйте функцию gettext:

from django.utils.translation import gettext as _

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


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

Создайте каталог для хранения переводов и выполните команду для создания файлов перевода:

mkdir -p locale
django-admin makemessages --ignore="static" --ignore=".env" -l nl


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

Отредактируйте файл django.po в созданном каталоге locale, добавив переводы для каждой строки:

#: home/templates/home.html:19
msgid "Hello world! This is an HTML5 Boilerplate."
msgstr "Hallo wereld! Dit is een HTML5 Boilerplate."


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

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

django-admin compilemessages


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

Добавьте поле для выбора языка в модель пользователя:

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-проект. Не забывайте обновлять файлы перевода при добавлении нового текста и компилировать их после внесения изменений.

Оригинал статьи на английском

Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
✍️ Рисование с помощью Tkinter в Python


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')


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

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

- Выбор цвета кисти
- Изменение размера кисти
- Очистка холста
- Сохранение рисунка

Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Please open Telegram to view this post
VIEW IN TELEGRAM
6
☝️ Полиморфизм в Python: перегрузка и переопределение методов


Полиморфизм - ключевой принцип объектно-ориентированного программирования (ООП), позволяющий объектам различных классов иметь одинаковый интерфейс. Термин "полиморфизм" происходит от греческого слова, означающего "множество форм". В 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.


Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Что выдаст код выше?
Anonymous Quiz
21%
6
4%
5
12%
0
21%
-1
29%
Error
13%
Не знаю
👍41👎1
Python Hub - сборище Питонистов
Photo
Разбор 👨‍💻

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

Регистр тоже играет важную роль! Помни, что "a" - это не то же самое что "A"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤔1
🔥 Эффекты сообщений message_effect_id в Telegram Bot API

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.

Источник: Python Hub - сборище Питонистов 👩‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2