Основой для рисования в 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)
<B1-Motion>).Вы можете легко изменить размер "кисти", увеличив размер создаваемого овала:
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')
Вы можете расширить функциональность вашего приложения для рисования, добавив следующие возможности:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4❤3🤝2
Чтобы использовать Memray, нужно сначала установить его с помощью pip:
pip install memray
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
🔥8❤3👍2
Перегрузка методов - это возможность класса иметь несколько методов с одинаковым именем, но разными параметрами. В 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
👍9❤3🔥2
🔥8👍3
Регистр тоже играет важную роль! Помни, что "a" - это не то же самое что "A"
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍10🔥3
Сделали для подписчиков наших каналов по Python небольшой розыгрыш звёзд😘
P.S. говорят если переслать этот розыгрыш друзьям, то шанс увеличится.
1 ноября в 18 часов по мск, 5 победителей получат по 100 звёзд, которые можно тратить в нашем и других каналах, дарить подарки и другое, удачи!
P.S. говорят если переслать этот розыгрыш друзьям, то шанс увеличится.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤1🥰1
Forwarded from IT memer
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣19👍2🙈2💯1
message_effect_id - это уникальный идентификатор, используемый в Telegram Bot API для определения конкретного визуального эффекта, который можно применить к сообщению. Эти эффекты представляют собой анимированные реакции, которые пользователи могут добавлять к сообщениям.
➡️ Основные характеристики message_effect_id:
Уникальность: Каждый эффект имеет свой уникальный числовой идентификатор.Формат: Идентификаторы представлены в виде строк, содержащих длинные числовые значения.Связь с эмодзи: Каждый message_effect_id соответствует определенному эмодзи, которое визуально представляет эффект.
➡️ Примеры message_effect_id:
➡️ Использование в Telegram Bot API:
Применение эффектов: Боты могут использовать эти идентификаторы для добавления анимированных реакций к сообщениям.Интерактивность: Позволяет создавать более динамичные и интерактивные взаимодействия в чатах.Кастомизация: Разработчики могут выбирать конкретные эффекты для различных сценариев использования бота.
➡️ Значение для разработчиков:
Понимание и правильное использование message_effect_id позволяет разработчикам ботов создавать более привлекательные и интерактивные интерфейсы, улучшая пользовательский опыт в Telegram.
🐍 Pythoner
Уникальность: Каждый эффект имеет свой уникальный числовой идентификатор.Формат: Идентификаторы представлены в виде строк, содержащих длинные числовые значения.Связь с эмодзи: Каждый message_effect_id соответствует определенному эмодзи, которое визуально представляет эффект.
{
'🔥': "5104841245755180586",
'👍': "5107584321108051014",
'👎': "5104858069142078462",
'❤️': "5044134455711629726",
'🎉': "5046509860389126442",
'💩': "5046589136895476101"
}Применение эффектов: Боты могут использовать эти идентификаторы для добавления анимированных реакций к сообщениям.Интерактивность: Позволяет создавать более динамичные и интерактивные взаимодействия в чатах.Кастомизация: Разработчики могут выбирать конкретные эффекты для различных сценариев использования бота.
Понимание и правильное использование message_effect_id позволяет разработчикам ботов создавать более привлекательные и интерактивные интерфейсы, улучшая пользовательский опыт в Telegram.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4🔥3
Итерируемый счетчик в Python - это объект, который можно использовать в цикле for и других итерационных контекстах. Он позволяет последовательно получать значения, обычно числовые, в заданном диапазоне или по определенному правилу.
Давайте рассмотрим пример реализации простого итерируемого счетчика:
class IterableCounter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current > self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1
В этом примере:
Теперь мы можем использовать наш счетчик в цикле for:
counter = IterableCounter(1, 5)
for num in counter:
print(num)
В Python есть встроенные альтернативы для простых случаев:
Итерируемые счетчики в Python - мощный инструмент для создания пользовательских последовательностей. Они особенно полезны, когда стандартные функции не удовлетворяют специфическим требованиям вашей задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5❤2🤔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
👍11❤4🔥4
Эта функция суммирует ASCII-значения символов входной строки и применяет операцию модуля. Она проста в реализации, но может привести к неравномерному распределению.
def simple_hash(input_str, table_size):
hash_value = 0
for char in input_str:
hash_value += ord(char)
return hash_value % table_size
Использует полиномиальное накопление ASCII-значений с простым числом, что позволяет придать больший вес символам в начале строки.
def polynomial_hash(input_str, table_size, prime=31):
hash_value = 0
for i, char in enumerate(input_str):
hash_value += ord(char) * (prime ** i)
return hash_value % table_size
32-битная версия FNV-1a хэша, известная своими хорошими характеристиками распределения.
def fnv1a_hash(key, table_size):
FNV_prime = 16777619
FNV_offset_basis = 2166136261
hash_value = FNV_offset_basis
for char in key:
hash_value ^= ord(char)
hash_value *= FNV_prime
hash_value &= 0xffffffff # Обеспечивает 32-битный хэш
return hash_value % table_size
Использует библиотеку xxhash для быстрого некриптографического хэширования, эффективного для больших объемов данных.
def xx_hash(input_str, table_size):
return xxhash.xxh32(input_str).intdigest() % table_size
Применяет HMAC с SHA-256 для повышенной безопасности, но может быть медленнее некриптографических хэшей.
def sip_hash(input_str, table_size, key=b'secretkey'):
hash_value = hmac.new(key, input_str.encode(), digestmod='sha256').hexdigest()
return int(hash_value, 16) % table_size
Быстрая некриптографическая хэш-функция, часто используемая в хэш-таблицах и фильтрах Блума.
def murmur_hash(input_str, table_size):
hash_value = mmh3.hash(input_str) % table_size
return hash_value
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5🔥3
Для тестирования используется функция generate_random_strings, которая создает случайные строки заданной длины.
Функция test_distribution_and_collisions оценивает качество распределения элементов по хэш-таблице и подсчитывает количество коллизий.
Функция test_execution_time измеряет время, необходимое для хэширования набора элементов, что позволяет сравнить производительность разных хэш-функций.
Функция test_sensitivity проверяет, насколько хэш-функция чувствительна к небольшим изменениям во входных данных.
Выбор подходящей хэш-функции зависит от конкретных требований приложения. Простые хэш-функции могут быть достаточными для небольших наборов данных, в то время как для больших объемов данных или повышенных требований к безопасности могут потребоваться более сложные алгоритмы. Важно учитывать баланс между скоростью выполнения, качеством распределения и устойчивостью к коллизиям при выборе хэш-функции для конкретной задачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥1
Куча (heap) - это элегантная структура данных, которая часто используется для реализации приоритетной очереди. В то время как приоритетная очередь - это абстрактная структура данных, определяющая поведение и интерфейс, куча - это конкретная реализация, определяющая, как эта структура работает.
➡️ Основные операции
Реализация приоритетной очереди обычно предоставляет следующие методы:
💬 Вставить(H, x): вставить элемент x в приоритетную очередь H
💬 Find(H): вернуть элемент с наивысшим приоритетом в очереди H
💬 Delete(H): удалить элемент с наименьшим (или наибольшим) значением в очереди H
➡️ Бинарная куча
В этой статье мы сосредоточимся на реализации бинарной кучи (Binary Heap), где каждый узел может иметь максимум двух потомков. В min-heap родительский узел всегда имеет меньшее значение, чем его потомки, а в max-heap - большее.
➡️ Представление данных
Куча может быть представлена в виде массива, где позиции левого и правого потомков можно вычислить с помощью простых формул. Для элемента с индексом k:
💬 Индекс левого потомка: 2*k + 1
💬 Индекс правого потомка: 2*k + 2
💬 Индекс родителя: (k - 1) // 2
➡️ Применение, кучи находят широкое применение в различных алгоритмах и реальных сценариях:
💬 Сортировка: пирамидальная сортировка (Heapsort) имеет временную сложность O(n log n) в худшем случае
💬 Алгоритмы поиска на графах: A* и алгоритм Дейкстры используют кучи для хранения пар приоритет-узел
💬 Кодирование Хаффмана: кучи применяются для хранения и извлечения деревьев с наименьшей частотой
➡️ Реализация в Python
В стандартной библиотеке Python API для работы с кучами находится в модуле heapq. Вот пример использования:
➡️ Собственная реализация MinHeap
Ниже представлена базовая структура класса MinHeap с основными методами:
➡️ Заключение
Кучи - это мощная и эффективная структура данных, которая находит применение во многих алгоритмах и реальных задачах. Понимание принципов работы куч и умение их реализовывать - важный навык для каждого программиста.
🐍 Pythoner
Реализация приоритетной очереди обычно предоставляет следующие методы:
В этой статье мы сосредоточимся на реализации бинарной кучи (Binary Heap), где каждый узел может иметь максимум двух потомков. В min-heap родительский узел всегда имеет меньшее значение, чем его потомки, а в max-heap - большее.
Куча может быть представлена в виде массива, где позиции левого и правого потомков можно вычислить с помощью простых формул. Для элемента с индексом k:
В стандартной библиотеке Python API для работы с кучами находится в модуле heapq. Вот пример использования:
import heapq
unsorted_array = [100, 230, 44, 1, 74, 12013, 84]
heapq.heapify(unsorted_array)
print(unsorted_array)
# [1, 74, 44, 230, 100, 12013, 84]
sorted_array = []
for _ in range(len(unsorted_array)):
sorted_array.append(heapq.heappop(unsorted_array))
print(sorted_array)
# [1, 44, 74, 84, 100, 230, 12013]
Ниже представлена базовая структура класса MinHeap с основными методами:
class MinHeap:
def __init__(self):
self.nodes = []
def add(self, item):
self.nodes.append(item)
self.__heapify_up()
def poll(self):
if self.is_empty():
return None
removed_node = self.nodes[0]
self.nodes[0] = self.nodes[-1]
del self.nodes[-1]
self.__heapify_down()
return removed_node
def peek(self):
return self.nodes[0] if not self.is_empty() else None
def is_empty(self):
return len(self.nodes) == 0
def __heapify_up(self):
# Реализация метода подъема элемента
def __heapify_down(self):
# Реализация метода опускания элемента
Кучи - это мощная и эффективная структура данных, которая находит применение во многих алгоритмах и реальных задачах. Понимание принципов работы куч и умение их реализовывать - важный навык для каждого программиста.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3🔥3
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
👍8❤3🔥3
Лямбда-функции определяются с помощью ключевого слова
lambda, в отличие от обычных функций, которые определяются с помощью def. Они позволяют писать более чистый и читаемый код, устраняя необходимость во временных определениях функций.lambda arguments: expression
Например, простая лямбда-функция для сложения двух чисел:
add = lambda x, y: x + y
result = add(3, 5)
print(result) # Выведет: 8
1. С функцией map()
map() применяет функцию к каждому элементу итерируемого объекта:numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # Выведет: [1, 4, 9, 16]
2. С функцией filter()
filter() используется для фильтрации элементов:numbers = [1, 2, 3, 4]
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even) # Выведет: [2, 4]
3. С функцией sorted()
sorted() позволяет сортировать элементы по заданному критерию:points = [(1, 2), (3, 1), (5, -1)]
points_sorted = sorted(points, key=lambda point: point[1])
print(points_sorted) # Выведет: [(5, -1), (3, 1), (1, 2)]
nested_lambda = lambda x: (lambda y: y ** 2)(x) + 1
print(nested_lambda(3)) # Выведет: 10
Пример использования с Pandas:
import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6]}
df = pd.DataFrame(data)
df['C'] = df.apply(lambda row: row['A'] + row['B'], axis=1)
print(df)
Лямбда-функции в Python — мощный инструмент для создания кратких, анонимных функций. При правильном использовании они могут значительно улучшить читаемость и эффективность кода. Однако важно помнить об их ограничениях и использовать их разумно, в соответствии с лучшими практиками программирования.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤5🔥3
SWE-Kit представляет собой headless IDE с такими функциями, как LSP (Language Server Protocol), индексация кода и Code RAG (Retrieval-Augmented Generation). Он предлагает гибкую среду выполнения, которая может работать на любом хосте Docker или удаленном сервере, а также специализированные наборы инструментов для кодирования.
pip install compsio-core swekit
pip install crewai composio-crewai
composio add github
swekit scaffold crewai -o swe_agent
cd swe_agent/agent
python main.py
SWE-Kit позволяет создавать и развертывать собственные агенты, такие как GitHub PR Agent для автоматизации проверки Pull Request, агент SWE для автоматического написания функций, модульных тестов и документации, а также инструмент для чата с кодовой базой.
Aider - это идеальный выбор для тех, кто ищет виртуального парного программиста. Он позволяет связать программы с моделями машинного обучения (LLM) для редактирования кода в вашем локальном репозитории GitHub.
pip install aider-chat
cd /to/your/git/repo
export ANTHROPIC_API_KEY=your-key-goes-here
aider
# Или для работы с GPT-4
export OPENAI_API_KEY=your-key-goes-here
aider
Mentat - это инструмент на основе ИИ, призванный помочь разработчикам справиться с любой задачей по написанию кода из командной строки. В отличие от других инструментов, Mentat может координировать правки в нескольких файлах и понимает контекст проекта с самого начала.
python3 -m venv .venv
source .venv/bin/activate
git clone https://github.com/AbanteAI/mentat.git
cd mentat
pip install -e .
export OPENAI_API_KEY=<your key here>
mentat <paths to files or directories>
AutoCodeRover предлагает полностью автоматизированное решение для устранения проблем GitHub, включая исправление ошибок и добавление функций. Он объединяет LLM с расширенными возможностями анализа и отладки для эффективного создания и внедрения исправлений.
export OPENAI_KEY=sk-YOUR-OPENAI-API-KEY-HERE
docker build -f Dockerfile -t acr .
docker run -it -e OPENAI_KEY="${OPENAI_KEY:-OPENAI_API_KEY}" -p 3000:3000 -p 5000:5000 acr
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4❤3