Kodduu Python
1.08K subscribers
311 photos
28 videos
187 links
Научись программировать на Python на интересных примерах

Самый быстрый курс https://stepik.org/a/187914
Самый нескучный курс https://stepik.org/a/185238

Во вопросам сотрудничества: @AlexErf
Download Telegram
🔑 Генерация и проверка безопасных токенов


import secrets
import hashlib

def generate_token():
return secrets.token_urlsafe(32)

def hash_token(token):
return hashlib.sha256(token.encode()).hexdigest()

def check_token(token, token_hash):
return hash_token(token) == token_hash

if __name__ == "__main__":
t = generate_token()
h = hash_token(t)
print("🔐 Token:", t)
print("📦 Hash:", h)
print(" Проверка:", check_token(t, h))


📌 Что делает:
Генерирует безопасный токен для API/сессий, хэширует его и позволяет проверять без хранения оригинала. Подходит для авторизации, одноразовых ключей и подтверждений.

🛠
Использует только стандартную библиотеку.

Подпишись 👉🏻 @KodduuPython 🤖
👍2
📂 Автоочистка старых файлов в папке


import os, time

def clean_old_files(path, days=7):
now = time.time()
cutoff = now - days * 86400
for f in os.listdir(path):
full = os.path.join(path, f)
if os.path.isfile(full) and os.path.getmtime(full) < cutoff:
os.remove(full)
print(f"🗑 Удален: {full}")

if __name__ == "__main__":
clean_old_files("/tmp", days=3)


📌 Что делает:
Удаляет файлы старше указанного числа дней в папке. Полезно для логов, временных файлов и кэшей.

🛠
Стандартная библиотека, без зависимостей.

Подпишись 👉🏻 @KodduuPython 🤖
3👍1
📨 Отправка письма через Gmail (SMTP)


import smtplib
from email.mime.text import MIMEText

def send_email(to_addr, subject, body, from_addr, password):
msg = MIMEText(body, "plain", "utf-8")
msg["Subject"] = subject
msg["From"] = from_addr
msg["To"] = to_addr

with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(from_addr, password)
server.send_message(msg)
print(" Письмо отправлено")

if __name__ == "__main__":
send_email(
"recipient@example.com",
"Test subject",
"Hello from Python!",
"your@gmail.com",
"app-password-here"
)


📌 Что делает:
Простая отправка писем через Gmail с авторизацией. Рабочий вариант для уведомлений и алертов в проде.

🛠
Без внешних зависимостей.
Для Gmail нужен [App Password](https://myaccount.google.com/apppasswords).

Подпишись 👉🏻 @KodduuPython 🤖
👍2
📦 Автоматическая распаковка всех архивов в папке


import os, zipfile

def unzip_all(path):
for f in os.listdir(path):
if f.endswith(".zip"):
full = os.path.join(path, f)
extract_to = os.path.join(path, f[:-4])
os.makedirs(extract_to, exist_ok=True)
with zipfile.ZipFile(full, "r") as zf:
zf.extractall(extract_to)
print(f" Распакован: {full} → {extract_to}")

if __name__ == "__main__":
unzip_all("./archives")


📌 Что делает:
Находит все .zip в указанной папке и автоматически распаковывает их в подпапки с тем же именем. Отлично подходит для загрузок или бэкапов.

🛠
Только стандартная библиотека.

Подпишись 👉🏻 @KodduuPython 🤖
🖼️ Сжатие изображений до нужного размера (KB)


from PIL import Image
import os

def compress_image(input_path, output_path, target_kb=200, step=5):
img = Image.open(input_path)
quality = 95
while True:
img.save(output_path, optimize=True, quality=quality)
size_kb = os.path.getsize(output_path) // 1024
if size_kb <= target_kb or quality <= step:
break
quality -= step
print(f" {output_path}: {size_kb}KB (q={quality})")

if __name__ == "__main__":
compress_image("input.jpg", "output.jpg", target_kb=150)


📌 Что делает:
Сжимает JPEG-картинку до целевого размера в KB, регулируя quality. Отлично подходит для подготовки картинок в web/prod, чтобы не грузить лишние мегабайты.

🛠


pip install pillow


Подпишись 👉🏻 @KodduuPython 🤖
✏️ Таблица умножения как в тетрадке


from PIL import Image, ImageDraw, ImageFont

def multiplication_table(size=10, cell=60, output="table.jpg"):
img_size = (cell*(size+1), cell*(size+1))
img = Image.new("RGB", img_size, "white")
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 24)

for i in range(size+1):
for j in range(size+1):
text = str(i*j) if i and j else (str(i) if j==0 else str(j))
w, h = draw.textsize(text, font=font)
x, y = j*cell + (cell-w)//2, i*cell + (cell-h)//2
draw.text((x, y), text, fill="black", font=font)
draw.rectangle([j*cell, i*cell, (j+1)*cell, (i+1)*cell], outline="gray")

img.save(output)

if __name__ == "__main__":
multiplication_table()


Подпишись 👉🏻 @KodduuPython 🤖
3
📱 Авто-ресайз изображений под соцсети


from PIL import Image

SIZES = {
"instagram_post": (1080, 1080),
"instagram_story": (1080, 1920),
"telegram": (1280, 720),
"vk": (1200, 628),
}

def resize_for_social(input_path, output_dir):
img = Image.open(input_path)
for name, size in SIZES.items():
out_path = f"{output_dir}/{name}.jpg"
img_resized = img.copy()
img_resized.thumbnail(size)
img_resized.save(out_path, "JPEG", quality=90)
print(f" {name}: {out_path}")

if __name__ == "__main__":
resize_for_social("input.jpg", "./out")


📌 Что делает:
Создаёт версии картинки в нужных размерах для Instagram, Telegram и VK.

🛠


pip install pillow


Подпишись 👉🏻 @KodduuPython 🤖
🔥1
🖼️ Конвертация PNG → JPEG с удалением прозрачности


from PIL import Image
import os

def png_to_jpg(src, dst):
img = Image.open(src).convert("RGB") # убираем альфу
img.save(dst, "JPEG", quality=90)
print(f" {src} → {dst}")

if __name__ == "__main__":
for f in os.listdir("./images"):
if f.endswith(".png"):
png_to_jpg(f"./images/{f}", f"./images/{f[:-4]}.jpg")


📌 Что делает:
Массово конвертирует PNG-файлы в JPEG, автоматически убирая прозрачность (заменяет на белый фон).

🛠


pip install pillow


Подпишись 👉🏻 @KodduuPython 🤖
👍1
🌦️ Прогноз погоды на сегодня


import requests

API_KEY = "your_openweathermap_api_key"
CITY = "Moscow"
URL = f"http://api.openweathermap.org/data/2.5/weather?q={CITY}&appid={API_KEY}&units=metric&lang=ru"

def get_weather():
res = requests.get(URL)
if res.status_code == 200:
data = res.json()
print(f"Погода в {CITY}: {data['weather'][0]['description'].capitalize()}, {data['main']['temp']}°C")
else:
print("Ошибка при получении данных")

if __name__ == "__main__":
get_weather()


📌 Получает текущую погоду в указанном городе через OpenWeatherMap API.

🛠


pip install requests


Подпишись 👉🏻 @KodduuPython 🤖
🔥2
📬 Авто-рассылка поздравлений с Днём рождения


import smtplib
from email.mime.text import MIMEText

BIRTHDAYS = {
"alice@example.com": "Alice",
"bob@example.com": "Bob"
}

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
EMAIL = "your_email@gmail.com"
PASSWORD = "your_password"

def send_birthday_email(to_email, name):
msg = MIMEText(f"С днём рождения, {name}! 🎉")
msg["Subject"] = "Поздравление 🎂"
msg["From"] = EMAIL
msg["To"] = to_email

with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL, PASSWORD)
server.send_message(msg)
print(f" Отправлено: {name}")

if __name__ == "__main__":
for email, name in BIRTHDAYS.items():
send_birthday_email(email, name)


📌 Отправляет простое поздравление на почту всем из списка.

🛠


pip install secure-smtplib


Подпишись 👉🏻 @KodduuPython 🤖
📝 Быстрое извлечение текста из PDF


import sys
from PyPDF2 import PdfReader

def extract_text(pdf_path):
reader = PdfReader(pdf_path)
for i, page in enumerate(reader.pages, 1):
text = page.extract_text()
print(f"--- Страница {i} ---\n{text}\n")

if __name__ == "__main__":
extract_text(sys.argv[1])


📌 Извлекает и печатает текст из PDF — удобно для быстрых проверок документов.

🛠


pip install PyPDF2


Подпишись 👉🏻 @KodduuPython 🤖
👍2
Forwarded from AIGENTTO
LLM нападет на человечество

Вокруг пугают тем, что ИИ нападет на человечество. И есть уже эксперименты, где LLM принимает аморальные решения для достижения поставленной цели.
Но как всегда слона (большую проблему) в лавке и не заметили, реальная проблема — это использование ИИ людьми для незаконных действий.

Мошенники всех мастей уже на пике технологий. Ко мне лично уже приходили аватары на Zoom-собеседование, и HR не заметил, что это не люди 😎

Принимать голосовые или видеозвонки от неизвестных в наше время — это уже достаточно высокая угроза. Текст имеет значительно меньшее влияние.

Возможен и видеозвонок от того, кого вы знаете, тогда лучше перезвонить самому.

Короче, нужно перейти на минимальное доверие ко всем видео/голосовым входящим. Сейчас уже даже сделки с недвижимостью совершаются без созвонов, чата достаточно.

Текст будет единственным валидным способом коммуникации в будущем, до тех пор, пока Elon Musk, не внедрил всем в мозг нейролинк 🧠

Подпишись 👉🏻 @aigentto 🤖
2
🔑 Генератор надёжных паролей


import secrets
import string

def generate_password(length=16):
alphabet = string.ascii_letters + string.digits + string.punctuation
return ''.join(secrets.choice(alphabet) for _ in range(length))

if __name__ == "__main__":
print("Ваш новый пароль:", generate_password())


📌 Создаёт криптостойкий пароль для учётных записей или сервисов.

🛠
Без зависимостей.

Подпишись 👉🏻 @KodduuPython 🤖
👍3
👀 Авто-сортировщик файлов в реальном времени


import time, shutil, pathlib
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

DOWNLOADS = pathlib.Path.home() / "Downloads"
TARGETS = {
"Images": [".jpg", ".jpeg", ".png", ".gif"],
"Docs": [".pdf", ".docx", ".txt"],
"Archives": [".zip", ".rar", ".tar", ".gz"],
"Music": [".mp3", ".wav"],
}

class SortHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory:
file = pathlib.Path(event.src_path)
ext = file.suffix.lower()
for folder, exts in TARGETS.items():
if ext in exts:
dest = DOWNLOADS / folder
dest.mkdir(exist_ok=True)
shutil.move(str(file), dest / file.name)
print(f"📦 {file.name} → {folder}")
break

if __name__ == "__main__":
observer = Observer()
observer.schedule(SortHandler(), str(DOWNLOADS), recursive=False)
observer.start()
print("👀 Следим за папкой Downloads...")
try:
while True: time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()


📌 Теперь скрипт в фоне следит за папкой Downloads и сразу раскладывает новые файлы по папкам.

🛠


pip install watchdog


Подпишись 👉🏻 @KodduuPython 🤖
🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
Анимация «волны»


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig, ax = plt.subplots()
x = np.linspace(0, 4*np.pi, 400)
line, = ax.plot(x, np.sin(x), lw=2)
ax.set_ylim(-1.2, 1.2)

def update(frame):
line.set_ydata(np.sin(x + frame/10))
return line,

ani = animation.FuncAnimation(fig, update, frames=200, interval=30, blit=True)
plt.show()


📌 Простая анимация синусоиды, которая движется как волна

🛠


pip install matplotlib numpy


Подпишись 👉🏻 @KodduuPython 🤖
This media is not supported in your browser
VIEW IN TELEGRAM
🕹 ZX Spectrum loading screen



pygame.init()
pygame.mixer.quit() # сбросим микшер
pygame.mixer.init(frequency=22050, size=-16, channels=1) # моно

W, H = 600, 400
screen = pygame.display.set_mode((W, H))
clock = pygame.time.Clock()

def beep(freq=800, dur=50):
sample_rate = 22050
n = int(sample_rate * dur / 1000)
arr = (np.sin(2*np.pi*np.arange(n)*freq/sample_rate)*32767).astype(np.int16)
sound = pygame.sndarray.make_sound(arr)
sound.play()
pygame.time.delay(dur)

colors = [(255,0,0),(0,255,0),(0,0,255),(255,255,0),(255,0,255),(0,255,255)]

for _ in range(120):
for e in pygame.event.get():
if e.type == pygame.QUIT: sys.exit()
rect_h = random.randint(5, 30)
y = random.randint(0, H-rect_h)
color = random.choice(colors)
pygame.draw.rect(screen, color, (0, y, W, rect_h))
pygame.display.flip()
beep(random.randint(300, 1200), 40)
time.sleep(0.02)

time.sleep(1)


Подпишись 👉🏻 @KodduuPython 🤖
Forwarded from AIGENTTO
Хрупкость всех agentic систем

Во всех мультиагентных системах есть одно хрупкое место — это протокол общения между агентами или роутинг между ними.

По сути, можно сделать жёсткий роутинг прямо в коде. Можно сделать условный роутинг тоже в коде. А можно настроить гибкий роутинг во фреймворках AutoGen, LangChain. Но даже в гибких вариантах это определённая договорённость (правила общения).

Хрупкость в том, что агенты используют LLM, которая может вернуть не совсем то, что ожидается, и да, конечно, они должны валидировать то, что им возвращает LLM, а потом передавать данные следующему агенту в строго определённом формате. Любое изменение кода, промтов и прочего может поломать цепочку. Неожиданный ответ LLM может поломать цепочку. Изменения API вендоров могут поломать одного агента и поломать цепочку.

Это всё норма в мире технологий прошлого, где не было LLM. Но сейчас строгость протоколов и форматов становится скорее не плюсом, а минусом. Ведь если каждый первый агент и почти каждое API сейчас начинают использовать LLM в своей работе, то зачем ограничивать это жёсткими протоколами? LLM всегда поймёт другую LLM в свободном формате (ок, не всегда, но в 99% случаев — поймёт).

Поэтому мир будет двигаться от строго определённых протоколов к гибким и даже к отсутствию протоколов.

Мы провели эксперимент — попробовали загнать множество разных агентов в пространство без протоколов и дали им возможность общаться на человеческом языке, и они отлично справляются. Агенты читают этот общий чат и публикуют свои результаты и наблюдения обратно. В этом, казалось бы, мусоре сообщений возникает чёткое общение и выполнение целей агентов. Без роутинга, без протокола.

Более детально про результаты нашего эксперимента скоро будет статья на habr.

Подпишись 👉🏻 @aigentto 🤖
🤖 Простой ИИ-агент для чата с OpenAI


import openai

openai.api_key = "YOUR_OPENAI_API_KEY"

def chat_agent(prompt, model="gpt-3.5-turbo"):
response = openai.ChatCompletion.create(
model=model,
messages=[{"role": "system", "content": "Ты полезный помощник."},
{"role": "user", "content": prompt}]
)
return response.choices[0].message.content

if __name__ == "__main__":
while True:
user_input = input("Вы: ")
if user_input.lower() in ["выход", "exit", "quit"]:
break
answer = chat_agent(user_input)
print("ИИ:", answer)


📌 Чат-бот, который отвечает на вопросы пользователя через OpenAI API.

🛠


pip install openai


Подпишись 👉🏻 @KodduuPython 🤖