Опрос
нажмите — покажем
2 · 2.2K · нажмите — покажем
🤔Разбор
Срез x[::-1] инвертирует список, Применение его трижды возвращает исходный порядок.
🐍 Pythoner
2 · 2K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
➡️Функция all в Python
Функция all принимает на вход итерируемый объект (например, список) и возвращает True, если все его элементы являются истинными (или, если итерируемый объект пустой). Например:
numbers = [1, 2, 3, 4]
print(all(numbers)) # Выводит: True
⬆️В этом примере функция all вернула True, потому что все числа в списке numbers являются истинными (то есть, не равны нулю).
➡️Функция any в Python
Функция any, как и all, принимает на вход итерируемый объект, но возвращает True, если хоть один из его элементов является истинным. Если итерируемый объект пустой, функция any возвращает False. Например:
numbers = [0, 0, 1, 0]
print(any(numbers)) # Выводит: True
⬆️В этом случае функция any вернула True, потому что в списке numbers было хотя бы одно истинное значение (1).
➡️Использование all и any вместе
Функции all и any можно использовать вместе, чтобы проверить сложные условия. Например, мы можем проверить, все ли элементы в списке положительные и есть ли среди них хоть одно четное число:
numbers = [1, 2, 3, 4]
print(all(num > 0 for num in numbers) and any(num % 2 == 0 for num in numbers)) # Выводит: True
⬆️В этом примере функция all вернет True, если все числа в списке будут положительными, а функция any вернет True, если среди чисел будет хотя бы одно четное.
🐍 Pythoner
7 · 2K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Конструкция raise используется для генерации исключений. Когда в коде происходит что-то непредвиденное или некорректное — можно сгенерировать исключение командой raise.
➡️Основные моменты конструкции raise:
—Возбуждение существующих исключений: Вы можете использовать raise без каких-либо параметров в блоке except, чтобы повторно вызвать текущее исключение.
—Создание собственных исключений: Вы можете создать или вызвать собственное исключение, создав объект исключения и передав его в raise.
➡️Пример использования raise:
def divide(a, b):
if b == 0:
raise ValueError("Деление на ноль невозможно.")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"Ошибка: {e}")
⬆️В этом примере функция divide вызывает исключение ValueError, если второй аргумент равен нулю. В блоке try мы пытаемся выполнить деление, и если возникает ошибка, мы перехватываем её и выводим сообщение об ошибке.
🐍Pythoner
12 · 2K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️В мире разработки программного обеспечения постоянно появляются новые тренды и подходы. Одним из таких трендов, набирающих популярность в последние годы, является функциональное программирование (ФП). Давайте разберемся, почему это происходит!
➡️Что такое функциональное программирование?
Функциональное программирование - это парадигма, в которой процесс вычисления рассматривается как вычисление математических функций. Основная идея заключается в том, чтобы избегать изменяемого состояния и мутаций данных.
➡️Почему ФП становится популярнее?
💬Упрощение параллельного программирования: Отсутствие побочных эффектов делает код более предсказуемым и легким для распараллеливания.
💬Меньше багов: Неизменяемость данных и чистые функции снижают вероятность ошибок, связанных с состоянием программы.
💬Более читаемый код: ФП поощряет написание небольших, специализированных функций, что улучшает читаемость и поддерживаемость кода.
💬Легкость тестирования: Чистые функции легче тестировать, так как их поведение зависит только от входных данных.
💬Производительность: Некоторые функциональные концепции, такие как ленивые вычисления, могут повысить производительность программ.
➡️Заключение
Функциональное программирование становится все популярнее благодаря своим преимуществам в читаемости, тестируемости и параллельном выполнении. Хотя оно может потребовать некоторого времени для освоения, инвестиции в изучение ФП могут значительно улучшить качество вашего кода и эффективность разработки.
🐍Pythoner
6 · 2.4K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Зачем вообще париться с памятью в Python?
Казалось бы, Python — язык высокого уровня с автоматическим управлением памятью. Зачем нам вообще беспокоиться об этом? Но, друзья мои, даже в Пайтоне память не бесконечна. Особенно когда вы работаете с большими данными или создаете высоконагруженные приложения.
➡️memory_profiler: ваш верный спутник
memory_profiler — это как швейцарский нож для анализа памяти. Вот пример его использования:
from memory_profiler import profile
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
if __name__ == '__main__':
my_func()
⬆️Запустите скрипт с помощью python -m memory_profiler script.py, и вы увидите подробный отчет о использовании памяти. Красота, правда?
➡️line_profiler: когда нужна точность до строчки
Если memory_profiler — это швейцарский нож, то line_profiler — это микроскоп. Он покажет вам использование памяти построчно:
@profile
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a
my_func()
⬆️Запустите с помощью kernprof -l -v script.py, и вы увидите, какая строчка сколько памяти съедает.
➡️objgraph: визуализируем объекты
objgraph — это как рентген для вашего кода. Он позволяет визуализировать объекты в памяти:
import objgraph
x = []
y = [x, [x], dict(x=x)]
objgraph.show_refs([y], filename='sample-graph.png')
⬆️Запустите это, и вы получите красивую картинку связей между объектами. Полезно для поиска утечек памяти!
➡️tracemalloc: встроенная мощь Python
А теперь — жемчужина в короне Python 3. tracemalloc — это встроенный модуль для отслеживания выделения памяти:
import tracemalloc
tracemalloc.start()
# ваш код здесь
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[ Топ 10 ]")
for stat in top_stats[:10]:
print(stat)
⬆️Это как рентген, МРТ и УЗИ в одном флаконе. Вы увидите, где именно происходят утечки памяти.
🐍Pythoner
26 · 2.4K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️OpenAI Gym - это библиотека Python, которая предоставляет набор виртуальных сред для обучения агентов искусственного интеллекта. Среды Gym представляют собой упрощенные модели реальных задач, таких как игра в гольф, вождение автомобиля или управление роботом.
🔎Библиотека Gym может использоваться для:
➡️Для обучения агентов искусственного интеллекта, таких как нейронные сети и генетические алгоритмы.
➡️Для исследования искусственного интеллекта, например, для разработки новых алгоритмов обучения агентов.
➡️Для визуализации действий агентов искусственного интеллекта.
➡️OpenAI Gym предоставляет простой и интуитивно понятный интерфейс для взаимодействия с средами. Разработчики могут создавать агентов, определять действия, наблюдать состояния и получать обратную связь. Он также предлагает мощные инструменты для оценки и сравнения алгоритмов машинного обучения, позволяя разработчикам точно измерять производительность своих моделей.
🐍Pythoner
8 · 2.3K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
💬HTTP GET
Этот метод извлекает ресурс с сервера. Он идемпотентен: несколько идентичных запросов возвращают один и тот же результат.
💬HTTP PUT
Этот метод обновляет или создает ресурс. Он также идемпотентен: несколько идентичных запросов обновят один и тот же ресурс.
💬HTTP POST
Этот метод используется для создания новых ресурсов. Он не идемпотентен: два одинаковых POST-запроса создадут дублированные ресурсы.
💬HTTP DELETE
Этот метод используется для удаления ресурса. Он идемпотентен: несколько идентичных запросов удалят один и тот же ресурс.
💬HTTP PATCH
Метод PATCH применяется для частичного изменения ресурса.
💬HTTP HEAD
Метод HEAD запрашивает ответ, идентичный GET-запросу, но без тела ответа.
💬HTTP CONNECT
Метод CONNECT устанавливает туннель к серверу, идентифицированному целевым ресурсом.
💬HTTP OPTIONS
Этот метод описывает параметры связи для целевого ресурса.
💬HTTP TRACE
Этот метод выполняет тест возврата сообщения по пути к целевому ресурсу.
👀Так же прикрепляю фото без сжатия если будет плохо видно на основном фото
🐍Pythoner
22 · 2.4K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Скачивание файла с помощью requests довольно прямолинейно. Вам просто нужно сделать запрос к URL-адресу файла, который вы хотите скачать, а затем записать ответ в файл. Вот пример кода, который скачивает изображение с интернета:
import requests
url = '<https://example.com/image.jpg>'
response = requests.get(url)
with open('image.jpg', 'wb') as f:
f.write(response.content)
➡️Работа с ошибками
Важно обрабатывать возможные ошибки при скачивании файла. Если файл не найден или произошла другая ошибка, requests вернет код ответа, отличный от 200. В этом случае вы должны проверять статус ответа перед записью файла.
➡️Вот пример кода, который скачивает реальный pdf файл с сайта:
import requests
headers = {'referer': 'https://nottka.com/4364-yoshinao-nakada-etude-allegro.html'}
response = requests.get('https://nottka.com/index.php?do=download&id=4420', headers=headers)
with open('4420.pdf', 'wb') as file:
file.write(response.content)
🐍Pythoner
13 · 2.3K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Монолитная архитектура
Монолитная архитектура представляет собой традиционный подход к разработке приложений, где все компоненты тесно связаны и работают как единое целое.
➕Преимущества:
💬Простота разработки и развертывания
💬Легкость в отладке и тестировании
💬Высокая производительность из-за отсутствия сетевых задержек между компонентами
❌Недостатки:
💬Сложность масштабирования отдельных компонентов
💬Затруднительное внедрение новых технологий
💬Риск "снежного кома" при росте сложности проекта
➡️Микросервисная архитектура
Микросервисная архитектура разбивает приложение на набор небольших, независимых сервисов, каждый из которых отвечает за конкретную бизнес-функцию.
➕Преимущества:
💬Гибкость в выборе технологий для каждого сервиса
💬Легкость масштабирования отдельных компонентов
💬Возможность независимой разработки и развертывания сервисов
❌Недостатки:
💬Сложность в управлении и оркестрации множества сервисов
💬Повышенные требования к инфраструктуре
💬Потенциальные проблемы с производительностью из-за сетевых взаимодействий
🔎Что выбрать для вашего проекта?
Выбор архитектуры зависит от нескольких факторов:
➡️Выбирайте монолитную архитектуру, если:
💬У вас небольшой проект или стартап
💬Вам нужно быстро вывести продукт на рынок
💬У вас ограниченные ресурсы для разработки и поддержки
➡️Выбирайте микросервисную архитектуру, если:
💬У вас крупный проект с множеством функций
💬Вам нужна высокая масштабируемость и гибкость
💬У вас есть ресурсы для управления сложной инфраструктурой
➡️Заключение
Выбор между микросервисами и монолитной архитектурой не является универсальным. Каждый подход имеет свои сильные стороны, и правильный выбор зависит от конкретных требований вашего проекта, ресурсов команды и долгосрочных целей. Важно тщательно оценить все факторы и принять решение, которое наилучшим образом соответствует вашим потребностям.
🐍Pythoner
8 · 2.4K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Что такое итерируемый счетчик?
Итерируемый счетчик в 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
14 · 2.3K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Тернарный оператор — это оператор, позволяющий записать условную конструкцию if-else в одну строку.
➡️Тернарный оператор часто используется для условного присваивания значений переменной, выбора между двумя вариантами в одну строку. Он позволяет сократить и упростить запись условных выражений. Однако не рекомендуется использовать вложенные конструкции, т. к. это ухудшает читаемость.
➡️Простой пример:
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.
🐍Pythoner
13 · 1.9K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Анализ текста с помощью spaCy
➡️Токенизация и лемматизация
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 в первую очередь предназначен для анализа текста, его можно использовать и для помощи в генерации:
➡️Использование зависимостей для построения предложений
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("компьютер"))
🐍Pythoner
13 · 1.8K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Проблема традиционного подхода
Многие статьи рекомендуют создавать полноценный 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
10 · 1.9K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Сегодня мы нырнем в глубины Python и раскопаем настоящие жемчужины — нестандартные способы использования декораторов. Держитесь крепче, будет интересно!
➡️Декораторы на стероидах: когда обычных функций мало
Помните, как вы впервые узнали о декораторах? Наверняка это было что-то вроде @staticmethod или простенького таймера. Но, друзья мои, это лишь верхушка айсберга! Давайте посмотрим, как можно выжать из декораторов все соки.
➡️1. Декоратор-шпион: следим за аргументами
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")
⬆️Этот хитрый декоратор не просто логирует вызовы, он позволяет отслеживать все входящие аргументы. Представьте, как это может пригодиться при отладке сложных систем!
➡️2. Декоратор-трансформер: меняем возвращаемое значение
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 = получить_данные()
⬆️Этот декоратор автоматически сериализует результат в JSON. Удобно, правда? Особенно когда вы работаете с API и вам нужно гарантировать формат ответа.
➡️3. Декоратор-многостаночник: применяем несколько функций
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
25 · 5K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Тернарный оператор, также известный как условный оператор, является уникальным оператором, который используется для выполнения конденсированных версий простых операторов if-else. Он принимает три аргумента: условие, значение, если условие истинно, и значение, если условие ложно.
➡️Применение тернарного оператора
Тернарный оператор используется, когда мы хотим сократить код и упростить чтение. Это особенно полезно в случаях, когда нам нужно сделать простое условное присваивание. Однако из-за его сжатого формата, использование тернарного оператора в сложных условиях может затруднить понимание кода.
➡️Тернарный оператор в Python
Да, Python поддерживает тернарный оператор. В Python тернарный оператор выглядит следующим образом: x if condition else y. Здесь x присваивается, если условие истинно, иначе присваивается y.
➡️Пример использования тернарного оператора в Python:
age = 15
type = "teenager" if age < 18 else "adult"
print(type) # Выведет: teenager
⬆️В этом примере, если переменная age меньше 18, переменной type присваивается значение "teenager", в противном случае - "adult".
🐍 Pythoner
9 · 5.2K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Модуль 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.
🐍Pythoner
17 · 7.2K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Memray - это библиотека для профилирования памяти и она является важным инструментом оптимизации производительности Python программ.
➡️Библиотека отслеживает выделение и освобождение памяти при работе программы, поддерживает отслеживание ссылок на объект, применятся для профилирования на серверах и в виртуальных окружениях.
➡️Основные функции:
💬Отслеживание выделения памяти в реальном времени.
💬Анализ использования памяти по различным объектам и их типам.
💬Предоставление удобных отчетов и визуализаций для упрощения диагностики.
➡️Пример использования:
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
13 · 1.8K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️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
15 · 1.7K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Полиморфизм - ключевой принцип объектно-ориентированного программирования (ООП), позволяющий объектам различных классов иметь одинаковый интерфейс. Термин "полиморфизм" происходит от греческого слова, означающего "множество форм". В 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):
14 · 2.1K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Жадные алгоритмы полезны для решения задач оптимизации, делая ряд локально оптимальных выборов, которые приводят к глобально оптимальному решению. На каждом шаге они выбирают наилучший доступный вариант, не принимая во внимание последствия будущих выборов. Хотя они не гарантируют абсолютно наилучшего решения, они часто предоставляют быстрые и приемлемые решения.
➡️Пример — жадный алгоритм для дробной задачи о рюкзаке на Python
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)
➡️Объяснение алгоритма
В этом примере мы используем жадный алгоритм для решения задачи о дробном рюкзаке. Учитывая набор элементов с весами и значениями, цель состоит в том, чтобы выбрать элементы, чтобы максимизировать общую стоимость, не превышая при этом определенный предел веса (емкость рюкзака). Алгоритм сортирует элементы по соотношению их стоимости к весу и выбирает элементы жадно, максимизируя общую стоимость в пределах ограничения емкости.
➡️Применение жадных алгоритмов
Жадные алгоритмы особенно полезны, когда проблема демонстрирует свойство жадного выбора, что означает, что локально оптимальный выбор на каждом шаге приводит к глобально оптимальному решению. Однако важно отметить, что не все проблемы можно решить оптимально с помощью жадного подхода, поэтому требуется тщательный анализ, чтобы определить, когда целесообразно использовать этот метод.
🐍Pythoner
11 · 2.1K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️Метод tell() используется для получения текущей позиции (смещения) при работе с файлами и файлоподобными объектами.
➡️Это позволяет:
—Узнать размер файла, сравнив позицию после чтения с начальной.
—Вернуться к определенной позиции с помощью seek().
—Отслеживать прогресс обработки больших файлов.
—Получить позицию в строковых буферах и потоках байтов.
➡️Вот пример, который демонстрирует использование tell():
# Открываем файл для записи
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 после чтения.
🐍Pythoner
11 · 1.9K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️В Python си-коллбеки (C callbacks) — это механизм, позволяющий вызывать функции, написанные на языке C или C++, из Python кода. Это мощный инструмент для интеграции Python с существующими библиотеками C/C++ или для оптимизации производительности критически важных участков кода.
➡️ Применение си-коллбеков находит применение в различных областях, таких как:
* Интеграция с C/C++ библиотеками: вызов функций из библиотек, написанных на C/C++, непосредственно из Python.
* Оптимизация производительности: реализация критичных к производительности участков кода на C/C++ и вызов их из Python.
* Обработка событий: использование функций Python в качестве обработчиков событий в C/C++ приложениях.
* Расширение функциональности Python: добавление новых возможностей в Python с помощью C/C++.
➡️Вот пример использования си-коллбеков с ctypes:
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()
➡️Пример кода на C (callback_example.c):
#include <stdio.h>
#include <unistd.h> // for sleep
typedef void (*callback_function)(int);
static callback_function registered_callback
10 · 1.2K · Pythoner
Фотография
нажмите — покажем
нажмите — покажем
✈️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. В данном случае возвращаются не только ссылки, но и заголовки
17 · 1.1K ·