a = 3
b = 10
print('a больше b') if a > b else print('a меньше b')
result = 'Четное' if a % 2 == 0 else 'Нечетное'
print(result)
# Результат:
# a меньше b
# Нечетное
—Для вывода одной из двух фраз в зависимости от условия
a > b.—Для присваивания переменной
result одного из двух значений в зависимости от четности a.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1
SpaCy предоставляет эффективные инструменты для разбиения текста на токены и определения их базовых форм:
import spacy
nlp = spacy.load("ru_core_news_sm")
doc = nlp("Кошки любят спать на мягких подушках.")
for token in doc:
print(f"{token.text} -> {token.lemma_}")
SpaCy автоматически определяет части речи для каждого токена:
for token in doc:
print(f"{token.text} - {token.pos_}")
Библиотека способна выделять в тексте именованные сущности, такие как имена, организации и локации:
for ent in doc.ents:
print(f"{ent.text} - {ent.label_}")
Хотя spaCy в первую очередь предназначен для анализа текста, его можно использовать и для помощи в генерации:
SpaCy определяет синтаксические зависимости между словами, что может быть использовано для создания новых предложений:
def generate_sentence(subject, verb, object):
doc = nlp(f"{subject} {verb} {object}")
return " ".join([token.text for token in doc])
print(generate_sentence("Программист", "пишет", "код"))
Векторные представления слов в spaCy могут быть использованы для поиска семантически близких слов:
def find_similar_word(word, n=3):
token = nlp(word)[0]
similar_words = []
for lex in nlp.vocab:
if lex.has_vector:
if lex.is_lower == token.is_lower and lex.is_alpha:
similarity = token.similarity(lex)
similar_words.append((lex.text, similarity))
return sorted(similar_words, key=lambda x: x[1], reverse=True)[:n]
print(find_similar_word("компьютер"))
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3❤2⚡1
Многие статьи рекомендуют создавать полноценный React SPA и использовать Django только как REST API. Однако такой подход имеет ряд недостатков, особенно для небольших проектов:
Хотя для некоторых проектов это может быть приемлемым решением, для моего небольшого приложения такой подход кажется излишним.
Идея заключается в том, чтобы использовать React не как полноценный фронтенд-фреймворк, а как шаблонизатор для Django. Это позволит нам сохранить преимущества обоих инструментов.
React имеет удобное свойство: он монтируется не просто в
body DOM или случайное место, а именно в указанный вами элемент. Мы можем использовать это для реализации маршрутизации, используя одну точку монтирования для каждой страницы:ReactDOM.render(
<h1>Страница 1!</h1>,
document.getElementById('page-1')
);
ReactDOM.render(
<h1>Страница 2!</h1>,
document.getElementById('page-2')
);
На стороне 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 %}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, сохраняя при этом простоту разработки и избегая дублирования кода. Основные шаги для реализации:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2⚡1👍1
Помните, как вы впервые узнали о декораторах? Наверняка это было что-то вроде @staticmethod или простенького таймера. Но, друзья мои, это лишь верхушка айсберга! Давайте посмотрим, как можно выжать из декораторов все соки.
import functools
def spy_args(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(f"Вызов {func.__name__} с аргументами: {args}, {kwargs}")
return func(*args, **kwargs)
return wrapper
@spy_args
def секретная_функция(x, y, шифр="007"):
return x + y
результат = секретная_функция(3, 4, шифр="008")
def to_json(func):
import json
@functools.wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return json.dumps(result)
return wrapper
@to_json
def получить_данные():
return {"имя": "Алиса", "возраст": 30}
json_data = получить_данные()
def применить_все(*funcs):
def декоратор(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
result = f(*args, **kwargs)
for func in funcs:
result = func(result)
return result
return wrapper
return декоратор
def удвоить(x): return x * 2
def прибавить_один(x): return x + 1
@применить_все(удвоить, прибавить_один)
def базовая_функция(x):
return x
результат = базовая_функция(10) # Вернёт 21
class Ленивый:
def __init__(self, function):
self.function = function
self.результат = None
def __call__(self, *args, **kwargs):
if self.результат is None:
self.результат = self.function(*args, **kwargs)
return self.результат
@Ленивый
def сложные_вычисления():
print("Выполняю сложные вычисления...")
return 42
результат = сложные_вычисления() # Вычисления выполняются
результат = сложные_вычисления() # Используется кэшированный результат
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3⚡1🔥1
Тернарный оператор используется, когда мы хотим сократить код и упростить чтение. Это особенно полезно в случаях, когда нам нужно сделать простое условное присваивание. Однако из-за его сжатого формата, использование тернарного оператора в сложных условиях может затруднить понимание кода.
Да, Python поддерживает тернарный оператор. В Python тернарный оператор выглядит следующим образом: x if condition else y. Здесь x присваивается, если условие истинно, иначе присваивается y.
age = 15
type = "teenager" if age < 18 else "adult"
print(type) # Выведет: teenager
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2⚡1🔥1
secrets предоставляет инструменты для создания безопасных случайных данных, сложнее предсказать.secrets:1.
secrets.choice(sequence): Выбирает случайный элемент из последовательности. Полезно для генерации случайных выборок или паролей из определенного набора символов.2.
secrets.randbelow(n): Возвращает случайное число от 0 до n-1. Используется для генерации случайных чисел в определенном диапазоне.3.
secrets.randbits(k): Генерирует k случайных битов. Полезно для создания случайных битовых строк или чисел.4.
secrets.token_bytes(nbytes=None): Генерирует безопасную случайную последовательность байтов длиной nbytes (по умолчанию - 32 байта).5.
secrets.token_hex(nbytes=None): Генерирует безопасную случайную строку в шестнадцатеричном формате длиной nbytes (по умолчанию - 32 байта).6.
secrets.token_urlsafe(nbytes=None): Генерирует безопасную случайную URL-совместимую строку длиной nbytes (по умолчанию - 32 байта).7.
secrets.compare_digest(a, b): Сравнивает две строки для предотвращения временных атак. Это полезно при сравнении хэшей паролей или токенов без утечки информации о длине сравниваемых строк.secrets?-
secrets предоставляет криптографически безопасные данные, что делает их сложными для предсказания.- Эти функции обеспечивают высокий уровень безопасности при генерации случайных данных, паролей и токенов в Python.
secrets для защиты вашей информации и обеспечения безопасности ваших данных в Python. Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2⚡1🔥1
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 flamegraph <report_file>
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3⚡1🔥1
С помощью 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 – мощный инструмент для создания анимационной графики, предлагающий гибкость и творческий потенциал для визуализации математических и научных концепций.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6⚡1❤1🔥1
Перегрузка методов - это возможность класса иметь несколько методов с одинаковым именем, но разными параметрами. В 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
Переопределение методов - это механизм, позволяющий подклассу предоставить свою реализацию метода, уже определенного в родительском классе. Это позволяет изменять или расширять поведение унаследованных методов.
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()) # Вывод: Мяу
Рассмотрим пример использования полиморфизма в системе обработки платежей:
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.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2⚡1🔥1
def fractional_knapsack(items, capacity):
# Sort items by their value-to-weight ratio in descending order
items.sort(key=lambda x: x[1] / x[0], reverse=True)
total_value = 0
remaining_capacity = capacity
for item in items:
if remaining_capacity >= item[0]:
total_value += item[1]
remaining_capacity -= item[0]
else:
total_value += (remaining_capacity / item[0]) * item[1]
break
return total_value
# Example usage:
items = [(2, 10), (3, 5), (5, 15), (7, 7), (1, 6)]
knapsack_capacity = 10
max_value = fractional_knapsack(items, knapsack_capacity)
print(max_value)
В этом примере мы используем жадный алгоритм для решения задачи о дробном рюкзаке. Учитывая набор элементов с весами и значениями, цель состоит в том, чтобы выбрать элементы, чтобы максимизировать общую стоимость, не превышая при этом определенный предел веса (емкость рюкзака). Алгоритм сортирует элементы по соотношению их стоимости к весу и выбирает элементы жадно, максимизируя общую стоимость в пределах ограничения емкости.
Жадные алгоритмы особенно полезны, когда проблема демонстрирует свойство жадного выбора, что означает, что локально оптимальный выбор на каждом шаге приводит к глобально оптимальному решению. Однако важно отметить, что не все проблемы можно решить оптимально с помощью жадного подхода, поэтому требуется тщательный анализ, чтобы определить, когда целесообразно использовать этот метод.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2⚡1🔥1
—Узнать размер файла, сравнив позицию после чтения с начальной.
—Вернуться к определенной позиции с помощью
seek().—Отслеживать прогресс обработки больших файлов.
—Получить позицию в строковых буферах и потоках байтов.
# Открываем файл для записи
with open('example.txt', 'w') as f:
f.write('Hello, World!')
# Получаем текущую позицию курсора
position = f.tell()
print(f'Current position after writing: {position}') # Вывод: 13, т.к. длина строки "Hello, World!" = 13
# Открываем файл для чтения
with open('example.txt', 'r') as f:
content = f.read(5) # Читаем первые 5 символов
position = f.tell()
print(f'Content read: {content}') # Вывод: Hello
print(f'Current position after reading: {position}') # Вывод: 5
1. Мы открываем файл
example.txt для записи и записываем в него строку "Hello, World!".2. Используем
tell(), чтобы получить позицию курсора после записи, что будет равно 13 (длина строки).3. Затем открываем файл для чтения и читаем первые 5 символов.
4. Снова используем
tell(), чтобы получить новую позицию курсора, которая будет равна 5 после чтения. Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🔥1
* Интеграция с C/C++ библиотеками: вызов функций из библиотек, написанных на C/C++, непосредственно из Python.
* Оптимизация производительности: реализация критичных к производительности участков кода на C/C++ и вызов их из Python.
* Обработка событий: использование функций Python в качестве обработчиков событий в C/C++ приложениях.
* Расширение функциональности Python: добавление новых возможностей в Python с помощью C/C++.
import ctypes
import time
# Загрузка библиотеки C (libcallback_example.so - пример, нужно скомпилировать код C)
lib = ctypes.CDLL("./libcallback_example.so")
# Определение типа функции обратного вызова
CMPFUNC = ctypes.CFUNCTYPE(None, ctypes.c_int)
# Функция Python, которая будет использоваться в качестве обратного вызова
def my_callback(value):
print(f"Python callback called with value: {value}")
# Регистрация функции обратного вызова в библиотеке C
# Предполагается, что в библиотеке C есть функция register_callback, принимающая указатель на функцию
register_callback = lib.register_callback
register_callback.argtypes = [CMPFUNC]
register_callback.restype = None
register_callback(CMPFUNC(my_callback))
# Вызов функции C, которая будет периодически вызывать функцию обратного вызова
# Предполагается, что в библиотеке C есть функция run_loop, которая запускает цикл
run_loop = lib.run_loop
run_loop.argtypes = []
run_loop.restype = None
run_loop()
#include <stdio.h>
#include <unistd.h> // for sleep
typedef void (*callback_function)(int);
static callback_function registered_callback = NULL;
void register_callback(callback_function callback) {
registered_callback = callback;
}
void run_loop() {
int i = 0;
while (i < 5) {
sleep(1);
if (registered_callback != NULL) {
registered_callback(i);
}
i++;
}
}
gcc -shared -o libcallback_example.so -fPIC callback_example.cctypes для вызова функций из динамически подключаемой библиотеки C и передачи функции Python в качестве обратного вызова. Код на C регистрирует коллбек и периодически вызывает его. Важно правильно определить типы данных с помощью ctypes.CFUNCTYPE и argtypes/restype. Перед запуском Python кода необходимо скомпилировать код C в shared library (.so файл для Linux).Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥2
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)
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
❤8👍2🔥1
# Legacy код на Python
def calculate_total(items):
total = 0
for item in items:
total = total + item['price'] * item['quantity']
return total
# Современный эквивалент
def calculate_total(items):
return sum(item['price'] * item['quantity'] for item in items)
Работа с Legacy кодом - это неизбежная часть жизни многих разработчиков. Хотя он может представлять сложности, правильный подход к его обработке может значительно улучшить качество и поддерживаемость программного обеспечения.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🔥1
— Простота использования: PyBrain имеет простой и понятный синтаксис, который делает его удобным для изучения.
— Модульность: PyBrain является модульной библиотекой, что позволяет разработчикам создавать собственные алгоритмы и инструменты.
— Производительность: PyBrain написан на Python, который является высокопроизводительным языком.
— Классификация: обучение нейронной сети для классификации входных данных в один из нескольких классов.
— Регрессия: обучение нейронной сети для прогнозирования непрерывных значений.
— Обнаружение аномалий: обучение нейронной сети для обнаружения аномальных входных данных.
from pybrain.datasets import ClassificationDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.shortcuts import BuildNetwork
# Создание выборки данных
data = ClassificationDataSet(2, 1)
# Добавление данных (x1, x2, label)
data.addSample((0, 0), (0,))
data.addSample((0, 1), (1,))
data.addSample((1, 0), (1,))
data.addSample((1, 1), (0,))
# Создание нейронной сети
network = BuildNetwork(2, 3, 1)
# Обучение нейронной сети
trainer = BackpropTrainer(network, data)
for _ in range(1000):
trainer.train()
# Проверка результатов
for sample in [(0, 0), (0, 1), (1, 0), (1, 1)]:
output = network.activate(sample)
print(f'Input: {sample}, Output: {output}')
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from lineapy import LineaPy
# Создаем синтетические данные
np.random.seed(42)
X = np.random.rand(100, 1) * 10 # 100 случайных точек в диапазоне от 0 до 10
y = 2.5 * X + np.random.randn(100, 1) * 2 # Линейная зависимость с шумом
# Преобразуем данные в DataFrame
data = pd.DataFrame(np.hstack((X, y)), columns=['X', 'y'])
# Создаем модель с помощью LineaPy
model = LineaPy()
model.fit(data['X'], data['y'])
# Предсказания
predictions = model.predict(data['X'])
# Визуализация
plt.scatter(data['X'], data['y'], color='blue', label='Данные')
plt.plot(data['X'], predictions, color='red', label='Предсказание')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Линейная Регрессия с LineaPy')
plt.legend()
plt.show()
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
— Простой интерфейс для задания байесовских моделей на языке
Stan.— Автоматическая компиляция моделей в высокооптимизированный код на C++.
— Выполнение статистического вывода с использованием методов Монте-Карло (MCMC).
— Возможность задавать сложные иерархические модели.
— Удобные инструменты для анализа результатов моделирования.
— Интеграция со многими библиотеками данных и визуализации в Python.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
С платежами поможет pay.hot. Подключаем оплату на сайте, в приложении или Telegram:
- СБП
- Банковские карты РФ
- Международные банковские карты
Please open Telegram to view this post
VIEW IN TELEGRAM
В документации вашей функции или класса, вы можете добавить примеры кода, которые хотите протестировать. Примеры должны начинаться с ключевого слова >>> и заканчиваться ожидаемым результатом.
Чтобы запустить тесты
doctest, вы можете использовать функцию doctest.testmod(). Если тесты пройдут успешно, ничего не будет напечатано. Если тесты потерпят неудачу, будет напечатано сообщение об ошибке, указывающее на причину неудачи.Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1🔥1