Python для начинающих
1.11K subscribers
362 photos
3 videos
232 files
67 links
Python для начинающих
Download Telegram
- Разработка чат-ботов с использованием Telegram API и библиотеки python-telegram-bot.
Привет! С вами Иван, и сегодня мы отправимся в захватывающее путешествие в мир чат-ботов для Telegram. Если вы хоть раз получали от бота погоду, смешную гифку или уведомление из любимого приложения — поздравляю, вы уже на правильном пути! А теперь давайте посмотрим, как создать своего собственного Telegram-бота на Python с помощью великолепной библиотеки python-telegram-bot.

## Почему именно python-telegram-bot?

Библиотека python-telegram-bot — это удобная "обертка" над Telegram Bot API: она избавляет вас от рутины работы с HTTP-запросами, помогает обрабатывать команды, текст, кнопки и много-много всего.

## Первый шаг: заводим бота

Создайте нового бота через @BotFather в Telegram — он даст вам токен. Храните его в секрете, иначе ваш бот может стать жертвой хулиганов!

## Установка библиотеки

pip install python-telegram-bot --upgrade


## Простой пример: Эхо-бот

Создадим бота, который будет отвечать пользователю тем же текстом:

from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Привет! Я эхо-бот. Напиши мне что-нибудь.")

async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(update.message.text)

app = Application.builder().token("YOUR_BOT_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling()


И всё — у вас уже есть работоспособный бот! Просто вставьте ваш токен и запустите скрипт.

## Добавим команду

Чат-боты отлично справляются с различными командами. Например, добавим простую команду /help:

async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Напиши что-нибудь, и я повторю это за тобой!")

app.add_handler(CommandHandler("help", help_command))


## Почему это круто?

С помощью python-telegram-bot вы можете создавать настоящие мини-приложения в Telegram: интерактивные меню с Inline кнопками, опросы, присылать картинки, аудио, документы — и всё это буквально в пару строк кода.

## Вдохновляйтесь и экспериментируйте!

Посмотрите документацию: https://python-telegram-bot.readthedocs.io. Попробуйте добавить обработку фото или кнопки, или присылать случайное число по команде.

Создавать Telegram-ботов на Python удобно, весело и весьма полезно для тренировки своих навыков программирования. Удачного кода!
👍1
- Введение в типизацию Python: использование библиотеки typing.
Привет, друзья! С вами Иван, и сегодня мы поговорим об одной важной, но часто пугающей теме — типизации в Python. Если вы воспринимаете Python как язык “без заморочек”, то, возможно, удивитесь, что строгая типизация здесь тоже возможна — и даже может реально облегчить жизнь!

Python — динамический язык: переменные “перехватывают” типы данных на лету. Но в больших проектах это может сыграть злую шутку: слишком просто ошибиться и получить головную боль при отладке. Поэтому с версии 3.5 в Python появилась библиотека typing, которая позволяет явно указывать, какие типы данных характерны для ваших функций и переменных.

Зачем это нужно? Аннотации типов делают код читабельнее и позволяют “умным” редакторам (VSCode, PyCharm), а также инструментам типа mypy, находить ошибки ДО выполнения программы.

Рассмотрим пример — пишем функцию для сложения чисел:

def add(a: int, b: int) -> int:
return a + b


Теперь сразу видно: оба аргумента — это числа, и возвращать мы тоже планируем число. Попробуйте подставить строку — mypy сработает: “Так нельзя!”

typing раскрывается особенно удобно с коллекциями. Пусть у нас есть список чисел:

from typing import List

def average(numbers: List[float]) -> float:
return sum(numbers) / len(numbers)


Всё прозрачно: функция ждет список чисел с плавающей точкой, возвращает тоже “флоат”.

Что если функция возвращает или число, или None? Для этого есть аннотация Optional:

from typing import Optional

def find_value(data: List[int], target: int) -> Optional[int]:
for x in data:
if x == target:
return x
return None


А если функция возвращает несколько значений — используем Tuple:

from typing import Tuple

def min_max(values: List[int]) -> Tuple[int, int]:
return min(values), max(values)


typing поддерживает и дженерики, и словари (Dict), и объединение нескольких типов через Union — их возможности огромны! А с Python 3.9 стало удобно просто писать list[int], dict[str, int].

Используйте аннотации не только ради погони за “строгостью”, а чтобы ваши функции были понятнее — вам самим и коллегам в будущем. Свой код вы наверняка переспрашивали: “Что тут вообще возвращается?” — теперь такой проблемы не будет.

Вот и всё на сегодня. Используйте силу типизации, и пусть баги обходят ваш код стороной!
👍1
- Как работать с файлами JSON: чтение, запись и преобразование данных.
Привет! Иван на связи. Сегодня у нас в меню — JSON: тот самый формат, в котором весь современный мир хранит данные. Его едят бэкендеры, фронтендеры и даже базы данных! Пора научиться ловко читать, записывать и трансформировать JSON-файлы на Python. Всё просто, давайте разбираться на примерах.

### Читаем JSON как профи

Предположим, у вас есть файл data.json с содержимым:

{
"name": "Alice",
"age": 25,
"languages": ["English", "German"]
}


Загрузим его так:

import json

with open('data.json', 'r') as file:
data = json.load(file)
print(data)


Теперь data — обычный Python-словарь. Можно обращаться к полям: data['name'], data['languages'].

### Сохраняем свои данные в JSON

Допустим, мы хотим создать базу супергероев:

heroes = [
{"name": "Spider-Man", "power": "Spider-sense"},
{"name": "Iron Man", "power": "Genius intellect"},
]

with open('heroes.json', 'w') as file:
json.dump(heroes, file, indent=4)


Параметр indent добавляет "красоту" в ваш JSON — удобно для глаз и ревью.

### Преобразование: JSON <-> строка

Иногда данные нужно не только читать-записывать из файла, но и гонять их по сети или хранить в БД. Для этого JSON можно превращать в строку:

heroes_str = json.dumps(heroes)
print(heroes_str)


А можно обратно:

new_heroes = json.loads(heroes_str)
print(new_heroes)


### Лайфхаки и подводные камни

- Python не может сериализовать некоторые типы данных (например, объекты, set) напрямую — используйте списки и словари.
- Не забывайте про исключения: JSONDecodeError спасёт от "кривого" файла.

Коротко: модуль json — один из самых удобных инструментов Python. Учитесь его использовать, и обмениваться данными станет гораздо проще!
👍1
- Основы сериализации с модулем pickle в Python.
Привет, друзья! На связи Иван, и сегодня я расскажу о модуле, который обязательно пригодится всем, кто начинает программировать на Python. Встречайте — модуль pickle, магический инструмент для сериализации!

### Что такое сериализация?

Сериализация — это процесс превращения объектов Python в поток байтов (например, для сохранения на диск или передачи по сети). Десериализация — это обратный процесс, когда мы возвращаем объект из байтов обратно в привычную Python-форму.

### Когда нужен pickle?

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

### Короче, давайте к делу!

#### Сохраняем объект

Вот как легко сериализовать объект с помощью pickle:

import pickle

data = {'name': 'Alice', 'age': 30, 'friends': ['Bob', 'Eve']}
with open('data.pickle', 'wb') as f:
pickle.dump(data, f)

Вуаля! Теперь у вас есть файл с объектом в байтовом формате.

#### Восстанавливаем объект

Достаём объект обратно:

import pickle

with open('data.pickle', 'rb') as f:
recovered_data = pickle.load(f)
print(recovered_data)

И снова получаем родной словарь, как ни в чем не бывало.

### Сериализация собственных классов

pickle умеет работать даже с пользовательскими объектами:

class User:
def __init__(self, username):
self.username = username

user = User('Ivan')
with open('user.pickle', 'wb') as f:
pickle.dump(user, f)

with open('user.pickle', 'rb') as f:
loaded_user = pickle.load(f)
print(loaded_user.username)


### Что важно помнить?

- Файлы, созданные pickle, нельзя читать обычным текстовым редактором.
- pickle не гарантирует совместимость между разными версиями Python.
- Никогда не открывайте чужие pickle-файлы, если не доверяете их источнику — это небезопасно.

### Альтернатива?

Для обмена данными между разными языками вместо pickle чаще используют json, но json не умеет всё то, что pickle — например, сериализовать пользовательские объекты.

---

Попробуйте познакомиться с pickle поближе — возможно, это упростит вашу работу с Python в несколько раз!
👍1
- Создание шаблонов веб-приложений с использованием Jinja2.
Привет! С вами Иван, и сегодня мы поговорим о небольшой, но весьма мощной библиотеке — Jinja2. Если вы хоть раз задумывались о создании веб-приложений на Python, этот инструмент просто незаменим для красивого и удобного шаблонирования.

## Что такое Jinja2?

Jinja2 — это движок шаблонов, который позволяет отделить логику вашего приложения от его внешнего вида. Вы описываете структуру HTML в отдельных файлах, а данные подставляете прямо из Python-кода. Такой подход используют как маленькие проекты, так и гиганты, вроде Flask или даже Django в своих шаблонизаторах.

## Как это работает?

Установить Jinja2 очень просто:

pip install Jinja2


Минимальный пример кода — создаём шаблон, передаём в него данные, и получаем готовый HTML:

from jinja2 import Template

template_str = "Hello, {{ name }}!"
template = Template(template_str)
result = template.render(name="World")

print(result) # Выведет: Hello, World!


Выглядит просто? На деле возможности Jinja2 куда шире. Допустим, вам нужно отобразить таблицу пользователей:

from jinja2 import Template

users = [
{"username": "alice", "score": 100},
{"username": "bob", "score": 95}
]

template_str = """
<table>
{% for user in users %}
<tr>
<td>{{ user.username }}</td>
<td>{{ user.score }}</td>
</tr>
{% endfor %}
</table>
"""

template = Template(template_str)
result = template.render(users=users)
print(result)


Jinja2 поддерживает условные конструкции, фильтры, макросы, наследование шаблонов — чем не миниязык для автогенерации контента? Например, вывод разных сообщений в зависимости от числа баллов:

template_str = """
{% if score >= 100 %}
<p>Вы победитель!</p>
{% else %}
<p>Пробуйте еще!</p>
{% endif %}
"""

print(Template(template_str).render(score=55))


## Использование с Flask

Jinja2 интегрирован в Flask "под капотом". Вот пример рендеринга шаблона:

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
return render_template("index.html", name="Ivan")


А в index.html:

<h1>Привет, {{ name }}!</h1>


## Итог

Jinja2 — это быстрая и удобная отправная точка для разделения логики и представления в ваших python-проектах. Он даёт гибкость и порядок там, где чистый HTML превращается в сплошную «кашу» из форматирования и данных. Попробуйте, и ваши веб-приложения станут не только красивее, но и проще в поддержке!

— Иван
🔥2
- Работа с библиотекой itertools для генерации комбинаций и перестановок.
Привет! На связи Иван, и сегодня у нас на повестке дня секретная лаборатория генерации комбинаций и перестановок в Python — знакомимся с модулем itertools!

В программировании часто появляется задача: перебрать все варианты выборки элементов из набора. Например, когда нужно перебрать все пароли длиной 3 символа из “abc”, или узнать, какие есть способы рассадки гостей за столом. Вот тут itertools — идеальный спутник.

## Комбинации: сколько способов выбрать?

Функция combinations из модуля itertools позволяет получить все возможные комбинации заданной длины. Главное: порядок не имеет значения!

from itertools import combinations

letters = ['a', 'b', 'c']
result = list(combinations(letters, 2))
print(result)
# [('a', 'b'), ('a', 'c'), ('b', 'c')]

Как видишь, ('a', 'b') и ('b', 'a') считаются одним вариантом!

## Перестановки: порядок важен!

Если порядок важен — например, для генерации всех возможных PIN-кодов, — тогда используем permutations:

from itertools import permutations

letters = ['a', 'b', 'c']
result = list(permutations(letters, 2))
print(result)
# [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]

Теперь ('a', 'b') и ('b', 'a') — разные перестановки.

## Комбинации с повторами

Если допускается выбор одного элемента несколько раз — например, комбинации цифр на замке, — используй combinations_with_replacement:

from itertools import combinations_with_replacement

letters = ['a', 'b', 'c']
result = list(combinations_with_replacement(letters, 2))
print(result)
# [('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]


## Зачем это нужно?

- Генерация тестовых данных
- Решение головоломок
- Поиск всех вариантов для перебора (например, пароли, маршруты, сочетания товаров)

itertools не создает огромные списки в памяти — все генераторы работают «лениво», выдавая результат по мере запроса. Это мощно!

Пробуй использовать эти методы на практике — и пусть ваши алгоритмы будут быстрыми, а задачи — интересными!
👍3
- Использование библиотеки Pandas для работы с временными рядами.
Привет! Я — Иван, и сегодня мы погрузимся в одну из самых увлекательных сторон Python — работу с временными рядами в библиотеке Pandas. Даже если вы только начинаете разбираться в Python, возможности Pandas по анализу “времени” вас поразят.

### В чем фишка временных рядов?

Временные ряды — это данные, которые меняются во времени: температуры по дням, курсы валют по минутам, количество заявок по месяцам. Pandas предлагает мощные инструменты для создания, преобразования и анализа таких данных.

#### 1. Построим временной ряд

Создадим искусственный DataFrame с датами:

import pandas as pd
import numpy as np

dates = pd.date_range("2024-06-01", periods=10, freq="D")
data = pd.DataFrame({
"value": np.random.randint(10, 100, size=10)
}, index=dates)
print(data)


Благодаря pd.date_range мы мгновенно получаем индекс из дат с шагом в 1 день.

#### 2. Ресемплирование: меняем масштаб времени

Допустим, у нас есть данные по дням, а нужен обзор по неделям:

weekly = data.resample("W").mean()
print(weekly)


Метод resample("W").mean() вычисляет среднее значение за каждую неделю — незаменимо в задачах анализа и сглаживания.

#### 3. Временные срезы: быстро и просто

Извлечь данные за определенный промежуток? Просто используйте срез по дате:

june_data = data["2024-06-03" : "2024-06-07"]
print(june_data)


Pandas умеет распознавать строки-даты и работать с ними «по-человечески».

#### 4. Вычисления смещений и скользящих средних

А теперь представим, что хотим посчитать скользящее среднее (moving average) — классика временных рядов:

data["rolling_mean"] = data["value"].rolling(window=3).mean()
print(data)


Метод .rolling(window=3) создает окно шириной 3, а .mean() вычисляет среднее внутри этого окна для каждой точки.

### Вывод

Pandas превращает анализ временных рядов в настоящее удовольствие даже для новичков. Создавать, агрегировать, фильтровать, вычислять по времени — всё это делается с минимальным количеством кода и максимальной наглядностью. Если вы начнете работать с временными рядами, эта библиотека станет вашим любимым рабочим инструментом!
- Как использовать модуль random для имитации простых игр.
Привет, друзья! На связи Иван, и сегодня у нас на повестке дня настоящий праздник удачи и случайностей — модуль random в Python! Давайте взглянем, как с его помощью можно создавать простые, но увлекательные игры буквально за пару строк.

### Бросаем кости

Сколько раз вы мечтали бросить кубик, не имея его под рукой? С random это просто:

import random

def roll_dice():
return random.randint(1, 6)

print("Your roll:", roll_dice())


Здесь random.randint(1, 6) возвращает случайное целое число от 1 до 6 включительно, будто вы по-настоящему держите в руках шестигранный кубик.

### Монетка

Кто же не любит монетку: "Орёл или решка?" Быстро реализуемый вариант:

import random

def flip_coin():
return random.choice(["Heads", "Tails"])

print("Coin shows:", flip_coin())

random.choice выбирает случайный элемент из списка — универсальный способ для создания лотерей и викторин.

### Мини-лотерея

А теперь немного азартных ощущений! Представьте, что игроку нужно угадать число от 1 до 10.

import random

def guess_number():
number = random.randint(1, 10)
user_guess = int(input("Guess the number between 1 and 10: "))
if user_guess == number:
print("You win!")
else:
print(f"Sorry, the number was {number}")

# guess_number()

Этот код демонстрирует, как добавить интерактивность: программа генерирует секретное число, игрок пытается угадать.

### Случайные события для игр

Часто random используется для имитации неожиданных событий — например, выбор врага в рогалик-игре:

enemies = ["Goblin", "Orc", "Dragon"]
random_enemy = random.choice(enemies)
print("A wild", random_enemy, "appeared!")


Выводы:
random — идеальный инструмент для создания непредсказуемости и интереса в небольших проектах. От кубиков до случайных событий — возможности безграничны. Придумывайте свои игры и пусть случай поможет сделать их веселее!
- Управление асинхронными процессами с библиотекой asyncio.
Привет, друзья! С вами Иван, и сегодня мы окунемся в мир асинхронности на Python, а конкретнее — поговорим о библиотеке asyncio.

Что такое asyncio и зачем оно нужно?

Когда ваш код долго ждет ответа от сервера или читает большой файл, обычный (синхронный) Python просто стоит и ждет. А хочется, чтобы в этот момент выполнялась еще какая-то полезная работа. Вот тут на сцену выходит asyncio — библиотека для удобной работы с асинхронными задачами.

Асинхронный код работает по принципу событийного цикла: задачи ставятся в очередь и исполняются тогда, когда «что-то произошло». Так достигается высокая скорость выполнения операций ввода-вывода.

Простой пример — симуляция одновременной загрузки нескольких веб-страниц:

import asyncio
import aiohttp

async def fetch_url(session, url):
async with session.get(url) as response:
print(f'Read {url}: {response.status}')
return await response.text()

async def main():
urls = [
'https://python.org',
'https://docs.python.org/3/library/asyncio.html',
'https://pypi.org'
]
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
pages = await asyncio.gather(*tasks)
print('All pages downloaded!')

asyncio.run(main())


Что здесь происходит?
Вместо того, чтобы последовательно качать каждую страницу, мы создаём задачи и запускаем их одновременно. asyncio.gather() дожидается, пока все запросы завершатся, а результат собирается в список.

Асинхронность полезна не только в сетевых операциях. Вот пример — задержка (имитация долгой работы) без блокировки кода:

import asyncio

async def do_work(name, seconds):
print(f'{name} starts working')
await asyncio.sleep(seconds)
print(f'{name} finished after {seconds} seconds')

async def main():
await asyncio.gather(
do_work('task_1', 2),
do_work('task_2', 1)
)

asyncio.run(main())


В этом примере обе задачи начинают одновременно, а вся программа завершается за 2 секунды — так быстро, как самая долгая задача!

Главное правило: асинхронные функции пишем с помощью ключевого слова async, и вызываем через await внутри другого async-функции. Методы типа asyncio.run() запускают «цикл событий», который всё разруливает.

Итак, если вам нужны быстрые одновременные операции — смело используйте asyncio. В следующих постах разберём более сложные сценарии работы и интеграцию с другими библиотеками.

До новых встреч!
👍2