В Flask для разделения header и footer можно использовать шаблонизатор Jinja2. Вот как это организовать:
## Базовая структура проекта
## 1. Базовый шаблон (base.html)
## 2. Header (header.html)
## 3. Footer (footer.html)
## 4. Страницы с уникальными CSS/JS
home.html:
about.html:
## 5. Flask приложение (app.py)
## 6. Пример CSS файлов
base.css:
home.css:
about.css:
## Дополнительные возможности
### Передача данных в шаблоны
### Условное подключение CSS/JS
## Базовая структура проекта
myapp/
├── app.py
├── static/
│ ├── css/
│ │ ├── base.css
│ │ ├── home.css
│ │ └── about.css
│ └── js/
│ ├── base.js
│ ├── home.js
│ └── about.js
└── templates/
├── base.html
├── header.html
├── footer.html
├── home.html
└── about.html
## 1. Базовый шаблон (base.html)
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Мой сайт{% endblock %}</title>
<!-- Базовые CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/base.css') }}">
<!-- Блок для дополнительных CSS -->
{% block css %}{% endblock %}
</head>
<body>
<!-- Подключаем header -->
{% include 'header.html' %}
<!-- Основное содержимое -->
<main>
{% block content %}{% endblock %}
</main>
<!-- Подключаем footer -->
{% include 'footer.html' %}
<!-- Базовые JS -->
<script src="{{ url_for('static', filename='js/base.js') }}"></script>
<!-- Блок для дополнительных JS -->
{% block js %}{% endblock %}
</body>
</html>
## 2. Header (header.html)
<header>
<nav>
<ul>
<li><a href="{{ url_for('home') }}">Главная</a></li>
<li><a href="{{ url_for('about') }}">О нас</a></li>
</ul>
</nav>
</header>
## 3. Footer (footer.html)
<footer>
<p>© 2024 Мой сайт. Все права защищены.</p>
</footer>
## 4. Страницы с уникальными CSS/JS
home.html:
{% extends "base.html" %}
{% block title %}Главная страница{% endblock %}
{% block css %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/home.css') }}">
{% endblock %}
{% block content %}
<h1>Добро пожаловать на главную страницу!</h1>
<p>Это содержимое главной страницы.</p>
{% endblock %}
{% block js %}
<script src="{{ url_for('static', filename='js/home.js') }}"></script>
{% endblock %}about.html:
{% extends "base.html" %}
{% block title %}О нас{% endblock %}
{% block css %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/about.css') }}">
<!-- Можно добавить несколько CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/special.css') }}">
{% endblock %}
{% block content %}
<h1>О нашей компании</h1>
<p>Информация о компании...</p>
{% endblock %}
{% block js %}
<script src="{{ url_for('static', filename='js/about.js') }}"></script>
<!-- Можно добавить несколько JS -->
<script src="{{ url_for('static', filename='js/analytics.js') }}"></script>
{% endblock %}## 5. Flask приложение (app.py)
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('home.html')
@app.route('/about')
def about():
return render_template('about.html')
if __name__ == '__main__':
app.run(debug=True)
## 6. Пример CSS файлов
base.css:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
line-height: 1.6;
}home.css:
/* Стили только для главной страницы */
.hero {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 100px 0;
text-align: center;
}
about.css:
/* Стили только для страницы "О нас" */
.about-section {
padding: 50px 0;
background-color: #f8f9fa;
}
## Дополнительные возможности
### Передача данных в шаблоны
@app.route('/')
def home():
return render_template('home.html',
page_title="Главная",
user="Иван")### Условное подключение CSS/JS
❤1
{% block css %}
{% if request.endpoint == 'home' %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/home.css') }}">
{% elif request.endpoint == 'about' %}
<link rel="stylesheet" href="{{ url_for('static', filename='css/about.css') }}">
{% endif %}
{% endblock %}### Макросы для повторяющихся элементов
Создайте
macros.html:{% macro render_nav_item(endpoint, text) %}
<li class="{% if request.endpoint == endpoint %}active{% endif %}">
<a href="{{ url_for(endpoint) }}">{{ text }}</a>
</li>
{% endmacro %}И используйте в header:
{% from "macros.html" import render_nav_item %}
<nav>
<ul>
{{ render_nav_item('home', 'Главная') }}
{{ render_nav_item('about', 'О нас') }}
</ul>
</nav>Такой подход позволяет легко поддерживать код, изменять общие элементы в одном месте и добавлять уникальные стили и скрипты для каждой страницы.
👍2
Привет! Это Иван, и сегодня я хочу рассказать тебе про не совсем обычную штуку: как использовать свою библиотеку вместе с Hypothesis. Если ты когда-нибудь писал собственные функции или модули и задумался, “а как их тестировать по-настоящему?”, Hypothesis как раз даст мощный boost для твоих питонячьих тестов.
## Немного про Hypothesis
Hypothesis — это библиотека для property-based тестирования на Python. В отличие от классических юнит-тестов, она генерирует сотни разных входных данных, чтобы “поймать” неожиданные ошибки в твоем коде.
Окей, допустим, у тебя есть свой модуль — например, библиотека для работы с матрицами
А теперь самое интересное! Давай протестируем его с помощью Hypothesis.
## Подключаем Hypothesis
Сначала установи Hypothesis, если ты этого еще не сделал:
Теперь, создадим файл тестов:
Что здесь происходит? Hypothesis автоматически создает пары матриц 2x2 с целыми числами. Мы проверяем размеры — Hypothesis иногда “подкидывает” данные, которые не соответствуют нашим ожиданиям. Для таких случаев — делаем ранний
Это гораздо мощнее вручную написанных тестов:
- Ты не упустишь экзотические случаи, которые не пришли бы в голову!
- Если твоя функция выйдет за границы или возникнет исключение, Hypothesis все расскажет и покажет минимальный пример.
## А если своя библиотека сложная?
Ты можешь создать свои собственные стратегии генерации данных для любых сложных структур! Например, если твои объекты — это словари с обязательными и необязательными полями, Hypothesis вполне справится.
Используй свою стратегию вместо стандартной, и все готово для сложных кейсов!
---
С Hypothesis твоя библиотека получит настоящий краш-тест. Я использую его во всех своих проектах — и всегда нахожу неожиданные “сюрпризы” в коде!
Пусть твои тесты работают не на количество, а на качество. Удачи и до встречи — с вами был Иван!
## Немного про Hypothesis
Hypothesis — это библиотека для property-based тестирования на Python. В отличие от классических юнит-тестов, она генерирует сотни разных входных данных, чтобы “поймать” неожиданные ошибки в твоем коде.
Окей, допустим, у тебя есть свой модуль — например, библиотека для работы с матрицами
mymatrix.py:# mymatrix.py
def add_matrices(a, b):
return [[x + y for x, y in zip(row_a, row_b)]
for row_a, row_b in zip(a, b)]
А теперь самое интересное! Давай протестируем его с помощью Hypothesis.
## Подключаем Hypothesis
Сначала установи Hypothesis, если ты этого еще не сделал:
pip install hypothesis
Теперь, создадим файл тестов:
# test_mymatrix.py
from mymatrix import add_matrices
from hypothesis import given
from hypothesis.strategies import lists, integers
@given(
lists(lists(integers(), min_size=2, max_size=2), min_size=2, max_size=2),
lists(lists(integers(), min_size=2, max_size=2), min_size=2, max_size=2)
)
def test_add_matrices(matrix_a, matrix_b):
if len(matrix_a) != len(matrix_b):
return # Разные размеры не складываем
for row_a, row_b in zip(matrix_a, matrix_b):
if len(row_a) != len(row_b):
return # Разная длина строк — тоже пропускаем
result = add_matrices(matrix_a, matrix_b)
for i in range(len(matrix_a)):
for j in range(len(matrix_a[i])):
assert result[i][j] == matrix_a[i][j] + matrix_b[i][j]
Что здесь происходит? Hypothesis автоматически создает пары матриц 2x2 с целыми числами. Мы проверяем размеры — Hypothesis иногда “подкидывает” данные, которые не соответствуют нашим ожиданиям. Для таких случаев — делаем ранний
return.Это гораздо мощнее вручную написанных тестов:
- Ты не упустишь экзотические случаи, которые не пришли бы в голову!
- Если твоя функция выйдет за границы или возникнет исключение, Hypothesis все расскажет и покажет минимальный пример.
## А если своя библиотека сложная?
Ты можешь создать свои собственные стратегии генерации данных для любых сложных структур! Например, если твои объекты — это словари с обязательными и необязательными полями, Hypothesis вполне справится.
from hypothesis.strategies import composite
@composite
def custom_matrices(draw):
base = lists(integers(), min_size=3, max_size=3)
return [draw(base) for _ in range(3)]
Используй свою стратегию вместо стандартной, и все готово для сложных кейсов!
---
С Hypothesis твоя библиотека получит настоящий краш-тест. Я использую его во всех своих проектах — и всегда нахожу неожиданные “сюрпризы” в коде!
Пусть твои тесты работают не на количество, а на качество. Удачи и до встречи — с вами был Иван!
👍3
Привет! С вами Иван. Сегодня мы разберём, как создавать случайные графы в Python с помощью замечательного модуля NetworkX. Представьте: вы моделируете социальные сети, исследуете транспортные маршруты или просто хотите попрактиковаться с алгоритмами на графах. Как быстро получить нужный граф? Легко, если вы знакомы с генераторами графов.
## Быстрое знакомство с NetworkX
NetworkX — один из самых популярных пакетов для работы с графами. С его помощью можно строить и анализировать любые графовые структуры — и, конечно, генерировать случайные графы для тестов или экспериментов.
## Пример 1: Случайный неориентированный граф Эрдёша-Реньи
Классика начинается с модели Эрдёша-Реньи. Здесь есть два параметра: количество вершин и вероятность появления ребра между каждой парой.
Меняя вероятность, вы получите совсем разные структуры — от разрозненных точек до плотных сетей.
## Пример 2: Случайный направленный граф
Аналогичная модель для направленных графов доступна через
Такой граф отлично подходит для симуляции сетей, где направление имеет значение, например — информационные потоки.
## Пример 3: Графы по закону степенного распределения
Реальную сеть часто можно смоделировать графами Барбаши-Альберт — в них степени вершин распределяются по закону "богатые становятся богаче".
Обратите внимание, как появляются "центры влияния" — такие графы сильно напоминают соцсети.
---
Генерация случайных графов в NetworkX занимает всего пару строк, но открывает огромные возможности для моделирования и тестирования. Используйте правильные генераторы — и ваши эксперименты станут реалистичнее!
До новых встреч!
Иван
## Быстрое знакомство с NetworkX
NetworkX — один из самых популярных пакетов для работы с графами. С его помощью можно строить и анализировать любые графовые структуры — и, конечно, генерировать случайные графы для тестов или экспериментов.
## Пример 1: Случайный неориентированный граф Эрдёша-Реньи
Классика начинается с модели Эрдёша-Реньи. Здесь есть два параметра: количество вершин и вероятность появления ребра между каждой парой.
import networkx as nx
import matplotlib.pyplot as plt
n_nodes = 10
edge_prob = 0.3
G = nx.erdos_renyi_graph(n_nodes, edge_prob)
nx.draw_circular(G, with_labels=True)
plt.show()
Меняя вероятность, вы получите совсем разные структуры — от разрозненных точек до плотных сетей.
## Пример 2: Случайный направленный граф
Аналогичная модель для направленных графов доступна через
gnp_random_graph с параметром directed=True.n_nodes = 8
edge_prob = 0.4
DG = nx.gnp_random_graph(n_nodes, edge_prob, directed=True)
nx.draw_shell(DG, with_labels=True, arrows=True)
plt.show()
Такой граф отлично подходит для симуляции сетей, где направление имеет значение, например — информационные потоки.
## Пример 3: Графы по закону степенного распределения
Реальную сеть часто можно смоделировать графами Барбаши-Альберт — в них степени вершин распределяются по закону "богатые становятся богаче".
n_nodes = 15
edges_per_node = 2
BA = nx.barabasi_albert_graph(n_nodes, edges_per_node)
nx.draw_spring(BA, with_labels=True, node_color='orange')
plt.show()
Обратите внимание, как появляются "центры влияния" — такие графы сильно напоминают соцсети.
---
Генерация случайных графов в NetworkX занимает всего пару строк, но открывает огромные возможности для моделирования и тестирования. Используйте правильные генераторы — и ваши эксперименты станут реалистичнее!
До новых встреч!
Иван
👍2
Привет! Я Иван, и сегодня расскажу, как на Python с помощью модуля NLTK сделать простой генератор текстов. NLTK — мощная библиотека для работы с естественным языком, и один из классических способов использовать её, — это построить генератор на базе цепей Маркова.
Чем мы займёмся?
1. Возьмём текст — например, “Alice in Wonderland”.
2. Разделим его на слова.
3. Построим модель цепей Маркова: будем анализировать, какие слова чаще всего идут друг за другом.
4. Научим программу сочинять новые фразы — не хуже Льюиса Кэрролла!
Поехали!
### 1. Подготавливаем текст
### 2. Строим цепь Маркова
Создадим словарь, где ключ — текущее слово, значение — список слов, которые стояли следом.
### 3. Генерируем текст
Выбираем случайное слово, и шаг за шагом подбираем следующее — на основе цепи.
Экспериментируйте! Попробуйте сами менять исходный текст или длину цепочки. Можно использовать свой корпус, собрать новости или книжки. Такой генератор — отличная иллюстрация того, как машинное обучение проникает в повседневные задачи.
NLTK — настоящий швейцарский нож для новичков в Python и обработке текстов. Пробуйте и играйтесь с цепями Маркова — раз и открывается путь в удивительный мир генерации оригинального контента!
Чем мы займёмся?
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-файла (как обычного текста!)
Сжатие — это супер, но что делать дальше? Открывайте как обычный файл!
Обратите внимание на режим
### Сжатие строк прямо на лету
А если не хочется возиться с файлами? Можно сжимать и разжимать просто строки:
## Когда использовать gzip?
- Архивация логов
- Хранение больших дампов данных
- Экономия места при передаче данных по сети
## Особенности
-
- В Python 3.2+ поддерживается чтение/запись как текстовых файлов через параметры
Вот так просто можно сберечь место и время! Экспериментируйте с разными уровнями компрессии и находите баланс между скоростью и размером файла. 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
Привет! Сегодня поговорим о том, как эффективно использовать возможности процессора в Python с помощью модуля
---
## Зачем оптимизировать CPU-ресурсы?
В современных компьютерах часто несколько ядер CPU, каждое способно выполнять свои задачи одновременно. Однако классический Python-код, особенно если он однопоточный, использует лишь одно ядро. Чтобы выйти из этого ограничения, нужно распараллелить задачи.
Модуль
---
## Когда использовать ProcessPoolExecutor?
Важно понимать, что в Python срабатывает GIL (Global Interpreter Lock), который не даёт потокам параллельно работать с CPU. Поэтому для тяжёлых вычислений лучше использовать
В свою очередь,
---
## Пример: ускоряем подсчёт факториала нескольких чисел
Посмотрим на пример, где нам нужно посчитать факториалы для множества больших чисел. Обычный цикл будет работать долго, а мы попробуем распараллелить процесс.
Обратите внимание, что при запуске этого кода на вашем компьютере время работы с
---
## Полезные советы для оптимизации
1. Выбирайте правильный executor. Для CPU-bound —
2. Настраивайте число процессов. По умолчанию
3. Не передавайте большие объёмы данных между процессами. Копирование данных между процессами — дорогая операция. Лучше вычислять что-то локально в каждом процессе.
4. Используйте
---
Освойте этот модуль — и ваши ресурсоёмкие задачи не будут тянуть вас назад! Удачи в кодинге!
— Иван
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
Привет! С вами Иван, и сегодня мы разберём один из часто недооценённых модулей Python —
## tempфайловое Королевство
Часто в процессе работы программы требуется где-то «прилечь» временным данным: сохранить промежуточные результаты, обработать большой кусок информации или просто протестировать что-то на лету, не создавая мусор в рабочей директории. Вот где на сцену выходит
### Временные файлы: просто и безопасно
Вручную создавать, чистить, удалять временные файлы и папки — занятие неблагодарное.
Этот способ отлично подходит, если временный файл не должен быть виден в системе (например, для тестов или парсинга).
### Имя файла нужно?
Иногда программам нужно работать с реальным файлом на диске, используя его имя (например, передать во внешний процесс):
Здесь файл доступен по имени
### Временные папки
Программа генерирует пачку разных файлов? Тогда тебе пригодится временный каталог:
### Безопасность и кроссплатформенность
### Где это реально полезно?
- Тестирование: не засорять проект лишними файлами;
- Работа с внешними библиотеками (например, форматирование документов через сторонние утилиты);
- Обработка Medium/Large data «на лету», чтобы не держать всё в памяти.
Вот такой незаметный, но суперполезный модуль. Экономит нервы и помогает писать аккуратный код. Подключай
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
Привет, друзья! С вами снова Иван, и сегодня мы погрузимся в мир веселого и интерактивного программирования на Python с помощью модуля turtle. Turtle – это практически встроенный художник для начинающих программистов. Он отлично помогает освоить базовые концепции программирования через творчество. Давайте вместе создадим несколько интерактивных проектов, которые заставят ваш код «ожить».
### Первая интерактивность: управляй черепашкой
Для начала – классика: научим пользователя управлять черепашкой при помощи клавиш. Такой подход отлично знакомит с работой событий и функцией обратного вызова (
Жмите стрелки — и наблюдайте, как черепашка послушно перемещается по экрану! Это минимальный, но очень показательный пример управления объектом.
### Рисуем, куда кликаем
А как насчёт превращения вашего кода в простейшее рисовальное приложение? Turtle позволяет реагировать на клики мышки!
Теперь каждый клик по экрану будет оставлять след — отпечаток вашей черепашки в указанном месте.
### Игра для начинающих: собираем звёзды
Давайте сделаем небольшую игру — ловим звёзды! Пусть черепашка двигается к месту клика и «собирает» звёздочку.
Теперь каждый клик — это попытка «поймать» улетающую звезду, а основа следующей игры уже готова. Такие эксперименты отлично развивают алгоритмическое мышление и интерес к Python.
### Итоги
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
Привет! Меня зовут Иван, и сегодня я открою вам дверь в мир геоданных на Python. Готовы к путешествию? Ведь GeoJSON — это ваш электронный компас для работы с координатами, картами и информацией о мире вокруг!
## Что такое GeoJSON?
GeoJSON — это формат для хранения и передачи данных о географических объектах. Всё, что связано с точками на карте (например, местоположения кафе, маршруты дорог или границы парков), часто хранится именно в нем.
В основе GeoJSON лежат обычные структуры JSON, что делает его простым для чтения, понимания и — самое главное для нас — обработки на Python.
## Базовая работа с GeoJSON
Для начала стоит познакомиться с модулем
Давайте разберём простой пример: у нас есть GeoJSON-файл с точками интереса (POI), и мы хотим получить координаты всех этих мест.
Теперь мы можем легко вытащить из файла всю нужную информацию!
## Создаем GeoJSON сами
Своими руками создавать такие данные тоже просто:
Этот код создаст файл с одной точкой — например, Красной площадью.
## Валидация геоданных
GeoJSON допускает ошибки — но библиотека geojson умеет валидировать объекты:
## Не только чтение, но и визуализация!
Для быстрой визуализации можно использовать folium:
Готово — у вас есть интерактивная карта на HTML!
---
GeoJSON — это отличный способ научиться работать с пространственными данными на Python. Простота формата, множество библиотек и лёгкость интеграции превращают его в швейцарский нож для начинающих геокодеров. Успехов в ваших гео-экспедициях!
## Что такое 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, и зачем вообще программам нужны сигналы!
## Что такое сигналы?
Сигналы — это особый способ общения между процессами и операционной системой. Когда, например, вы нажимаете Ctrl+C во время работы скрипта, Python получает сигнал SIGINT. Представьте, что сигнал — это выстрел: его ловит программа, если знает, как это сделать, или падает, если не знает.
## Meet the signal!
В Python есть стандартный модуль
### Простейший пример
Пусть мы хотим аккуратно завершать скрипт по Ctrl+C:
Здесь мы ловим SIGINT (тот самый Ctrl+C) и обрабатываем его: печатаем сообщение и завершаемся красиво, а не резко.
### Сигналы-таймеры (SIGALRM)
Signal бывает полезен не только для Ctrl+C! Например, можно отправлять самому себе сигнал-таймер — это удобно, если хочется дать функции ограниченное время на выполнение.
Этот код выводит сообщение ровно через 3 секунды! Очень удобно для создания таймаутов.
### Важно!
- На Windows поддерживаются не все типы сигналов (например, SIGALRM не работает).
- signal работает только в главном потоке (main thread).
## Как ещё это можно использовать?
Можно ловить сигналы завершения (SIGTERM), чтобы сохранять важные данные перед смертью процесса, либо реализовать долгоживущие сервисы с аккуратным завершением.
Модуль 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