В Python для этого не нужен цикл 👇
text = "Python! "
print(text * 3)
👉 Результат:
Python! Python! Python!
💡 То же самое работает со списками:
nums = [1, 2]
print(nums * 3)
Получим:
[1, 2, 1, 2, 1, 2]
🔥 Это удобно, когда нужно быстро создать повторяющуюся строку или последовательность.
⚠️ Но со списками есть нюанс: элементы не копируются глубоко - для вложенных изменяемых объектов это может привести к неожиданному поведению.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Можно заставить Python буквально говорить 🔊
Для этого есть библиотека
pyttsx3:
import pyttsx3
engine = pyttsx3.init()
engine.say("Привет! Я говорю с помощью Python")
engine.runAndWait()
📦 Установка:
pip install pyttsx3
💡 Можно сделать функцию:
def speak(text):
engine.say(text)
engine.runAndWait()
speak("Сегодня изучаем Python!")
🔥 На этой основе можно сделать:
— голосового помощника
— программу для чтения текста
— озвучку уведомлений
— простого desktop-бота
И всё это — без сложных моделей и API 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Нужно быстро достать текст из PDF? Можно автоматизировать это 👇
import fitz
doc = fitz.open("document.pdf")
for page in doc:
print(page.get_text())
📦 Установка:
pip install pymupdf
💡 А если нужно сохранить весь текст в файл:
with open("result.txt", "w", encoding="utf-8") as file:
for page in doc:
file.write(page.get_text())
🔥 Получается простой конвертер PDF → TXT.
На этом можно построить:
— поиск по документам
— обработку большого количества PDF
— извлечение данных из отчётов
— подготовку текста для AI
⚠️ Если PDF состоит из сканов, обычное извлечение текста может не сработать - тогда понадобится OCR.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Например, в папке лежат сотни файлов, и нужно понять, какие из них полностью одинаковые.
Можно сравнивать их по хэшу 👇
from pathlib import Path
import hashlib
def get_hash(path):
return hashlib.md5(path.read_bytes()).hexdigest()
files = {}
for file in Path("files").iterdir():
if file.is_file():
file_hash = get_hash(file)
files.setdefault(file_hash, []).append(file)
for group in files.values():
if len(group) > 1:
print("Дубликаты:")
for file in group:
print(" ", file)
💡 Идея простая:
📄 файл → 🔢 хэш → 🔍 сравниваем хэши
Если хэши совпали, файлы с высокой вероятностью одинаковые.
🔥 Такой скрипт можно использовать для:
— очистки папок
— поиска повторяющихся фото
— анализа больших архивов
— автоматизации работы с файлами
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Небольшой скрипт, который создаёт случайный пароль заданной длины 🔐
import secrets
import string
chars = string.ascii_letters + string.digits + "!@#$%^&*"
password = "".join(
secrets.choice(chars)
for _ in range(16)
)
print(password)
💡 Почему
secrets, а не обычный random?secrets предназначен именно для случаев, где важна непредсказуемость случайных значений.📌 Можно менять длину:
length = 24
password = "".join(
secrets.choice(chars)
for _ in range(length)
)
🔥 На основе этого можно сделать:
— генератор паролей
— CLI-утилиту
— генератор токенов
— автоматическое создание временных ключей
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Можно отправлять письма прямо из Python — например, уведомления об ошибках или отчёты 📩
import smtplib
from email.message import EmailMessage
msg = EmailMessage()
msg["Subject"] = "Отчёт"
msg["From"] = "you@example.com"
msg["To"] = "user@example.com"
msg.set_content("Отчёт готов!")
with smtplib.SMTP_SSL("smtp.example.com", 465) as smtp:
smtp.login("you@example.com", "PASSWORD")
smtp.send_message(msg)
💡 Что здесь происходит:
📨
EmailMessage — создаёт письмо🔐
login() — авторизация на SMTP-сервере🚀
send_message() — отправляет письмо🔥 На этом можно сделать:
— автоматические отчёты
— уведомления о сбоях
— отправку файлов
— ежедневные рассылки
⚠️ Пароль лучше не хранить прямо в коде — используй переменные окружения или секреты.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Если есть несколько задач, которые ждут сеть или другие внешние операции, можно выполнять их конкурентно с
asyncio ⚡
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
print(f"{name} готова")
async def main():
await asyncio.gather(
task("Задача 1", 2),
task("Задача 2", 1),
task("Задача 3", 3),
)
asyncio.run(main())
💡 Здесь три задачи запускаются конкурентно.
⏱️ Вместо ожидания примерно
2 + 1 + 3 = 6 секунд программа закончит примерно за 3 секунды - по времени самой долгой задачи.🔥 Особенно полезно для:
— запросов к API
— загрузки данных
— сетевых приложений
— Telegram-ботов
⚠️
asyncio не делает обычные CPU-вычисления быстрее — он особенно хорош для задач, где много ожидания.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Допустим, есть список слов:
words = ["Python", "это", "просто", "🔥"]
Можно быстро объединить их через
join():
text = " ".join(words)
print(text)
👉 Получим:
Python это просто 🔥
А если нужен другой разделитель:
csv = ", ".join(words)
print(csv)
👉
Python, это, просто, 🔥
💡 Очень удобно, когда нужно собрать строку из множества элементов.
🔥 Например, вывести список тегов:
tags = ["python", "backend", "coding"]
print("#" + " #".join(tags))
Результат:
#python #backend #coding
📌 Запомни простое правило:
split() - строку → списокjoin() - список → строкуPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1🥰1
📐 Typing: TypedDict, Literal, Annotated в реальных проектах
Аннотации типов в Python — это не только
📦 TypedDict — словари со строгой схемой
➡️ Теперь IDE и mypy знают структуру словаря. Ошибку в ключе или типе отловишь сразу.
🎯 Literal — фиксированные значения
➡️ Полезно, когда параметр должен принимать строго ограниченные значения.
🧩 Annotated — тип + метаданные
➡️ Аннотации становятся документацией и могут использоваться библиотеками (например, валидацией в FastAPI).
⚡️ TypedDict с опциональными ключами
➡️
🔄 Literal в связке с Enum
➡️ Даёт компактную альтернативу Enum, если не нужно хранить методы.
📑 Annotated для валидации данных
В FastAPI:
➡️ Ограничения накладываются прямо через типы, без лишнего кода.
🧠 Совмещение инструментов
➡️ Получается словарь со строгой схемой и фиксированным набором значений.
🗣️ Запомни: TypedDict даёт строгие словари, Literal ограничивает набор значений, Annotated связывает тип с метаданными. Вместе они делают код самодокументируемым и надёжным.
Аннотации типов в Python — это не только
int и str. Для сложных сценариев есть мощные инструменты: TypedDict, Literal, Annotated. Они помогают писать код понятнее и ловить ошибки ещё на этапе разработки.from typing import TypedDict
class User(TypedDict):
id: int
name: str
is_admin: bool
u: User = {"id": 1, "name": "Иван", "is_admin": False}
from typing import Literal
def set_status(status: Literal["NEW", "IN_PROGRESS", "DONE"]) -> None:
print(f"Статус: {status}")
set_status("NEW") # ✅
set_status("INVALID") # ❌ mypy отловит
from typing import Annotated
from dataclasses import dataclass
@dataclass
class User:
id: Annotated[int, "DB Primary Key"]
email: Annotated[str, "must be valid email"]
⚡️ TypedDict с опциональными ключами
class Config(TypedDict, total=False):
debug: bool
log_level: str
cfg: Config = {"debug": True} # ok
total=False позволяет делать часть ключей необязательными.from typing import Literal
Role = Literal["user", "admin", "moderator"]
def check_role(role: Role): ...
📑 Annotated для валидации данных
В FastAPI:
from typing import Annotated
from fastapi import Query
def read_items(size: Annotated[int, Query(ge=1, le=100)]):
return {"size": size}
class Product(TypedDict):
id: int
status: Literal["active", "archived"]
def process(p: Product): ...
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Каждый программист знает: кодить можно быстрее, если использовать проверенные решения. В Python куча библиотек, которые делают работу за тебя — не нужно изобретать велосипед.
1. `pathlib` — путь к лёгкости работы с путями
Ты всё ещё юзаешь
os.path? Пора остановиться. pathlib — это объектно-ориентированная альтернатива, которая позволяет работать с путями проще и чище.Пример:
from pathlib import Path
p = Path("/home/user/docs")
print(p / "file.txt") # /home/user/docs/file.txt
os.path.2. `requests` — HTTP без головной боли
HTTP-запросы — одна из самых часто используемых операций, но с ними можно запутаться.
requests делает этот процесс понятным и удобным.Пример:
import requests
response = requests.get('https://api.example.com/data')
print(response.json())
3. `pydantic` — валидация данных с минимальными усилиями
Если тебе нужно проверять данные, а писать вручную кучу кода — не хочется, используй
pydantic. Эта библиотека позволяет быстро проверять и валидировать данные, обрабатывая JSON, параметры и модели.Пример:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
user = User(name="Alice", age=30)
print(user)
4. `attrs` — создание классов без ненужного кода
Если ты создаёшь классы, но не хочешь писать лишние методы вроде
__init__, __repr__, __eq__, то тебе в помощь attrs. Эта библиотека позволяет легко создавать классы с автоматическим заполнением всех необходимых методов.Пример:
import attr
@attr.s
class Point:
x = attr.ib()
y = attr.ib()
p = Point(3, 4)
print(p) # Point(x=3, y=4)
5. `click` — консольные приложения без мук
Создание CLI-интерфейсов может быть утомительным, но с
click это делается быстро и без боли. Ты можешь создавать простые и мощные консольные команды с минимальными усилиями.Пример:
import click
@click.command()
@click.argument('name')
def greet(name):
click.echo(f"Hello, {name}!")
greet()
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Мидл сначала понимает задачу, уточняет детали, разбивает её на части — и только потом пишет код.
# ❌ Джун:
# Просто пишет как-нибудь
# ✅ Мидл:
# Планирует — какие модули затронет, где могут быть ошибки, какие кейсы проверить
Мидлы знают, что код без тестов на крайние случаи — потенциальная мина.
def divide(a, b):
return a / b
# ✅ А если b = 0?
Пиши функции с понятными именами, дели на модули, убирай мусор.
Мидл пишет поддерживаемый код — это важно.
# ❌
def f(x): return x*2
# ✅
def double_price(price: float) -> float:
return price * 2
Мидлы не изобретают велосипеды. Используй стандартные конструкции, идиоматичный Python,
pathlib, enumerate, with, dataclass, typing.Не “у меня не работает 😢”, а “я делаю X, жду Y, получаю Z. Вот код. Пробовал уже A и B.”
Это — уровень. И его видно сразу.
На стажировках, джуниор-работе, open source — помогает получить фидбек, повысить доверие и быстрее вырасти.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
yield: как делать ленивые вычисления и экономить памятьОбычные функции в Python возвращают всё сразу. Генераторы — по частям. Это «ленивые» вычисления: результат отдаётся только тогда, когда он нужен. Экономия памяти и скорость работы на больших данных становятся колоссальными.
yield
def numbers():
yield 1
yield 2
yield 3
for n in numbers():
print(n)
def read_file(path):
with open(path, "r") as f:
for line in f:
yield line.strip()
for line in read_file("big.log"):
print(line)
def counter(start=0):
while True:
yield start
start += 1
for n in counter():
if n > 5:
break
print(n)
def numbers():
for i in range(10):
yield i
def squared(seq):
for x in seq:
yield x * x
for x in squared(numbers()):
print(x)
squares = (x*x for x in range(1_000_000))
print(next(squares)) # 1
print(next(squares)) # 4
🟢 обработка логов и CSV гигабайтного размера;🟢 потоковые данные (сокеты, API);🟢 построение бесконечных последовательностей;🟢 конвейеры обработки (map/filter без лишних списков).
yield отдаёт результат по частям, не занимая память. Генераторы можно объединять в цепочки — как трубы. Если данных много или они бесконечны — только генераторы спасут.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1