Привет! Я — Иван, и сегодня приглашаю погрузиться в магию работы с Excel-файлами через Python с помощью библиотеки openpyxl. Excel для программиста — как волшебная тетрадь с секретами: большие таблицы, автоотчеты и автоматизация рутины. Давайте посмотрим, как легко приручить этот мощный инструмент!
1. Открываем книгу Excel и читаем данные
openpyxl позволяет читать и работать с файлами
Вот так просто можно получить первые три строки вашей таблицы и увидеть их содержимое.
2. Создаем и наполняем файл Excel
Создать новый Excel-файл — проще простого. Добавим пару строк данных «на лету»:
Здорово, правда? Таблицы с отчетами теперь можно генерировать автоматически.
3. Форматирование ячеек: цвета и стили
Рутина без красоты — скучна. В openpyxl можно добавлять стили, чтобы выделить важные данные.
Теперь ваша «шапка» таблицы засияет как положено!
4. Итог
openpyxl — это гибкий инструмент для работы с Excel внутри Python. Он экономит время, автоматизирует рутину, а возможности форматирования делают ваши отчеты по-настоящему профессиональными. Главное — не бойтесь экспериментировать! Даже если не любите таблички, с openpyxl они становятся подatливой частью ваших проектов.
До встречи в новых постах, ваш Иван!
1. Открываем книгу Excel и читаем данные
openpyxl позволяет читать и работать с файлами
.xlsx
словно они обычные списки или словари. Начнем с простого: откроем файл, заглянем на первый лист и прочитаем пару строк.from openpyxl import load_workbook
workbook = load_workbook('example.xlsx')
sheet = workbook.active # Получаем первый лист
for row in sheet.iter_rows(min_row=1, max_row=3, values_only=True):
print(row)
Вот так просто можно получить первые три строки вашей таблицы и увидеть их содержимое.
2. Создаем и наполняем файл Excel
Создать новый Excel-файл — проще простого. Добавим пару строк данных «на лету»:
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet['A1'] = 'Name'
sheet['B1'] = 'Score'
sheet.append(['Alice', 90])
sheet.append(['Bob', 82])
workbook.save('new_report.xlsx')
Здорово, правда? Таблицы с отчетами теперь можно генерировать автоматически.
3. Форматирование ячеек: цвета и стили
Рутина без красоты — скучна. В openpyxl можно добавлять стили, чтобы выделить важные данные.
from openpyxl.styles import Font, PatternFill
sheet['A1'].font = Font(bold=True, color="FFFFFF")
sheet['A1'].fill = PatternFill(start_color="4F81BD", end_color="4F81BD", fill_type = "solid")
Теперь ваша «шапка» таблицы засияет как положено!
4. Итог
openpyxl — это гибкий инструмент для работы с Excel внутри Python. Он экономит время, автоматизирует рутину, а возможности форматирования делают ваши отчеты по-настоящему профессиональными. Главное — не бойтесь экспериментировать! Даже если не любите таблички, с openpyxl они становятся подatливой частью ваших проектов.
До встречи в новых постах, ваш Иван!
Привет! На связи Иван, и сегодня говорим о том, как держать свои сетевые операции под контролем даже тогда, когда интернет ведет себя, мягко говоря, не идеально. Представляю вам замечательный Python-модуль — backoff.
## Почему именно backoff?
Сетевые запросы — это почти всегда зона риска: сервер не ответил, интернет отвалился, ошибка тайм-аута... В такой ситуации хочется, чтобы программа не падала с криками, а спокойно попробовала еще раз и справилась сама.
Здесь-то и приходит на помощь backoff — маленький, но мощный помощник для автоматического повторения операций с задержками (и увеличением этих задержек после неудачи, если потребуется).
## Быстрое знакомство
Установить backoff можно так:
Представим, что у нас есть функция, которая тянет данные с внешнего API:
А теперь магия! С помощью backoff превращаем это в устойчивый к сбоям вызов:
Теперь при ошибке запроса будет предпринято до 5 попыток с увеличивающейся задержкой между ними (exponential backoff: 1, 2, 4, 8 сек...).
## Когда это особенно полезно?
- Интеграции с ненадежными внешними API
- Микросервисы в облаке
- Скачивание файлов
- Любые случаи, когда «падать» неудобно
## Индивидуальные настройки
Вы можете тонко управлять поведением backoff — например, отреагировать только на определённые коды ответа:
## Итог
backoff — отличный инструмент для тех, кто делает Python-программы «с характером» и не хочет бояться временных сетевых проблем. Он легко интегрируется, конфигурируется на любой вкус и просто спасает в критические моменты. Если хотите писать надежный код — попробуйте backoff в деле!
## Почему именно backoff?
Сетевые запросы — это почти всегда зона риска: сервер не ответил, интернет отвалился, ошибка тайм-аута... В такой ситуации хочется, чтобы программа не падала с криками, а спокойно попробовала еще раз и справилась сама.
Здесь-то и приходит на помощь backoff — маленький, но мощный помощник для автоматического повторения операций с задержками (и увеличением этих задержек после неудачи, если потребуется).
## Быстрое знакомство
Установить backoff можно так:
pip install backoff
Представим, что у нас есть функция, которая тянет данные с внешнего API:
import requests
def fetch_data():
response = requests.get('https://api.example.com/data')
response.raise_for_status()
return response.json()
А теперь магия! С помощью backoff превращаем это в устойчивый к сбоям вызов:
import backoff
@backoff.on_exception(backoff.expo, requests.exceptions.RequestException, max_tries=5)
def fetch_data():
response = requests.get('https://api.example.com/data')
response.raise_for_status()
return response.json()
Теперь при ошибке запроса будет предпринято до 5 попыток с увеличивающейся задержкой между ними (exponential backoff: 1, 2, 4, 8 сек...).
## Когда это особенно полезно?
- Интеграции с ненадежными внешними API
- Микросервисы в облаке
- Скачивание файлов
- Любые случаи, когда «падать» неудобно
## Индивидуальные настройки
Вы можете тонко управлять поведением backoff — например, отреагировать только на определённые коды ответа:
@backoff.on_predicate(backoff.expo, lambda r: r.status_code != 200, max_time=30)
def fetch_status():
return requests.get('https://status.example.com/check')
## Итог
backoff — отличный инструмент для тех, кто делает Python-программы «с характером» и не хочет бояться временных сетевых проблем. Он легко интегрируется, конфигурируется на любой вкус и просто спасает в критические моменты. Если хотите писать надежный код — попробуйте backoff в деле!
👍1
Привет! На связи Иван — сегодня поговорим о тестировании кода в Python с помощью библиотеки pytest. Современный программист не может позволить себе писать код без тестов — баги стоят времени, денег и, иногда, нервов. Разберёмся, что делает pytest таким удобным для модульного тестирования, и как легко организовать процесс проверки вашего кода.
Прежде всего, установка:
Представим, у нас есть простой модуль
Теперь создадим файл тестов — по традиции, его имя начинается с
Pytest автоматически найдёт функции, начинающиеся на
Вы сразу увидите лаконичный и понятный отчёт: миновала функция тест или нет, почему провалена, если что-то пошло не так. Деталь — если вы ждёте ошибку, используйте конструкцию
Pytest поддерживает параметризацию, благодаря чему можно протестировать одну функцию сразу на разных данных:
Преимущества pytest: он прост в начале, поддерживает гибкие возможности для сложных сценариев (фикстуры, плагины), а отчёты легко читать. Даже если ваш проект вырастет — pytest масштабируется без боли.
Мои лайфхаки: держите тесты в отдельной папке
Тестируйте свой Python-код, и он отблагодарит вас стабильностью!
Прежде всего, установка:
pip install pytest
Представим, у нас есть простой модуль
calculator.py
:def add(a, b):
return a + b
def divide(a, b):
return a / b
Теперь создадим файл тестов — по традиции, его имя начинается с
test_
. Пусть это будет test_calculator.py
:from calculator import add, divide
def test_add():
assert add(3, 2) == 5
def test_divide():
assert divide(10, 2) == 5
Pytest автоматически найдёт функции, начинающиеся на
test_
, и выполнит их. Запуск:pytest
Вы сразу увидите лаконичный и понятный отчёт: миновала функция тест или нет, почему провалена, если что-то пошло не так. Деталь — если вы ждёте ошибку, используйте конструкцию
pytest.raises
:import pytest
from calculator import divide
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
divide(5, 0)
Pytest поддерживает параметризацию, благодаря чему можно протестировать одну функцию сразу на разных данных:
import pytest
from calculator import add
@pytest.mark.parametrize("a, b, expected", [
(1, 1, 2),
(5, 2, 7),
(0, -1, -1),
])
def test_add_various(a, b, expected):
assert add(a, b) == expected
Преимущества pytest: он прост в начале, поддерживает гибкие возможности для сложных сценариев (фикстуры, плагины), а отчёты легко читать. Даже если ваш проект вырастет — pytest масштабируется без боли.
Мои лайфхаки: держите тесты в отдельной папке
tests/
, запускайте их автоматом после каждого коммита, и никогда не игнорируйте красные строки — баги надо исправлять сразу.Тестируйте свой Python-код, и он отблагодарит вас стабильностью!
👍1
Привет! С вами Иван, и сегодня я расскажу о приемах управления контекстами выполнения в асинхронном Python с помощью asynccontextmanager. Если вы когда-нибудь хотели элегантно управлять ресурсами во время выполнения асинхронного кода, эта тема для вас!
## Немного о контекстах
Классический контекстный менеджер (
## asynccontextmanager — ваш друг
Модуль
### Пример: асинхронная блокировка
Рассмотрим пример, где мы хотим управлять семафором для ограничения числа одновременных задач:
В этом коде мы создали элегантный асинхронный менеджер, который гарантирует освобождение ресурса даже при ошибках.
## Как это работает?
-
- До
- После
### Асинхронные файлы
А если нам нужно работать с файлами (например, через aiofiles)? Можно обернуть открытие файла в ваш асинхронный контекст:
## Вывод
С помощью
## Немного о контекстах
Классический контекстный менеджер (
with ...:
) позволяет безопасно работать с файлами, сокетами и другими ресурсами. Казалось бы — зачем нам что-то еще? А вот зачем: когда мы ныряем в мир асинхронности (async/await), обычный with
становится бесполезен — тут требуется свой асинхронный вариант.## asynccontextmanager — ваш друг
Модуль
contextlib
из стандартной библиотеки с версии Python 3.7 предлагает декоратор @asynccontextmanager
. Он позволяет создавать асинхронные контекстные менеджеры без необходимости писать полноценные классы.### Пример: асинхронная блокировка
Рассмотрим пример, где мы хотим управлять семафором для ограничения числа одновременных задач:
import asyncio
from contextlib import asynccontextmanager
@asynccontextmanager
async def acquire_semaphore(semaphore):
await semaphore.acquire()
try:
yield
finally:
semaphore.release()
async def limited_task(semaphore):
async with acquire_semaphore(semaphore):
print("Resource acquired")
await asyncio.sleep(1)
print("Resource released")
async def main():
sem = asyncio.Semaphore(2)
await asyncio.gather(*(limited_task(sem) for _ in range(4)))
asyncio.run(main())
В этом коде мы создали элегантный асинхронный менеджер, который гарантирует освобождение ресурса даже при ошибках.
## Как это работает?
-
@asynccontextmanager
делает функцию генератором с асинхронной поддержкой.- До
yield
выполняется код инициализации (например, получение блокировки).- После
yield
— освобождение ресурса (release, закрытие файла, отключение соединения и др.).### Асинхронные файлы
А если нам нужно работать с файлами (например, через aiofiles)? Можно обернуть открытие файла в ваш асинхронный контекст:
import aiofiles
from contextlib import asynccontextmanager
@asynccontextmanager
async def open_async_file(file_path, mode):
file = await aiofiles.open(file_path, mode)
try:
yield file
finally:
await file.close()
async def read_file():
async with open_async_file("example.txt", "r") as f:
content = await f.read()
print(content)
## Вывод
С помощью
@asynccontextmanager
вы пишете лаконичный, читаемый и безопасный асинхронный код, не боясь утечек ресурсов даже при возникновении исключений. Попробуйте интегрировать его в свои проекты — и асинхронная жизнь станет проще!👍2
Привет! Я Иван, программист, и сегодня расскажу, как можно анализировать и даже кластеризовать текст с помощью Python и магического инструмента — библиотеки scikit-learn (sklearn). Это будет идеальный первый шаг, если вы хотите автоматизировать обработку отзывов, статей или любой другой текстовой информации.
## 1. Векторизация текста
Компьютеры любят числа! Нас же интересуют буквы, слова и тексты. Чтобы машинке было понятнее, переводим текст в числовой вид с помощью
Теперь каждый документ — это вектор из чисел, где каждое число отражает важность определенного слова.
## 2. Кластеризация: учим машину находить похожее
Допустим, у нас куча текстов, и надо понять — какие из них говорят об одном и том же. Для этого идеально подходит KMeans:
Каждому тексту присваивается номер кластера — теперь похожие тексты собраны вместе!
## 3. Мини-применение
Посмотрим, как распределились наши тексты:
Теперь вы знаете, как можно быстро превратить тексты в числа, и даже найти в них скрытые группы! Модули
Творите с Python — и пусть тексты больше не будут "тёмным лесом"!
## 1. Векторизация текста
Компьютеры любят числа! Нас же интересуют буквы, слова и тексты. Чтобы машинке было понятнее, переводим текст в числовой вид с помощью
CountVectorizer
или TfidfVectorizer
.from sklearn.feature_extraction.text import TfidfVectorizer
texts = [
"Python is easy to learn",
"Python and sklearn are powerful",
"Data science is fun"
]
vectorizer = TfidfVectorizer()
features = vectorizer.fit_transform(texts)
print(features.shape) # (3, 8): 3 документа, 8 уникальных слов
Теперь каждый документ — это вектор из чисел, где каждое число отражает важность определенного слова.
## 2. Кластеризация: учим машину находить похожее
Допустим, у нас куча текстов, и надо понять — какие из них говорят об одном и том же. Для этого идеально подходит KMeans:
from sklearn.cluster import KMeans
num_clusters = 2
kmeans = KMeans(n_clusters=num_clusters, random_state=42)
kmeans.fit(features)
print(kmeans.labels_) # Например: [0 0 1]
Каждому тексту присваивается номер кластера — теперь похожие тексты собраны вместе!
## 3. Мини-применение
Посмотрим, как распределились наши тексты:
for idx, label in enumerate(kmeans.labels_):
print(f"Text: '{texts[idx]}' — Cluster: {label}")
Теперь вы знаете, как можно быстро превратить тексты в числа, и даже найти в них скрытые группы! Модули
TfidfVectorizer
и KMeans
— отличный старт для анализа текстов: они просты в использовании, но мощные по возможностям.Творите с Python — и пусть тексты больше не будут "тёмным лесом"!
👍2
Привет! С вами Иван, и сегодня мы будем говорить о создании собственной сетевой "классной комнаты" с помощью Python и могучего Jitsi API. Если вы не слышали о Jitsi — это бесплатная и открытая платформа для видеоконференций, которую можно интегрировать в свой проект буквально "на коленке". А ведь сколько возможностей открывается: онлайн-уроки, дистанционные кружки, даже занятия английским по вечерам!
Jitsi: Видеозвонки из Python
Jitsi не имеет нативного Python SDK, но у него есть REST API и iframe интеграция. Самый простой путь — создавать "комнаты" и управлять ими через web-интерфейс Jitsi Meet, генерируя ссылки через Python.
### Создаём комнату и отправляем приглашение
Допустим, вам нужно создать виртуальный класс для учеников:
Этот код генерирует уникальное имя класса и выдаёт ссылку. Осталось только отправить её ученикам — хоть по email, хоть через чат-бота!
### Добавляем управление через API
А вот пример запроса к Jitsi Videobridge для получения статистики о комнатах (необходима авторизация):
Используя такие запросы, можно отслеживать загруженность сервера: если классов стало слишком много — поднимаем ещё один инстанс.
### Встраиваем Jitsi в веб-приложение
Jitsi легко добавляется на сайт через iframe. Python-проекты на Flask или Django могут генерировать HTML-шаблон с вашей уникальной комнатой:
Подставьте в
Вывод:
С помощью пары строк Python и мощи Jitsi можно быстро настроить интерактивные уроки, не разбираясь в сложных API и видеостримах. Экспериментируйте, и пусть ваши виртуальные классы всегда будут полны энтузиазма!
Jitsi: Видеозвонки из Python
Jitsi не имеет нативного Python SDK, но у него есть REST API и iframe интеграция. Самый простой путь — создавать "комнаты" и управлять ими через web-интерфейс Jitsi Meet, генерируя ссылки через Python.
### Создаём комнату и отправляем приглашение
Допустим, вам нужно создать виртуальный класс для учеников:
import random
import string
def generate_room_name(length=10):
chars = string.ascii_lowercase + string.digits
return ''.join(random.choices(chars, k=length))
room_name = generate_room_name()
jitsi_url = f"https://meet.jit.si/{room_name}"
print("Classroom link:", jitsi_url)
Этот код генерирует уникальное имя класса и выдаёт ссылку. Осталось только отправить её ученикам — хоть по email, хоть через чат-бота!
### Добавляем управление через API
А вот пример запроса к Jitsi Videobridge для получения статистики о комнатах (необходима авторизация):
import requests
server = "https://your-jitsi-server.com"
stats_url = f"{server}/colibri/stats"
response = requests.get(stats_url, auth=('user', 'password'))
print(response.json())
Используя такие запросы, можно отслеживать загруженность сервера: если классов стало слишком много — поднимаем ещё один инстанс.
### Встраиваем Jitsi в веб-приложение
Jitsi легко добавляется на сайт через iframe. Python-проекты на Flask или Django могут генерировать HTML-шаблон с вашей уникальной комнатой:
<iframe allow="camera; microphone; fullscreen; display-capture"
src="https://meet.jit.si/{{ room }}"
style="height: 500px; width: 100%;"></iframe>
Подставьте в
{{ room }}
имя, которое сгенерировал ваш Python-скрипт — и ваша собственная видеоклассная комната готова!Вывод:
С помощью пары строк Python и мощи Jitsi можно быстро настроить интерактивные уроки, не разбираясь в сложных API и видеостримах. Экспериментируйте, и пусть ваши виртуальные классы всегда будут полны энтузиазма!
❤2
Привет, друзья! На связи Иван — сегодня поговорим о магии управления состоянием пользователей в Python с помощью session-объектов.
### Сессии: что это вообще такое?
Когда пользователь взаимодействует с веб-приложением, серверу часто нужно "помнить", кто этот пользователь и что он делал минуту назад. Именно в этом случае на сцену выходят session-объекты: они позволяют сохранить состояние между запросами, создавая иллюзию постоянного соединения клиента с сервером.
### Flask и сессии
Один из самых простых способов работы с сессиями в Python — использовать микрофреймворк Flask. Здесь сессии реализованы очень удобно:
Здесь благодаря
### Requests и cookies
Если вам нужно управлять состоянием не на сервере, а в клиенте (например, писать бота для сайта), пригодится модуль
Сессия позволяет использовать одни и те же cookies для всех запросов, сразу открывая большие возможности для автоматизации.
### На что обратить внимание:
- Всегда храните секретные ключи вне кода!
- Сессии — не лучший способ хранить крупные объекты или большие объемы данных.
- Удалять данные из session можно с помощью
### Итоги
Сессии — это сердце любого сложного веб-приложения: без них ни аутентификацию, ни корзину покупок реализовать не получится. Используйте возможности Flask и requests на полную катушку, не забывая о безопасности. Удачного кодинга!
### Сессии: что это вообще такое?
Когда пользователь взаимодействует с веб-приложением, серверу часто нужно "помнить", кто этот пользователь и что он делал минуту назад. Именно в этом случае на сцену выходят session-объекты: они позволяют сохранить состояние между запросами, создавая иллюзию постоянного соединения клиента с сервером.
### Flask и сессии
Один из самых простых способов работы с сессиями в Python — использовать микрофреймворк Flask. Здесь сессии реализованы очень удобно:
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
app.secret_key = 'super_secret_key' # Необходима для криптографии!
@app.route('/login', methods=['POST'])
def login():
user = request.form['username']
session['username'] = user
return redirect(url_for('profile'))
@app.route('/profile')
def profile():
if 'username' in session:
return f"Hello, {session['username']}!"
return 'You are not logged in.'
# Для запуска: app.run()
Здесь благодаря
session['username']
сохранится имя пользователя, и при следующем запросе сервер быстро узнает, кто к нему пришел.### Requests и cookies
Если вам нужно управлять состоянием не на сервере, а в клиенте (например, писать бота для сайта), пригодится модуль
requests
. В нем есть Session
-объект, который автоматически сохраняет cookies:import requests
s = requests.Session()
login_payload = {'user': 'bob', 'password': 'qwerty'}
s.post('https://example.com/login', data=login_payload)
resp = s.get('https://example.com/profile')
print(resp.text) # Профиль Bob'а, если логин успешен!
Сессия позволяет использовать одни и те же cookies для всех запросов, сразу открывая большие возможности для автоматизации.
### На что обратить внимание:
- Всегда храните секретные ключи вне кода!
- Сессии — не лучший способ хранить крупные объекты или большие объемы данных.
- Удалять данные из session можно с помощью
session.pop('key', None)
или session.clear()
.### Итоги
Сессии — это сердце любого сложного веб-приложения: без них ни аутентификацию, ни корзину покупок реализовать не получится. Используйте возможности Flask и requests на полную катушку, не забывая о безопасности. Удачного кодинга!
👍2
Привет, с вами Иван! Сегодня разберём интересную тему — как написать свой собственный лексический анализатор (lexer) на Python, используя модуль re. Это умение полезно, если вы хотите понять, как работают языки программирования изнутри или написать парсер для небольшого языка.
## Немного теории
Лексический анализатор — это инструмент, который разбивает текст на “токены”: числа, идентификаторы, слова, спецсимволы и т.д. Например, строку
Модуль re (regular expressions) делает этот процесс максимально простым и лаконичным.
## Делаем свой мини-лексер
Рассмотрим пример — напишем лексер для простых арифметических выражений (числа, знаки операций, скобки):
Давайте проверим на практике:
Результат:
## Как это работает?
- Для каждого токена задаём регулярное выражение.
- re.finditer проходит по всей строке, находя совпадения с шаблонами.
- Если токен — пробел или таб, пропускаем его. Если неизвестный символ — бросаем ошибку.
С помощью такой конструкции вы легко можете добавить новые типы токенов или немного сложнее изменить правила языка.
## Заключение
Создавать лексеры на Python просто — достаточно комбинировать немного re и креативности. Это отличный эксперимент для углубления знаний о языках и внутренних механизмах их работы!
На связи, Иван.
## Немного теории
Лексический анализатор — это инструмент, который разбивает текст на “токены”: числа, идентификаторы, слова, спецсимволы и т.д. Например, строку
x = 5 + y
лексер превращает в список токенов: имя, знак равно, число, плюс, имя.Модуль re (regular expressions) делает этот процесс максимально простым и лаконичным.
## Делаем свой мини-лексер
Рассмотрим пример — напишем лексер для простых арифметических выражений (числа, знаки операций, скобки):
import re
# Описываем типы токенов и шаблоны для них
token_spec = [
("NUMBER", r'\d+(\.\d*)?'), # целое или дробное число
("IDENT", r'[A-Za-z_]\w*'), # идентификатор
("PLUS", r'\+'), # плюс
("MINUS", r'-'), # минус
("MULT", r'\*'), # умножение
("DIV", r'/'), # деление
("LPAREN", r'\('), # левая скобка
("RPAREN", r'\)'), # правая скобка
("SKIP", r'[ \t]+'), # пропускаем пробелы и табы
("MISMATCH", r'.'), # неизвестный символ — ошибка
]
token_regex = '|'.join(f'(?P<{name}>{pattern})' for name, pattern in token_spec)
def tokenize(code):
for match in re.finditer(token_regex, code):
kind = match.lastgroup
value = match.group()
if kind == "SKIP":
continue
elif kind == "MISMATCH":
raise RuntimeError(f"Unexpected character: {value}")
yield (kind, value)
Давайте проверим на практике:
expr = "a1 = 3.5 + (b2 - 7) * 4"
tokens = list(tokenize(expr))
print(tokens)
Результат:
[('IDENT', 'a1'), ('MISMATCH', '='), ('NUMBER', '3.5'), ('PLUS', '+'),
('LPAREN', '('), ('IDENT', 'b2'), ('MINUS', '-'), ('NUMBER', '7'),
('RPAREN', ')'), ('MULT', '*'), ('NUMBER', '4')]
## Как это работает?
- Для каждого токена задаём регулярное выражение.
- re.finditer проходит по всей строке, находя совпадения с шаблонами.
- Если токен — пробел или таб, пропускаем его. Если неизвестный символ — бросаем ошибку.
С помощью такой конструкции вы легко можете добавить новые типы токенов или немного сложнее изменить правила языка.
## Заключение
Создавать лексеры на Python просто — достаточно комбинировать немного re и креативности. Это отличный эксперимент для углубления знаний о языках и внутренних механизмах их работы!
На связи, Иван.