Помните, как вы впервые узнали о декораторах? Наверняка это было что-то вроде @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❤1🔥1
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
❤7👍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
👍3❤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
👍5❤2🔥1