Python для начинающих
1.24K subscribers
546 photos
3 videos
232 files
74 links
Python для начинающих
Download Telegram
- Как создать генератор текстов на основе NLTK
Привет! Я Иван, и сегодня расскажу, как на Python с помощью модуля NLTK сделать простой генератор текстов. NLTK — мощная библиотека для работы с естественным языком, и один из классических способов использовать её, — это построить генератор на базе цепей Маркова.

Чем мы займёмся?
1. Возьмём текст — например, “Alice in Wonderland”.
2. Разделим его на слова.
3. Построим модель цепей Маркова: будем анализировать, какие слова чаще всего идут друг за другом.
4. Научим программу сочинять новые фразы — не хуже Льюиса Кэрролла!

Поехали!

### 1. Подготавливаем текст

import nltk
from nltk.corpus import gutenberg

nltk.download('gutenberg')
words = list(gutenberg.words('carroll-alice.txt'))


### 2. Строим цепь Маркова

Создадим словарь, где ключ — текущее слово, значение — список слов, которые стояли следом.

import random

def build_markov_chain(words):
chain = {}
for i in range(len(words) - 1):
curr_word = words[i]
next_word = words[i + 1]
if curr_word not in chain:
chain[curr_word] = []
chain[curr_word].append(next_word)
return chain

markov_chain = build_markov_chain(words)


### 3. Генерируем текст

Выбираем случайное слово, и шаг за шагом подбираем следующее — на основе цепи.

def generate_text(chain, start_word, length=30):
curr_word = start_word
result = [curr_word]
for _ in range(length - 1):
next_words = chain.get(curr_word, None)
if not next_words:
break
curr_word = random.choice(next_words)
result.append(curr_word)
return ' '.join(result)

print(generate_text(markov_chain, 'Alice'))


Экспериментируйте! Попробуйте сами менять исходный текст или длину цепочки. Можно использовать свой корпус, собрать новости или книжки. Такой генератор — отличная иллюстрация того, как машинное обучение проникает в повседневные задачи.

NLTK — настоящий швейцарский нож для новичков в Python и обработке текстов. Пробуйте и играйтесь с цепями Маркова — раз и открывается путь в удивительный мир генерации оригинального контента!
🔥1
- Уменьшение объема данных в Python: работа с gzip
Привет! Я Иван, и сегодня мы отправимся в сжатый мир — поговорим о том, как уменьшать объём данных в Python с помощью модуля gzip.

Что если у вас есть большой текстовый файл, и вы не хотите забивать диск лишними мегабайтами? Здесь на помощь приходит Gzip — классический стандарт компрессии, который легко использовать в Python, даже если вы только начинаете.

## Быстрое знакомство с gzip

Модуль gzip — это часть стандартной библиотеки Python. Он позволяет читать и записывать файлы в формате .gz без танцев с бубном.

### Как сжать файл

Сжать файл очень просто:

import gzip

with open('large_file.txt', 'rb') as f_in, gzip.open('compressed_file.txt.gz', 'wb') as f_out:
f_out.write(f_in.read())


Здесь мы читаем исходный файл в бинарном режиме и записываем его с компрессией. Результат — сэкономленные мегабайты!

### Чтение gzip-файла (как обычного текста!)

Сжатие — это супер, но что делать дальше? Открывайте как обычный файл!

import gzip

with gzip.open('compressed_file.txt.gz', 'rt', encoding='utf-8') as f:
for line in f:
print(line.strip())


Обратите внимание на режим 'rt' — мы читаем текст, как если бы работали с обычным файлом.

### Сжатие строк прямо на лету

А если не хочется возиться с файлами? Можно сжимать и разжимать просто строки:

import gzip

original = b'Python is amazing! ' * 100
compressed = gzip.compress(original)
decompressed = gzip.decompress(compressed)

print('Original size:', len(original))
print('Compressed size:', len(compressed))
print('Decompressed equals original:', decompressed == original)


## Когда использовать gzip?

- Архивация логов
- Хранение больших дампов данных
- Экономия места при передаче данных по сети

## Особенности

- gzip работает только с бинарными данными.
- В Python 3.2+ поддерживается чтение/запись как текстовых файлов через параметры 'rt'/'wt' и encoding.

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

---

## Зачем оптимизировать CPU-ресурсы?

В современных компьютерах часто несколько ядер CPU, каждое способно выполнять свои задачи одновременно. Однако классический Python-код, особенно если он однопоточный, использует лишь одно ядро. Чтобы выйти из этого ограничения, нужно распараллелить задачи.

Модуль concurrent.futures — один из самых простых и мощных способов для параллельного выполнения кода. Он помогает быстро создавать пул потоков (ThreadPoolExecutor) или процессов (ProcessPoolExecutor), где каждый поток или процесс обрабатывает часть работы. Это особенно актуально для CPU-bound задач — тех, которые интенсивно используют процессор.

---

## Когда использовать ProcessPoolExecutor?

Важно понимать, что в Python срабатывает GIL (Global Interpreter Lock), который не даёт потокам параллельно работать с CPU. Поэтому для тяжёлых вычислений лучше использовать ProcessPoolExecutor, который создаёт несколько отдельных процессов, каждый со своим интерпретатором Python и своей памятью.

В свою очередь, ThreadPoolExecutor отлично подходит для I/O-bound задач, например, скачивания файлов или работы с сетью.

---

## Пример: ускоряем подсчёт факториала нескольких чисел

Посмотрим на пример, где нам нужно посчитать факториалы для множества больших чисел. Обычный цикл будет работать долго, а мы попробуем распараллелить процесс.

import time
from concurrent.futures import ProcessPoolExecutor
import math

def factorial(n):
return math.factorial(n)

numbers = [10**5 + i for i in range(5)] # Большие числа

start = time.time()

# Однопоточный вариант
results = []
for number in numbers:
results.append(factorial(number))

print("Single-threaded:", time.time() - start, "seconds")

start = time.time()

# Параллельный вариант
with ProcessPoolExecutor() as executor:
results = list(executor.map(factorial, numbers))

print("Multi-process:", time.time() - start, "seconds")


Обратите внимание, что при запуске этого кода на вашем компьютере время работы с ProcessPoolExecutor будет значительно меньше, так как все процессы координально распараллеливают работу.

---

## Полезные советы для оптимизации

1. Выбирайте правильный executor. Для CPU-bound — ProcessPoolExecutor, для I/O-bound — ThreadPoolExecutor.
2. Настраивайте число процессов. По умолчанию ProcessPoolExecutor создаёт количество процессов равное числу CPU-ядер. Иногда можно уменьшить или увеличить это значение вручную.
3. Не передавайте большие объёмы данных между процессами. Копирование данных между процессами — дорогая операция. Лучше вычислять что-то локально в каждом процессе.
4. Используйте executor.map для удобного и эффективного запуска сразу множества задач.

---

concurrent.futures — отличный инструмент, который уже встроен в Python и позволяет без сложностей начать писать многопроцессные приложения. Он значительно улучшает производительность там, где однопоточная обработка — узкое место.

Освойте этот модуль — и ваши ресурсоёмкие задачи не будут тянуть вас назад! Удачи в кодинге!
— Иван
👍3
- Использование модуля tempfile для временного хранения данных
Привет! С вами Иван, и сегодня мы разберём один из часто недооценённых модулей Python — tempfile. Готовы навести порядок в хаосе временных файлов? Погнали!

## tempфайловое Королевство

Часто в процессе работы программы требуется где-то «прилечь» временным данным: сохранить промежуточные результаты, обработать большой кусок информации или просто протестировать что-то на лету, не создавая мусор в рабочей директории. Вот где на сцену выходит tempfile.

### Временные файлы: просто и безопасно

Вручную создавать, чистить, удалять временные файлы и папки — занятие неблагодарное. tempfile всё делает за вас:

import tempfile

with tempfile.TemporaryFile(mode='w+t') as temp:
temp.write('Hello, temporary world!')
temp.seek(0)
print(temp.read())
# Файл **автоматически** удалён после выхода из блока with!

Этот способ отлично подходит, если временный файл не должен быть виден в системе (например, для тестов или парсинга).

### Имя файла нужно?

Иногда программам нужно работать с реальным файлом на диске, используя его имя (например, передать во внешний процесс):

import tempfile

with tempfile.NamedTemporaryFile(mode='w+t', delete=True) as temp:
temp.write('Use my name!')
temp.flush()
print('Filename:', temp.name)

Здесь файл доступен по имени temp.name и исчезнет при выходе из блока with.

### Временные папки

Программа генерирует пачку разных файлов? Тогда тебе пригодится временный каталог:

import tempfile
import os

with tempfile.TemporaryDirectory() as temp_dir:
file_path = os.path.join(temp_dir, 'example.txt')
with open(file_path, 'w') as f:
f.write('Temp directories rock!')
# Здесь можно создавать сколько угодно файлов внутри temp_dir
# Вся папка удаляется автоматически!


### Безопасность и кроссплатформенность

tempfile выбирает директорию для хранения данных с учётом ОС и прав пользователя, а ещё расставляет уникальные суффиксы, чтобы не было конфликтов имён. Да и насчёт безопасности можно не переживать: права доступа ставятся минимальные.

### Где это реально полезно?

- Тестирование: не засорять проект лишними файлами;
- Работа с внешними библиотеками (например, форматирование документов через сторонние утилиты);
- Обработка Medium/Large data «на лету», чтобы не держать всё в памяти.

Вот такой незаметный, но суперполезный модуль. Экономит нервы и помогает писать аккуратный код. Подключай tempfile и делай Python-программы практичнее!
👍1
- Создание интерактивов с модулем turtle для начальных уроков программирования
Привет, друзья! С вами снова Иван, и сегодня мы погрузимся в мир веселого и интерактивного программирования на Python с помощью модуля turtle. Turtle – это практически встроенный художник для начинающих программистов. Он отлично помогает освоить базовые концепции программирования через творчество. Давайте вместе создадим несколько интерактивных проектов, которые заставят ваш код «ожить».

### Первая интерактивность: управляй черепашкой

Для начала – классика: научим пользователя управлять черепашкой при помощи клавиш. Такой подход отлично знакомит с работой событий и функцией обратного вызова (callback).

import turtle

t = turtle.Turtle()
scr = turtle.Screen()

def move_forward():
t.forward(30)

def turn_left():
t.left(45)

def turn_right():
t.right(45)

scr.listen()
scr.onkey(move_forward, "Up")
scr.onkey(turn_left, "Left")
scr.onkey(turn_right, "Right")

scr.mainloop()


Жмите стрелки — и наблюдайте, как черепашка послушно перемещается по экрану! Это минимальный, но очень показательный пример управления объектом.

### Рисуем, куда кликаем

А как насчёт превращения вашего кода в простейшее рисовальное приложение? Turtle позволяет реагировать на клики мышки!

import turtle

t = turtle.Turtle()
scr = turtle.Screen()

def draw_at(x, y):
t.penup()
t.goto(x, y)
t.pendown()
t.stamp()

scr.onscreenclick(draw_at)
scr.mainloop()


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

### Игра для начинающих: собираем звёзды

Давайте сделаем небольшую игру — ловим звёзды! Пусть черепашка двигается к месту клика и «собирает» звёздочку.

import turtle
import random

player = turtle.Turtle(shape="turtle")
star = turtle.Turtle(shape="circle")
star.color("yellow")
star.penup()
star.goto(random.randint(-200, 200), random.randint(-200, 200))

def go_to_star(x, y):
player.setheading(player.towards(star))
player.goto(star.pos())
star.goto(random.randint(-200, 200), random.randint(-200, 200))

screen = turtle.Screen()
screen.onscreenclick(go_to_star)
screen.mainloop()


Теперь каждый клик — это попытка «поймать» улетающую звезду, а основа следующей игры уже готова. Такие эксперименты отлично развивают алгоритмическое мышление и интерес к Python.

### Итоги

Turtle великолепно подходит для начинающих: он дает быстрый визуальный результат и мотивацию поиграться с кодом. Советую попробовать свои идеи, меняя команды и добавляя свои фишки! Бонус — этот модуль проверенно работает даже у школьников без программного опыта. До встречи, ваш Иван!
👍3
- Работа с данными о геолокации: как обрабатывать GeoJSON
Привет! Меня зовут Иван, и сегодня я открою вам дверь в мир геоданных на Python. Готовы к путешествию? Ведь GeoJSON — это ваш электронный компас для работы с координатами, картами и информацией о мире вокруг!

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

GeoJSON — это формат для хранения и передачи данных о географических объектах. Всё, что связано с точками на карте (например, местоположения кафе, маршруты дорог или границы парков), часто хранится именно в нем.

В основе GeoJSON лежат обычные структуры JSON, что делает его простым для чтения, понимания и — самое главное для нас — обработки на Python.

## Базовая работа с GeoJSON

Для начала стоит познакомиться с модулем json, а также с отличным помощником — библиотекой geojson. Установить её можно через pip:

pip install geojson


Давайте разберём простой пример: у нас есть GeoJSON-файл с точками интереса (POI), и мы хотим получить координаты всех этих мест.

import geojson

with open("points.geojson", "r") as file:
data = geojson.load(file)

for feature in data["features"]:
coords = feature["geometry"]["coordinates"]
name = feature["properties"].get("name")
print(f"Name: {name}, Coordinates: {coords}")


Теперь мы можем легко вытащить из файла всю нужную информацию!

## Создаем GeoJSON сами

Своими руками создавать такие данные тоже просто:

import geojson

point = geojson.Point((37.618423, 55.751244)) # (долгота, широта)
feature = geojson.Feature(geometry=point, properties={"name": "Red Square"})
feature_collection = geojson.FeatureCollection([feature])

with open("my_points.geojson", "w") as file:
geojson.dump(feature_collection, file)


Этот код создаст файл с одной точкой — например, Красной площадью.

## Валидация геоданных

GeoJSON допускает ошибки — но библиотека geojson умеет валидировать объекты:

from geojson import Point, is_valid

pt = Point((200, 100)) # неправильные координаты
print(is_valid(pt)) # Покажет, что не так


## Не только чтение, но и визуализация!

Для быстрой визуализации можно использовать folium:

import folium

map_ = folium.Map(location=[55.751244, 37.618423], zoom_start=10)
folium.GeoJson("my_points.geojson").add_to(map_)
map_.save("map.html")


Готово — у вас есть интерактивная карта на HTML!

---

GeoJSON — это отличный способ научиться работать с пространственными данными на Python. Простота формата, множество библиотек и лёгкость интеграции превращают его в швейцарский нож для начинающих геокодеров. Успехов в ваших гео-экспедициях!
👍3
- Введение в сигнализацию и обработку сигналов с модулем signal
Привет! Это Иван, и сегодня — интереснейшая тема для начинающих питонистов: как работает модуль signal, и зачем вообще программам нужны сигналы!

## Что такое сигналы?

Сигналы — это особый способ общения между процессами и операционной системой. Когда, например, вы нажимаете Ctrl+C во время работы скрипта, Python получает сигнал SIGINT. Представьте, что сигнал — это выстрел: его ловит программа, если знает, как это сделать, или падает, если не знает.

## Meet the signal!

В Python есть стандартный модуль signal. С его помощью ваша программа может ловить определённые сигналы (например, запрос на завершение) и реагировать на них по-своему.

### Простейший пример

Пусть мы хотим аккуратно завершать скрипт по Ctrl+C:

import signal
import sys

def handle_sigint(signum, frame):
print("Received SIGINT! Exiting gracefully...")
sys.exit(0)

signal.signal(signal.SIGINT, handle_sigint)

print("Try pressing Ctrl+C!")
while True:
pass # Вечный цикл для теста


Здесь мы ловим SIGINT (тот самый Ctrl+C) и обрабатываем его: печатаем сообщение и завершаемся красиво, а не резко.

### Сигналы-таймеры (SIGALRM)

Signal бывает полезен не только для Ctrl+C! Например, можно отправлять самому себе сигнал-таймер — это удобно, если хочется дать функции ограниченное время на выполнение.

import signal

def timeout_handler(signum, frame):
print("Time's up!")

signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(3) # Через 3 секунды придёт сигнал

print("Waiting for the alarm signal...")
signal.pause()


Этот код выводит сообщение ровно через 3 секунды! Очень удобно для создания таймаутов.

### Важно!

- На Windows поддерживаются не все типы сигналов (например, SIGALRM не работает).
- signal работает только в главном потоке (main thread).

## Как ещё это можно использовать?

Можно ловить сигналы завершения (SIGTERM), чтобы сохранять важные данные перед смертью процесса, либо реализовать долгоживущие сервисы с аккуратным завершением.

Модуль signal — простой способ сделать свои программы более живучими и управляемыми со стороны системы. Пробуйте в своих проектах!

До новых встреч,
Иван
👍2
- Как автоматизировать отправку электронной почты с smtplib
Привет! С вами Иван, и сегодня мой Python-блог посвящён суперполезной фишке — автоматизации отправки email с помощью модуля smtplib. Почта — штука незаменимая: ежедневные отчёты, рассылки новостей, уведомления клиентам… Зачем делать это вручную, если можно поручить задачу питону?

## smtplib — твой email-робот

smtplib входит в стандартную библиотеку Python, так что ничего дополнительно устанавливать не нужно. С его помощью можно подключаться к почтовым серверам через SMTP-протокол и слать письма хоть ежедневно, хоть ежечасно.

### Минимальный рабочий пример

Вот простой скрипт, который отправляет email через Gmail:

import smtplib

sender = "your_email@gmail.com"
password = "your_password"
recipient = "recipient_email@example.com"
message = "Subject: Hello from Python!\n\nThis is an automated email."

with smtplib.SMTP("smtp.gmail.com", 587) as smtp_server:
smtp_server.starttls() # Защищённое соединение
smtp_server.login(sender, password)
smtp_server.sendmail(sender, recipient, message)


Меняем email и пароль — и письмо уже в пути! Но помни о безопасности: для временных скриптов лучше использовать отдельные почтовые аккаунты и специальные пароли приложений.

### Отправляем HTML и вложения

Текстовое письмо — это скучно. Хотите добавить форматирование или вложить файл? Вот пример с email.message.EmailMessage:

import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["Subject"] = "Automated report"
msg["From"] = "your_email@gmail.com"
msg["To"] = "recipient_email@example.com"
msg.set_content("See attached report.")

with open("report.pdf", "rb") as file:
msg.add_attachment(file.read(), maintype="application", subtype="pdf", filename="report.pdf")

with smtplib.SMTP("smtp.gmail.com", 587) as smtp:
smtp.starttls()
smtp.login("your_email@gmail.com", "your_password")
smtp.send_message(msg)


Теперь письмо придёт с красивым вложением, что удобно для отправки отчётов.

### В чём подвох?

Автоматизация — это мощь, но есть нюансы:
- Gmail и Яндекс требуют включения паролей приложений или разрешения для сторонних приложений.
- Частая массовая отправка может привести к блокировке.
- Логи, try-except и проверки — ваши друзья при работе с отправкой email.

А теперь — создавай свои рассылки, поздравления и уведомления, ведь с smtplib Python справится за тебя!
👍2
- Использование timeit для измерения производительности кода
Привет! Иван на связи — сегодня поговорим о невероятно полезном инструменте Python для измерения производительности кода: модуле timeit. Даже самый красивый код может оказаться медленным, если не следить за временем выполнения. Timeit позволяет объективно сравнить разные реализации алгоритмов и найти узкие места.

### Почему именно timeit?

Использование time.sleep или обычные таймеры часто обманывают: они не учитывают влияние других процессов, кешей, а ещё добавляют погрешность. Timeit выполняет ваш код множество раз, усредняет значения и таким образом даёт честную метрику скорости работы.

### Пример 1: Сравнение двух способов сложить список

import timeit

setup = "numbers = list(range(1000))"
sum_builtin = "total = sum(numbers)"
sum_loop = '''
total = 0
for num in numbers:
total += num
'''

print("Built-in sum:", timeit.timeit(stmt=sum_builtin, setup=setup, number=10000))
print("For loop sum:", timeit.timeit(stmt=sum_loop, setup=setup, number=10000))


Результаты покажут неожиданный разрыв — встроенный sum почти всегда быстрее ручного цикла.

### Пример 2: Как измерить время выполнения функции?

Timeit умеет работать и с реальными функциями. Например:

def multiply():
result = 1
for i in range(1, 100):
result *= i

print(timeit.timeit(multiply, number=10000))


Передавайте функцию прямо в timeit.timeit.

### Пример 3: Сравнение list comprehension и генератора

setup = "numbers = range(1000)"
list_comp = "[x * 2 for x in numbers]"
gen_expr = "list(x * 2 for x in numbers)"

print("List comprehension:", timeit.timeit(stmt=list_comp, setup=setup, number=10000))
print("Generator expression:", timeit.timeit(stmt=gen_expr, setup=setup, number=10000))


Проверьте сами — не всегда интуиция правильна!

### Коротко: как пользоваться timeit

- Пишите тестируемый код как строку или функцию.
- Используйте параметр number — сколько раз выполнить ваш код.
- Изучайте результат — время в секундах. Меньше — лучше!

Timeit — ваш главный друг, если хотите, чтобы код работал максимально быстро. Экспериментируйте, оптимизируйте, удивляйтесь результатам!
👍1
- Как строить композитные структуры данных с модулем collections
Привет! На связи Иван, и сегодня расскажу, как модуль collections из стандартной библиотеки Python превращает скучное “списки и словари” в настоящее поле для экспериментов.

## Почему collections?

Казалось бы — зачем что-то придумывать, если уже есть list, tuple, dict? На деле, стандартные структуры не всегда удобны. Когда нужно быстро реализовать стек, очередь, счетчик, вложенный словарь или именованный кортеж, collections спасает время и нервы.

### 1. namedtuple: кортеж с именами, как у взрослого структуры!

Безумно удобно, когда к элементам можно обращаться по имени, а не по индексу:

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(3, 5)
print(p.x, p.y) # 3 5


Идеально для хранения данных с фиксированной структурой — теперь ошибки с перепутанными индексами будут реже!

### 2. defaultdict: избавь себя от KeyError

Когда хочется вложенных словарей, но надоело вручную проверять на наличие ключа:

from collections import defaultdict

tree = defaultdict(lambda: defaultdict(int))
tree['fruits']['apple'] += 1
tree['fruits']['banana'] += 2
print(dict(tree))
# {'fruits': {'apple': 1, 'banana': 2}}


Это настоящая магия — никаких проверок, всё создаётся "на лету".

### 3. Counter: простейший анализ данных

Считать количество элементов — привычная задача. С Counter не надо писать лишний код:

from collections import Counter

colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
color_counts = Counter(colors)
print(color_counts)
# Counter({'blue': 3, 'red': 2, 'green': 1})


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

### 4. deque: очередь и стек в одном лице

Когда нужна быстрая вставка и удаление с обоих концов:

from collections import deque

history = deque(maxlen=3)
history.extend([1, 2, 3])
history.append(4)
print(history) # deque([2, 3, 4])
history.appendleft(0)
print(history) # deque([0, 2, 3])


deque — must-have для реализации очередей, поиска в ширину и undo-операций.

---

collections — это не просто "очередной модуль", а настоящий швейцарский нож для работы со структурами данных. Освой эти инструменты — и твой код станет чище, понятнее и быстрее!
👍2