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
📥 Парсер CSV с валидацией и выгрузкой ошибок


import csv

INPUT_FILE = 'data.csv'
ERROR_FILE = 'errors.csv'
VALID_ROWS = []

def validate_row(row):
return row['email'].count('@') == 1 and row['age'].isdigit() and int(row['age']) > 0

with open(INPUT_FILE, newline='', encoding='utf-8') as infile, \
open(ERROR_FILE, 'w', newline='', encoding='utf-8') as errfile:
reader = csv.DictReader(infile)
writer = csv.DictWriter(errfile, fieldnames=reader.fieldnames)
writer.writeheader()

for row in reader:
if validate_row(row):
VALID_ROWS.append(row)
else:
writer.writerow(row)

print(f" Обработано: {len(VALID_ROWS)} корректных строк")
print(f"⚠️ Ошибок записано в {ERROR_FILE}")


📌 Что делает:
Читает CSV, проверяет валидность (email и возраст), собирает корректные строки и записывает ошибки в отдельный CSV. Используется для предобработки данных в ETL и загрузке в базу.

🛠
Встроенный модуль csv, ничего дополнительно не нужно.

Подпишись 👉🏻 @KodduuPython 🤖
📥 Простая очередь задач с повтором и задержкой


import time
from collections import deque

class TaskQueue:
def __init__(self):
self.queue = deque()

def add_task(self, func, *args, retries=3, delay=2, **kwargs):
self.queue.append((func, args, kwargs, retries, delay))

def run(self):
while self.queue:
func, args, kwargs, retries, delay = self.queue.popleft()
try:
func(*args, **kwargs)
print(" Задача выполнена")
except Exception as e:
if retries > 0:
print(f"⚠️ Ошибка: {e}, повтор через {delay}s")
time.sleep(delay)
self.queue.append((func, args, kwargs, retries-1, delay))
else:
print(f" Задача не выполнена: {e}")

# Пример
def test_task(x):
if x < 3:
raise ValueError("Слишком маленькое число")
print(f"Обработка {x}")

if __name__ == "__main__":
q = TaskQueue()
q.add_task(test_task, 1)
q.add_task(test_task, 5)
q.run()


📌 Что делает:
Запускает задачи из очереди, повторяя с задержкой при ошибках. Полезно для сетевых запросов, обработки данных, retry-механизмов.

🛠
Без зависимостей, готов к использованию в любых проектах.

Подпишись 👉🏻 @KodduuPython 🤖
2👍1
🔍 Быстрый поиск в JSON-файле по ключу и значению


import json

def search_json(file_path, key, value):
with open(file_path, encoding='utf-8') as f:
data = json.load(f)
results = [item for item in data if item.get(key) == value]
return results

if __name__ == '__main__':
matches = search_json('data.json', 'status', 'active')
print(f"Найдено {len(matches)} элементов с status='active'")


📌 Что делает:
Ищет в JSON-массиве объекты с заданным ключом и значением. Удобно для быстрого фильтра в данных из API, экспорта и логов.

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

Подпишись 👉🏻 @KodduuPython 🤖
🔥2👍1
🕵️‍♂️ Проверка валидности email из списка


import re

EMAIL_REGEX = re.compile(r'^[\w\.-]+@[\w\.-]+\.\w+$')

def validate_emails(emails):
valid = [e for e in emails if EMAIL_REGEX.match(e)]
invalid = [e for e in emails if not EMAIL_REGEX.match(e)]
return valid, invalid

if __name__ == "__main__":
sample = ["test@example.com", "bad-email@", "user@domain.org"]
valid, invalid = validate_emails(sample)
print(f" Valid: {valid}")
print(f" Invalid: {invalid}")


📌 Что делает:
Простая проверка списка email на базовый формат. Помогает фильтровать ввод или загружать корректные контакты.

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

Подпишись 👉🏻 @KodduuPython 🤖
👍1🔥1
Кеш с TTL (время жизни) на Python


import time

class TTLCache:
def __init__(self, ttl_seconds):
self.ttl = ttl_seconds
self.store = {}

def set(self, key, value):
self.store[key] = (value, time.time() + self.ttl)

def get(self, key):
val, exp = self.store.get(key, (None, 0))
if time.time() < exp:
return val
self.store.pop(key, None)
return None

if __name__ == '__main__':
cache = TTLCache(5)
cache.set('foo', 'bar')
print(cache.get('foo')) # bar
time.sleep(6)
print(cache.get('foo')) # None


📌 Что делает:
Простой кеш с автоматическим удалением устаревших данных по времени. Используется для оптимизации повторных запросов к БД, API и т.п.

🛠
Стандартная библиотека, готов к использованию сразу.

Подпишись 👉🏻 @KodduuPython 🤖
🔥1
Forwarded from AIGENTTO
Рой ИИ-агентов

В системах с большим количеством пользователей имеет смысл применять эволюционный подход к автоулучшению ИИ-агентов и RAG-систем.
Самый простой вариант — создание роя ИИ-агентов/RAG-систем, выполняющих одну и ту же задачу. Агенты имеют слегка модифицированные параметры (промт, top-k, temperature и т.д.).

Затем мы случайным роутингом выбираем очередного агента для ответа. Вес тех агентов, которые получают лучший scoring, растёт, а тех, кто выдаёт плохие ответы — падает. Тем самым плохие вымирают, лучшие выживают. По сути, это A/B/C тестирование с автовыбором лучших.

Ещё раз подчеркну, это может работать только на больших выборках — когда запросов 100–1000. Если запросов десятки, то эволюция будет идти слишком медленно.

Подпишись 👉🏻 @aigentto 🤖
🔑 Генерация и проверка безопасных токенов


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