PytStart | Программирование на Python
Відкрити в Telegram
Python: примеры кода, уроки, статьи Купить рекламу: https://telega.in/c/pytstart ✍️По всем вопросам: @Pascal4eg
Показати більше4 180
Підписники
-424 години
-137 днів
-5930 днів
Завантажуємо дані
Схожі канали
Немає даних
Виникли проблеми? Будь ласка, оновіть сторінку або зверніться до нашого support-менеджера.
Хмара тегів
Вхідні та вихідні згадування
---
---
---
---
---
---
Залучення підписників
жовтень '26жовт '26
жовтень '26
+7
в 0 каналах
вересень '26
+20
в 0 каналах
Get PRO
серпень '26
+36
в 9 каналах
Get PRO
липень '26
+5
в 0 каналах
Get PRO
червень '26
+68
в 0 каналах
Get PRO
травень '26
+110
в 10 каналах
Get PRO
квітень '26
+24
в 0 каналах
Get PRO
березень '26
+58
в 8 каналах
Get PRO
лютий '26
+30
в 3 каналах
Get PRO
січень '26
+20
в 0 каналах
Get PRO
грудень '25
+79
в 25 каналах
Get PRO
листопад '25
+102
в 11 каналах
Get PRO
жовтень '25
+17
в 0 каналах
Get PRO
вересень '25
+24
в 6 каналах
Get PRO
серпень '25
+351
в 30 каналах
Get PRO
липень '25
+286
в 21 каналах
Get PRO
червень '25
+304
в 31 каналах
Get PRO
травень '25
+383
в 32 каналах
Get PRO
квітень '25
+496
в 34 каналах
Get PRO
березень '25
+845
в 49 каналах
Get PRO
лютий '25
+3 212
в 123 каналах
| Дата | Залучення підписників | Згадування | Канали | |
| 28 жовтня | 0 | |||
| 27 жовтня | 0 | |||
| 26 жовтня | 0 | |||
| 25 жовтня | 0 | |||
| 24 жовтня | 0 | |||
| 23 жовтня | 0 | |||
| 22 жовтня | 0 | |||
| 21 жовтня | 0 | |||
| 20 жовтня | 0 | |||
| 19 жовтня | 0 | |||
| 18 жовтня | 0 | |||
| 17 жовтня | 0 | |||
| 16 жовтня | +1 | |||
| 15 жовтня | 0 | |||
| 14 жовтня | 0 | |||
| 13 жовтня | 0 | |||
| 12 жовтня | +1 | |||
| 11 жовтня | +1 | |||
| 10 жовтня | 0 | |||
| 09 жовтня | +1 | |||
| 08 жовтня | 0 | |||
| 07 жовтня | 0 | |||
| 06 жовтня | 0 | |||
| 05 жовтня | 0 | |||
| 04 жовтня | +1 | |||
| 03 жовтня | +2 | |||
| 02 жовтня | 0 | |||
| 01 жовтня | 0 |
Дописи каналу
🐍 Как сделать свой API на Python за пару минут
Хочешь создать API, к которому смогут обращаться другие программы? Для этого есть FastAPI 🚀
📦 Установка:
pip install fastapi uvicorn
💻 Создаём `main.py`:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def home():
return {"message": "Привет, мир!"}
@app.get("/user/{name}")
def get_user(name: str):
return {
"name": name,
"message": f"Привет, {name}!"
}
🚀 Запускаем сервер:
uvicorn main:app --reload
Теперь открой в браузере:
- http://127.0.0.1:8000/ — приветственное сообщение
- http://127.0.0.1:8000/user/Alex — персональный ответ
- http://127.0.0.1:8000/docs — интерактивная документация API
💡 Почему FastAPI крутой?
🔥 Автоматически создаёт документацию
⚡ Поддерживает асинхронность
📦 Проверяет типы входных данных
🛠️ Подходит для микросервисов и backend-разработки
Всего несколько строк — и у тебя уже есть работающий API!| 2 | 🧠 Прокачай мозг с NonoQuest! 🧩
Хочешь не просто убивать время, а тренировать мышление? Попробуй NonoQuest — увлекательные японские кроссворды (нонограммы), где логика превращается в яркие пиксельные картинки! 🎨
✨ Тренируй логику и внимание
🔍 Развивай концентрацию
💡 Поддерживай умственную активность
Регулярные интеллектуальные занятия полезны для когнитивного здоровья.
🎮 NonoQuest — устрой мозгу полезную разминку!
📱 Игра для Android. Попробуй разгадать свою первую головоломку! | 277 |
| 3 | 🐍 Как создать QR-код из Wi-Fi, чтобы подключаться без пароля
Можно сделать QR-код, который при сканировании предложит подключиться к Wi-Fi.
Для этого понадобится библиотека qrcode.
📦 Установка:
pip install "qrcode[pil]"
💻 Код:
import qrcode
ssid = "MyWiFi"
password = "mypassword123"
wifi = f"WIFI:T:WPA;S:{ssid};P:{password};;"
img = qrcode.make(wifi)
img.save("wifi_qr.png")
print("QR-код создан!")
📌 Что означают параметры?
- T — тип защиты сети
- S — название Wi-Fi
- P — пароль
После запуска появится файл wifi_qr.png. Его можно распечатать или отправить гостям, чтобы они подключились к сети без ручного ввода пароля.
🔥 Где пригодится:
— дома для гостей
— в кафе и офисах
— в отелях
— в небольших автоматизациях | 425 |
| 4 | 🎲 Mutable vs Immutable: список в аргументах функции — неожиданный баг
В Python есть два типа объектов: immutable (строки, числа, кортежи) и mutable (списки, словари, множества).
Разница кажется очевидной, пока не сталкиваешься с функциями и дефолтными аргументами.
⚡️ Классический баг: изменяемый аргумент по умолчанию
def add_item(item, bucket=[]):
bucket.append(item)
return bucket
print(add_item("🍎")) # ['🍎']
print(add_item("🍌")) # ['🍎', '🍌'] ❌
➡️ Список создаётся один раз при определении функции. Все вызовы делят его между собой.
🔍 Почему так происходит?
Python вычисляет значения аргументов по умолчанию при определении функции, а не при каждом вызове.
То есть bucket=[] создаётся один раз и живёт всё время жизни функции.
✅ Как правильно: использовать None
def add_item(item, bucket=None):
if bucket is None:
bucket = []
bucket.append(item)
return bucket
print(add_item("🍎")) # ['🍎']
print(add_item("🍌")) # ['🍌']
➡️ Теперь список создаётся каждый раз заново, если аргумент не передан.
🧪 Практика: словари ведут себя так же
def register_user(name, db={}):
db[name] = True
return db
print(register_user("Alice")) # {'Alice': True}
print(register_user("Bob")) # {'Alice': True, 'Bob': True} ❌
✔️ Исправляем через None:
def register_user(name, db=None):
if db is None:
db = {}
db[name] = True
return db
📦 Когда это реально нужно?
Иногда специально используют «общий объект по умолчанию»:
def cache_query(query, cache={}):
if query in cache:
return cache[query]
result = f"Выполнил {query}"
cache[query] = result
return result
➡️ Все вызовы делят одно хранилище. Это работает как встроенный кеш.
🧠 Immutable так не ломаются
def add_one(x=0):
return x + 1
print(add_one()) # 1
print(add_one()) # 1
➡️ С числами, строками, кортежами проблем нет — они неизменяемые.
🗣 Запомни: Не используй изменяемые объекты в дефолтных аргументах. Безопасный паттерн: arg=None, потом if arg is None: arg = []. Исключение — если тебе нужен общий объект (например, кеш). | 564 |
| 5 | Заказ на 100 рублей. Три комментария. В отчете 300. Где ошибка?
Бесплатное SQL-упражнение "Сбой найден": намеренно сломанный отчет, 10 автоматических проверок, подсказки и эталонное решение.
Задача --- исправить расчет, сохранив правильный результат для пустых заказов и разных позиций с одинаковой стоимостью.
Для запуска нужен Python 3.11+ со стандартным sqlite3. Отдельный сервер и установка зависимостей не требуются. Данные учебные.
В архиве также 10 карточек backend-сбоев с диагностикой и проверкой исправлений. Это бесплатная часть коммерческого практикума; обязательной покупки и отзыва нет.
Архив без регистрации:
https://tglink.io/1b80e56c9d2a50?erid=2W5zFG56jWZ
Реклама. Романов С.Г. ИНН 772589517063. | 266 |
| 6 | 🧙♂️Секреты f-строк: выражения, форматирование и даже вызов функций внутри f-строки
Ты думал, f-строки — это просто f"Hello {name}"?
А что если я скажу, что туда можно засовывать функции, арифметику и даже условия?
Вот мощный разбор, как выжать максимум из f-строк в Python 👇
🟢 1. Арифметика прямо в строке
a, b = 10, 3
print(f"Сумма: {a + b}, Разность: {a - b}")
🟢 Внутри фигурных скобок можно писать полноценные выражения.
➡️ Да хоть f"Результат: {(a * b) ** 2}" — это законно.
🟢2. Функции внутри f-строки
def shout(name):
return name.upper() + "!"
print(f"Привет, {shout('Алиса')}")
🟢 Вызов функций? Да. Лямбды? Тоже можно. Даже f"{sorted([3,1,2])}" работает.
🟢3. Условия и тернарные выражения
age = 20
print(f"{'Совершеннолетний' if age >= 18 else 'Несовершеннолетний'} пользователь")
🟢 Отлично работает с любыми if ... else внутри {}.
🟢4. Форматирование чисел по-человечески
value = 12345.6789
print(f"{value:.2f}") # 12345.68
print(f"{value:,.2f}") # 12,345.68
➡️ :.2f — два знака после запятой
➡️ :, — добавляет разделитель тысяч
🟢5. Форматирование по ширине и выравниванию
name = "Alice"
print(f"{name:>10}") # справа
print(f"{name:<10}") # слева
print(f"{name:^10}") # по центру
🟢 Работает с числами и строками. Полезно в логах и таблицах.
🟢 6. Форматирование как hex, bin, oct
num = 42
print(f"{num:b}") # 101010
print(f"{num:x}") # 2a
👍 b — двоичная
👍 x — шестнадцатеричная
👍 o — восьмеричная
🟢 7. Вложенные f-строки и шаблоны
user = {"name": "Eva", "points": 120}
print(f"{user['name']} набрала {f'{user['points'] * 2}'} очков")
🟢 Иногда полезно, но лучше избегать слишком сложной вложенности.
💡 Запомни
✅f-строки — это не просто вставка переменных
✅Используй форматирование, условия, вызовы функций
✅Удобно для логов, отчётов, динамического UI, и шаблонов CLI | 610 |
| 7 | 🖥 Срезы (slices) в Python позволяют удобно извлекать части последовательностей (списки, строки, кортежи) с помощью синтаксиса:
sequence[start:stop:step]
🔹start – начальный индекс (по умолчанию 0).
🔹stop – конечный индекс (не включается!).
🔹step – шаг (по умолчанию 1).
📌 Примеры:
lst = [0, 1, 2, 3, 4, 5]
print(lst[1:4]) # [1, 2, 3] (элементы с индекса 1 по 3)
print(lst[:3]) # [0, 1, 2] (с начала до индекса 2)
print(lst[::2]) # [0, 2, 4] (каждый второй элемент)
print(lst[::-1]) # [5, 4, 3, 2, 1, 0] (разворот списка)
⚡ Итог: срезы позволяют легко работать с последовательностями без циклов и лишнего кода! | 757 |
| 8 | 🖥 Как превратить CSV в словарь Python
CSV часто используется для хранения таблиц. А загрузить его в Python можно буквально за несколько строк 👇
import csv
with open("users.csv", encoding="utf-8") as file:
users = list(csv.DictReader(file))
print(users[0]) # Alex
users.csv выглядит так:
name,age,city
Alex,25,Moscow
Anna,22,Kazan
💡 А дальше с данными можно работать как с обычными словарями:
for user in users:
if int(user["age"]) >= 25:
print(user["name"])
🔥 Полезно для:
— обработки таблиц
— импорта данных
— небольших скриптов
— автоматизации отчётов | 798 |
| 9 | Ищете облачную платформу? Есть Beget
✅ Аптайм 99,98% в дата-центрах Tier III
✅ Техподдержка 24/7 — живые люди, без ботов
✅ Прозрачная оплата без скрытых платежей
✅ Более 200 000 клиентов доверяют Beget
Узнать больше | 275 |
| 10 | 🔄 Генераторы и 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
➡️ Почти как list comprehension, но без хранения всех элементов в памяти.
🟢 Где это реально нужно:
🟢обработка логов и CSV гигабайтного размера;
🟢потоковые данные (сокеты, API);
🟢построение бесконечных последовательностей;
🟢конвейеры обработки (map/filter без лишних списков).
🗣️ Запомни:yield отдаёт результат по частям, не занимая память. Генераторы можно объединять в цепочки — как трубы. Если данных много или они бесконечны — только генераторы спасут. | 743 |
| 11 | Python с нуля: автоматизируйте то, на что сейчас уходят часы
Курс для тех, кто никогда не программировал, но уже работает с Excel и данными.
За короткий курс вы освоите базу Python с нуля и сразу начнёте применять её в рабочих задачах:
— объединять Excel-файлы
— обрабатывать большие таблицы
— строить сводные и графики
— работать с датами и текстом
— автоматизировать повторяющиеся действия
Без лишней теории — только база языка и практические задачи, которые помогают экономить время уже в процессе обучения. За несколько недель выучить язык с нуля
👉@tea4erman_bot | 286 |
| 12 | 🎯 Как выглядеть как мидл, даже если ты джун
💡 Мидл — это не про годы опыта, а про то, как ты работаешь с задачами. Даже будучи джуном, ты можешь выглядеть как уверенный разработчик. Вот как.
👍 1. Не пиши код сразу — начни с понимания
Мидл сначала понимает задачу, уточняет детали, разбивает её на части — и только потом пишет код.
# ❌ Джун:
# Просто пишет как-нибудь
# ✅ Мидл:
# Планирует — какие модули затронет, где могут быть ошибки, какие кейсы проверить
👍 2. Всегда думай про edge cases
Мидлы знают, что код без тестов на крайние случаи — потенциальная мина.
def divide(a, b):
return a / b
# ✅ А если b = 0?
👍 3. Дай коду имя и порядок
Пиши функции с понятными именами, дели на модули, убирай мусор.
Мидл пишет поддерживаемый код — это важно.
# ❌
def f(x): return x*2
# ✅
def double_price(price: float) -> float:
return price * 2
👍 4. Будь предсказуемым
Мидлы не изобретают велосипеды. Используй стандартные конструкции, идиоматичный Python, pathlib, enumerate, with, dataclass, typing.
👍 5. Спрашивай правильно
Не “у меня не работает 😢”, а “я делаю X, жду Y, получаю Z. Вот код. Пробовал уже A и B.”
Это — уровень. И его видно сразу.
🗣 Пиши как мидл, спрашивай как мидл, думай как мидл — и к тебе начнут относиться как к мидлу.
📍 Где применимо:
На стажировках, джуниор-работе, open source — помогает получить фидбек, повысить доверие и быстрее вырасти. | 596 |
| 13 | Написать скрипт - двадцать минут удовольствия. Обложить его тестами и докстрингами, чтобы не стыдно было в репозиторий закинуть - задача на весь остаток рабочего дня.
CatCode - агент, который сделает всю рутину за тебя: гоняет линтер, рефакторит, пишет тесты и докстринги пока ты занят логикой, а не бумажной работой вокруг неё. Доступны все топовые модели:
😒 Claude Opus 5
🤖 GPT-6 Astra
😐 Grok 4.6
и многие другие.
Умный свитчер экономит токены - рутина уйдёт дешёвой модели, сложные задачи - нейросети покруче. Один лимит, который дешевле зоопарка отдельных подписок - всего за 900 рублей в месяц.
Оплата картой РФ или СБП, работает без VPN. Первые задачи бесплатно, просто зарегистрируйся и попробуй сам.
Оставь рутину агенту, пока листаешь ленту: catcode.dev | 380 |
| 14 | 👩💻 Библиотеки для ленивых: когда хочется больше делать с меньшими усилиями
Каждый программист знает: кодить можно быстрее, если использовать проверенные решения. В 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()
👉 Лёгкая настройка, удобная обработка аргументов и флагов.
🗣️ Запомни: используй библиотеки, чтобы минимизировать шаблонный код, повысить читаемость и улучшить производительность разработки. | 421 |
| 15 | Ищете облачную платформу? Есть Beget
✅ Аптайм 99,98% в дата-центрах Tier III
✅ Техподдержка 24/7 — живые люди, без ботов
✅ Прозрачная оплата без скрытых платежей
✅ Более 200 000 клиентов доверяют Beget
Узнать больше
#реклама 16+
beget.com
О рекламодателе | 308 |
| 16 | 📐 Typing: TypedDict, Literal, Annotated в реальных проектах
Аннотации типов в Python — это не только int и str. Для сложных сценариев есть мощные инструменты: TypedDict, Literal, Annotated. Они помогают писать код понятнее и ловить ошибки ещё на этапе разработки.
📦 TypedDict — словари со строгой схемой
from typing import TypedDict
class User(TypedDict):
id: int
name: str
is_admin: bool
u: User = {"id": 1, "name": "Иван", "is_admin": False}
➡️ Теперь IDE и mypy знают структуру словаря. Ошибку в ключе или типе отловишь сразу.
🎯 Literal — фиксированные значения
from typing import Literal
def set_status(status: Literal["NEW", "IN_PROGRESS", "DONE"]) -> None:
print(f"Статус: {status}")
set_status("NEW") # ✅
set_status("INVALID") # ❌ mypy отловит
➡️ Полезно, когда параметр должен принимать строго ограниченные значения.
🧩 Annotated — тип + метаданные
from typing import Annotated
from dataclasses import dataclass
@dataclass
class User:
id: Annotated[int, "DB Primary Key"]
email: Annotated[str, "must be valid email"]
➡️ Аннотации становятся документацией и могут использоваться библиотеками (например, валидацией в FastAPI).
⚡️ TypedDict с опциональными ключами
class Config(TypedDict, total=False):
debug: bool
log_level: str
cfg: Config = {"debug": True} # ok
➡️ total=False позволяет делать часть ключей необязательными.
🔄 Literal в связке с Enum
from typing import Literal
Role = Literal["user", "admin", "moderator"]
def check_role(role: Role): ...
➡️ Даёт компактную альтернативу Enum, если не нужно хранить методы.
📑 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): ...
➡️ Получается словарь со строгой схемой и фиксированным набором значений.
🗣️ Запомни: TypedDict даёт строгие словари, Literal ограничивает набор значений, Annotated связывает тип с метаданными. Вместе они делают код самодокументируемым и надёжным. | 580 |
| 17 | 🖥 Как превратить список в строку одной командой
Допустим, есть список слов:
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() - список → строку | 683 |
| 18 | 🖥 Как запустить несколько задач одновременно в Python
Если есть несколько задач, которые ждут сеть или другие внешние операции, можно выполнять их конкурентно с 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-вычисления быстрее — он особенно хорош для задач, где много ожидания. | 846 |
| 19 | 🔍Тестовое собеседование на Middle Python с разработчиком из Авито завтра вечером
Уже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
📂 Даня, старший разработчик в Авито, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Даня будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дане
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе. | 284 |
| 20 | 🖥 Как автоматически отправить email с Python
Можно отправлять письма прямо из 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() — отправляет письмо
🔥 На этом можно сделать:
— автоматические отчёты
— уведомления о сбоях
— отправку файлов
— ежедневные рассылки
⚠️ Пароль лучше не хранить прямо в коде — используй переменные окружения или секреты. | 819 |
