Python для начинающих
Open in Telegram
1 242
Subscribers
+124 hours
+37 days
+230 days
Posts Archive
Если вы когда-либо хотели дать своим пользователям доступ к сервисам вроде Google, GitHub или Facebook, не заставляя их вбивать пароли — добро пожаловать в мир OAuth.
OAuth (Open Authorization) — это стандарт авторизации, который позволяет получать ограниченный доступ к защищённым ресурсам без передачи логина и пароля. Звучит круто? Ещё бы. И сегодня мы посмотрим, как реализовать OAuth-аутентификацию на Python, используя библиотеку Authlib — одна из самых простых и эффективных для этой задачи.
📦 Установка библиотек:
pip install Authlib Flask
Мы будем строить небольшой Flask-сервер, через который пользователь сможет авторизоваться через, например, GitHub.
⚙️ Базовая настройка Flask и OAuth-клиента
from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth
app = Flask(__name__)
app.secret_key = 'your-secret-key'
oauth = OAuth(app)
github = oauth.register(
name='github',
client_id='GITHUB_CLIENT_ID',
client_secret='GITHUB_CLIENT_SECRET',
access_token_url='https://github.com/login/oauth/access_token',
authorize_url='https://github.com/login/oauth/authorize',
api_base_url='https://api.github.com/',
client_kwargs={'scope': 'user:email'},
)
Вам нужно будет взять значения client_id и client_secret в настройках своего GitHub OAuth-приложения.
🌐 Маршруты Flask:
@app.route('/')
def homepage():
return '<a href="/login">Login with GitHub</a>'
@app.route('/login')
def login():
redirect_uri = url_for('authorize', _external=True)
return github.authorize_redirect(redirect_uri)
@app.route('/authorize')
def authorize():
token = github.authorize_access_token()
resp = github.get('user', token=token)
user_info = resp.json()
session['user'] = user_info
return f"Hello, {user_info['login']}!"
🔐 Что происходит:
1. Пользователь заходит на /login.
2. Перебрасывается на страницу авторизации GitHub.
3. После логина возвращается на /authorize.
4. Приложение получает access token и может запрашивать данные.
Теперь, не зная паролей пользователей, мы получаем информацию о них. Максимально безопасно. А если access token протухнет — можно запросить новый, не беспокоя пользователя.
🧠 Полезный совет:
Храните client_id и client_secret не в коде, а в переменных окружения:
import os
client_id = os.getenv('GITHUB_CLIENT_ID')
client_secret = os.getenv('GITHUB_CLIENT_SECRET')
🔄 А если нужен другой провайдер? Просто поменяйте ссылки и scopes. Authlib поддерживает Google, Facebook, Twitter и даже кастомные OAuth-провайдеры.
В целом, настройка OAuth через Authlib не такая уж и страшная, как может показаться на первый взгляд. Зато какой уровень удобства и безопасности! Если ваше приложение хоть как-то связано с пользователями — OAuth точно стоит освоить.Привет! Сегодня я расскажу тебе о том, как эффективно работать с JSON-LD в Python с помощью библиотеки RDFLib. Звучит академично? А на деле — это практичный инструмент, если ты хочешь работать с семантическими данными, структурированными знаниями и файлами, которые часто встречаются в современных API и открытых данных.
🎯 Немного теории: JSON-LD (JSON for Linking Data) — это способ сериализации Linked Data в формате JSON. Используется для представления семантической информации: описания сущностей, связей между ними и контекста. Обычно это можно встретить в open data от правительств, научных институтов, Википедии (через Wikidata) и в структурированных данных на сайтах.
А теперь самое интересное — практика.
📦 RDFLib — это мощная Python-библиотека для работы с RDF-графами. Она поддерживает различные форматы (Turtle, XML, JSON-LD и другие), позволяет парсить, сериализовать RDF и выполнять запросы SPARQL.
Установим библиотеку:
pip install rdflib
🛠️ Представим, что у нас есть следующий JSON-LD документ:
{
"@context": {
"name": "http://schema.org/name",
"homepage": { "@id": "http://schema.org/url", "@type": "@id" }
},
"@id": "http://example.org/person#me",
"name": "Ivan Petrov",
"homepage": "http://example.org/"
}
Давайте загрузим и обработаем его с помощью RDFLib:
from rdflib import Graph
jsonld_data = '''
{
"@context": {
"name": "http://schema.org/name",
"homepage": { "@id": "http://schema.org/url", "@type": "@id" }
},
"@id": "http://example.org/person#me",
"name": "Ivan Petrov",
"homepage": "http://example.org/"
}
'''
g = Graph()
g.parse(data=jsonld_data, format='json-ld')
for subj, pred, obj in g:
print(f"{subj} -- {pred} --> {obj}")
Вывод будет примерно такой:
http://example.org/person#me -- http://schema.org/url --> http://example.org/ http://example.org/person#me -- http://schema.org/name --> Ivan Petrov🎯 Что здесь важно? RDFLib превращает JSON-LD в RDF-граф, с которым ты можешь работать с той же легкостью, что и с обычным Python-объектом. 🔍 Запросы к данным? Легко, с помощью SPARQL:
from rdflib.namespace import Namespace
SCHEMA = Namespace("http://schema.org/")
query = """
SELECT ?name
WHERE {
?person <http://schema.org/name> ?name .
}
"""
qres = g.query(query)
for row in qres:
print(row.name)
Вывод:
Ivan PetrovДа, это похоже на SQL, только графовый стиль. Такой подход особенно хорошо себя проявляет, когда ты работаешь с большими онтологиями или данными из Wikidata. 💡 Совет: RDFLib поддерживает сериализацию обратно в JSON-LD, Turtle и другие форматы. То есть можно использовать её как конвертер:
print(g.serialize(format="json-ld", indent=2))
📌 Такой фреймворк делает Python удобной средой для работы с современными структурированными данными, где важны не только значения, но и связи между ними.
Надеюсь, теперь JSON-LD и RDFLib звучат не как абстрактные академические термины, а как инструменты, которые реально можно и нужно использовать. Experiment, explore, и пусть граф знаний будет с тобой!Если вы когда-нибудь задумывались, как превратить скрипт на Python в красивое и интерактивное веб-приложение, не вникая в HTML, CSS и JavaScript, то библиотека Dash — это то, что вам нужно. Она позволяет собирать интерактивные сайты с панелями управления (dashboards), графиками и формами буквально из нескольких строчек кода. Всё, что нужно — знание Python и немного фантазии.
Dash создана разработчиками Plotly, и в её основе — Flask, React.js и Plotly.js. Однако всё это скрыто за удобным API, который говорит с вами исключительно на Python.
Начнём с простого примера:
📦 Установка:
pip install dash
📈 Минимальное приложение:
import dash
from dash import html
app = dash.Dash(__name__)
app.layout = html.Div([
html.H1("Hello, Dash!"),
html.P("Build interactive web apps with pure Python.")
])
if __name__ == '__main__':
app.run_server(debug=True)
После запуска откройте в браузере http://127.0.0.1:8050 — и увидите вашу первую HTML-страницу, сгенерированную Python-кодом.
Но Dash действительно раскрывает свой потенциал, когда вы интегрируете графику и взаимодействие.
🎯 Добавим графики с Plotly:
import dash
from dash import dcc, html
import plotly.express as px
import pandas as pd
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
app = dash.Dash(__name__)
app.layout = html.Div(children=[
html.H1("Iris Data Visualization"),
dcc.Graph(
id='iris-graph',
figure=fig
)
])
if __name__ == '__main__':
app.run_server(debug=True)
Всё, что вы знали о графиках в Jupyter Notebook, теперь работает и в вебе. Идём дальше — добавим интерактивность.
🕹️ Используем callbacks:
from dash.dependencies import Input, Output
app.layout = html.Div([
dcc.Input(id='user-input', type='text', value='Dash', debounce=True),
html.H2(id='output')
])
@app.callback(
Output('output', 'children'),
Input('user-input', 'value')
)
def update_output(value):
return f'Hello, {value}!'
Теперь всё живое. Меняете текст — и приложение реагирует. Без JS и без боли. Это может быть input-поле, выпадающий список, слайдер и многое другое.
👨💻 Dash особенно полезен для аналитиков данных и инженеров, которым надо собрать визуальную панель или форму для управления расчётами, не отвлекаясь на фронтенд.
Бонус: всё, что вы делаете в Dash, может быть развёрнуто на любой платформе: от Heroku до Docker-контейнера.
📚 Полезно знать:
- dash.html — набор базовых HTML-компонентов
- dash.dcc — продвинутые компоненты: графики, слайдеры, dropdown
- @app.callback — магия, связывающая данные и визуал
Dash — это мост между анализом данных и веб-интерфейсом. Это Python-код, который оживает в браузере. Попробуйте — и удивитесь, как просто стало делать сложное.🚀 Как выстраивать непрерывную интеграцию и доставку (CI/CD) для Python-проектов
Когда проект только набирает обороты, неудобства типа "сломал продакшн", "забыл протестировать перед коммитом", "откатил вручную до прошлой версии" кажутся мелочами. Но чем больше кода — тем громче эти мелочи звучат. И вот тут на арену выходит CI/CD: непрерывная интеграция и доставка.
Что такое CI/CD?
- Continuous Integration (CI) — это процесс автоматической сборки и проверки кода при каждом коммите.
- Continuous Delivery (CD) — автоматическая доставка протестированного кода в staging или даже production.
Вместе они превращают “внезапный релиз” в “предсказуемое событие”.
Платформы: GitHub Actions, GitLab CI, CircleCI и др. Мы разберем GitHub Actions — мощный и удобный инструмент, прямо внутри GitHub.
📦 Структура Python-проекта
Типовая структура проекта:
my_project/
├── app/
│ └── main.py
├── tests/
│ └── test_main.py
├── requirements.txt
└── .github/
└── workflows/
└── ci.yml
Файл ci.yml — сердце нашего процесса CI.
🔧 Простой CI pipeline (GitHub Actions)
name: Python CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
pytest tests/
Что происходит:
- Workflow запускается на push или pull request в ветку main.
- На виртуальной машине ставится Python.
- Устанавливаются зависимости.
- Запускаются тесты с помощью pytest.
🛠️ Добавляем Code Quality: linters
Проверка стиля важна не меньше тестов.
- name: Run linter
run: |
pip install flake8
flake8 app/
Ошибка форматирования — fail pipeline. Чистота — залог стабильности.
🚢 Непрерывная доставка: CD
Допустим, у нас есть staging-сервер и GitHub уже подключен к нему через секреты (например, SSH-ключ, API token и т.д.). Ниже пример, как можно деплоить через SCP:
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy via SCP
run: scp -r ./app user@staging-host:/app-folder
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
Реализация зависит от вашего хостинга. Можно использовать Docker, Heroku, DigitalOcean, AWS — что угодно.
🔥 Бонус: кэш зависимостей
Чтобы ускорить pipeline:
- name: Cache pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
При повторном запуске зависимости не будут скачиваться заново — экономим минуты и нервы.
🎯 Вывод
CI/CD превращает ваш Python-проект из “хаоса” в “машину”, где каждый коммит — шаг вперед, а не на грабли. Даже простая автоматизация сборки и тестов — огромный шаг к качеству и стабильности. Начните с малого, добавляйте шаг за шагом. Пусть ваш код работает, пока вы спите!Как выстраивать непрерывную интеграцию и доставку (CI/CD) для Python проектов.
🚀 Быстрая обработка гигантских наборов данных с использованием библиотеки Vaex
Обработка миллионов строк данных за секунды — звучит как фантастика? Для pandas — возможно, но не факт. А вот для Vaex — это его стихия. В этом посте я расскажу о том, как справляться с большими объёмами данных с помощью библиотеки Vaex — легковесного и ультрабыстрого инструмента для анализа данных на Python.
🧠 Что такое Vaex?
Vaex — это библиотека для обработки больших табличных данных, созданная с фокусом на производительность. В отличие от pandas, она использует ленивые вычисления (lazy evaluation), memory-mapping и мультиядерные вычисления для обработки данных в десятки раз быстрее. Миллионы строк? Подумаешь. Даже миллиард — не предел.
Вот ключевые фишки Vaex:
- Обработка данных, которые не помещаются в оперативную память.
- Поддержка ленивых операций (т.е. ничего не считается до тех пор, пока не попросишь).
- Использование zero-copy memory access — данные читаются прямо с диска без загрузки в RAM.
- Интеграция с файловыми форматами Arrow, HDF5 и Parquet.
📦 Установка
Устанавливаем библиотеку:
pip install vaex
🚀 Быстрый старт
Допустим, у нас есть CSV-файл с 50 миллионами строк. Попробуем прочитать его и посмотреть средние значения по колонке:
import vaex
# Быстрая загрузка большого файла
df = vaex.from_csv('big_data.csv', convert=True, chunk_size=5_000_000)
# Просмотр первых строк, как в pandas
print(df.head())
# Вычисление средней температуры, к примеру
mean_temp = df['temperature'].mean()
print(f"Mean temperature: {mean_temp}")
Метод from_csv с параметром convert=True один раз конвертирует CSV в более быстрый бинарный формат Arrow/HDF5, чтобы в будущем грузиться мгновенно.
🧪 Где быстрее, чем в pandas?
Vaex особенно хорош для агрегаций и фильтраций. Сравним простую агрегацию:
# Средняя цена по категориям
df.groupby('category', agg={'avg_price': vaex.agg.mean('price')})
Огромный набор категорий и десятки миллионов цен — Vaex справляется без напряжения.
🎯 Фильтрация на лету
Vaex не гонит весь датафрейм через фильтры. Он выполняет их лениво, максимально эффективно:
# Отфильтруем дорогие продукты
df_filtered = df[df.price > 1000]
# Считаем средний рейтинг у дорогих товаров
print(df_filtered['rating'].mean())
🔥 Визуализация огромных данных
Vaex умеет делать биннинг (разбиение по диапазонам), что особенно полезно при визуализации плотных scatter-плотов:
df.plot(df.x, df.y, f='log1p', shape=512)
Да, прямо так. Интерактивное, быстрое, работает на миллионах точек.
📁 Разделение и экспорт
Вы можете экспортировать уже отфильтрованные или агрегированные данные обратно в Parquet или CSV:
df_filtered.export_parquet('filtered_data.parquet')
🧩 Vaex против pandas
Время выполнения задачи агрегации в pandas: десятки секунд или даже минуты (и возможный MemoryError). В Vaex — доли секунды. И не нужно думать, достаточно ли у тебя оперативки.
📌 Используй тогда, когда:
- Твои данные занимают десятки или сотни ГБ
- pandas падает с ошибками памяти
- Требуется быстрая агрегация, фильтрация, группировка
- Нужно делать всё это без громоздких кластеров Spark/Dask
✨ Вывод
Vaex — отличный инструмент, когда речь идёт о больших объемах данных и важна скорость. Он не заменяет pandas как основной инструмент работы с данными, но для heavy-duty аналитики — просто must-have. Попробуй использовать его в своём следующем дата-проекте — и удивишься, насколько это быстро.Быстрая обработка гигантских наборов данных с использованием библиотеки Vaex.
🔥 Как использовать библиотеки для автоматического тестирования веб-приложений
Сегодня поговорим о настоящем магическом арсенале Python — библиотеках для автоматизированного тестирования веб-приложений. Зачем вручную кликать по кнопкам и проверять, что форма отправляется, если можно поручить это роботу?
Да, автоматизация тестирования — это не только для корпораций с огромным QA-отделом. Даже если ты пишешь свой первый сайт на Flask — запускать тесты «по кнопке» и быть уверенным, что ничего не сломано после очередного коммита — бесценно.
Давайте рассмотрим две популярные библиотеки: Selenium и pytest, плюс кратко затронем requests и BeautifulSoup для API и контентных проверок.
🎯 Selenium — когда надо кликать мышкой и вводить текст
Selenium позволяет имитировать поведение пользователя в браузере: запустить сайт, заполнить поля, нажать кнопки и проверить, как всё работает. Вот простой пример с использованием Chrome WebDriver:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://example.com/login")
username_input = driver.find_element(By.NAME, "username")
password_input = driver.find_element(By.NAME, "password")
username_input.send_keys("test_user")
password_input.send_keys("secure_pass")
password_input.send_keys(Keys.RETURN)
assert "Dashboard" in driver.title
driver.quit()
Этот код удобно запускать в рамках pytest или unittest. Selenium особенно полезен, когда нужно протестировать интерфейс, JavaScript и формы.
🤖 Pytest — быстрые и читаемые тесты
Pytest — это ядро для любого вида тестов. Оно прекрасно умеет работать с фикстурами и параметризацией, а код остаётся чистым и читаемым.
Пример интеграции с requests для проверки REST API:
import requests
def test_api_status():
response = requests.get("https://api.example.com/status")
assert response.status_code == 200
def test_login_api():
data = {"username": "test_user", "password": "secure_pass"}
response = requests.post("https://api.example.com/login", json=data)
assert response.json().get("token") is not None
Иногда этого достаточно — особенно если ты делаешь SPA с разделённым backend.
🍜 Bonus: BeautifulSoup для проверки содержимого
Допустим, приходит HTML, и хочется убедиться, что нужный блок отрисовался:
from bs4 import BeautifulSoup
html = "<html><body><div id='welcome'>Hello, test_user!</div></body></html>"
soup = BeautifulSoup(html, "html.parser")
welcome_div = soup.find("div", id="welcome")
assert welcome_div.text == "Hello, test_user!"
Не затыкай нос — HTML можно парсить, не страдая.
📦 Как собрать вместе?
Обычно автоматика выглядит так: ты пишешь тесты на pytest, которые используют библиотеки вроде requests для API и selenium для UI. Запуск происходит через команду:
pytest tests/
Или, если хочется сборку в CI/CD — используется GitHub Actions или GitLab CI. Всё по-взрослому.
⚡ Итог
Автоматизированное тестирование — это не роскошь. Это важный инструмент, который экономит время и нервы. Python предоставляет для этого весь необходимый инструментарий: от selenium до requests и pytest. Начни с простого, а потом постепенно автоматизируй всё, что можно.
Тестируй умно — пиши код с уверенностью.Как использовать библиотеки для автоматического тестирования веб-приложений.
Разработка навыков для голосовых ассистентов на Python
———————————————————————
Вы когда-нибудь разговаривали с колонкой ночью, чтобы включить свет? Или просили телефон поставить будильник голосом? Всё это — работа голосовых интерфейсов, и, спойлер: вы можете писать для них навыки на Python.
🧠 Что такое "навык"?
Навык (skill) — это модуль, который расширяет функциональность голосового ассистента. Например, навык "напомни покормить кота" или "включи успокаивающую музыку" — это код, который получает запрос от пользователя, обрабатывает его и отдает результат в естественном языке.
🎯 Где применимо?
Самые популярные платформы — это Amazon Alexa, Google Assistant и Mycroft AI. Первые две требуют сторонних SDK и облачных сервисов, а вот Mycroft — open-source и идеален для хобби-проектов. Именно на нем и сосредоточимся.
🔧 Установка Mycroft и разработка навыка
Mycroft — это система на Python, легко разворачивается на Linux, Raspberry Pi или в Docker. Навыки для него пишутся с использованием Mycroft Skill SDK.
Проще всего начать с шаблона. Установи SDK:
git clone https://github.com/MycroftAI/mycroft-skills-kit
cd mycroft-skills-kit
./msk create
Тебя проведут по созданию скелета навыка. После этого появится директория с Python-файлом, который выглядит примерно так:
from mycroft import MycroftSkill, intent_file_handler
class CatFeederSkill(MycroftSkill):
def __init__(self):
super().__init__()
@intent_file_handler('feed.cat.intent')
def handle_feed_cat(self, message):
self.speak('Don\'t forget to feed the cat!')
📝 Что здесь происходит?
- Мы унаследовали класс MycroftSkill, переопределили инициализацию
- Через декоратор @intent_file_handler мы связали фразу "feed the cat" с функцией
- self.speak() — это то, что прозвучит в ответ
Чтобы навык заработал, нужно отдельно указать список ключевых фраз, запускающих его. В файле vocab/en-us/feed.cat.intent пишем, например:
feed the cat remind me to feed the cat💥 Расширяем: подключаем API Допустим, мы хотим, чтобы навык узнавал, какое сейчас время кормления, из Google Calendar. Используем библиотеку
google-api-python-client.
Установим:
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
(Подразумевается, что вы уже получили доступ к календарю через OAuth 2.0).
Пример запроса к API:
from googleapiclient.discovery import build
def get_next_feeding_event():
service = build('calendar', 'v3', credentials=creds)
now = datetime.utcnow().isoformat() + 'Z'
events_result = service.events().list(calendarId='primary', timeMin=now,
maxResults=1, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
if events:
return events[0]['start'].get('dateTime', 'No dateTime')
return 'No upcoming events'
Интегрируешь это в навык — и голосовой ассистент будет знать расписание кормления кота лучше тебя.
🧪 Тестирование
Тестировать можно через терминал или же загрузить навык на устройство с Mycroft. Есть поддержка логирования и горячей перезагрузки.
🚀 Заключение
Создание голосовых навыков — это не только шаг в мир ИИ, но и реальная возможность автоматизировать повседневность. Python делает это просто: минимум кода, максимум смысла. Хотите умного помощника? Начните с одной команды — а закончите персональным ИИ-дворецким.Если вы не живёте в пещере, то наверняка сталкивались с "облаками": Google Drive, Dropbox, Amazon S3 и другие — это то место, куда современные приложения сбрасывают гигигабайты данных, чтобы потом что-то с ними делать. Сегодня мы поговорим, как Python помогает не только достучаться до облака, но и прокачать аналитические навыки при помощи этих данных.
Представьте: у вас в облаке хранятся CSV-файлы с отчетами по продажам. Нужно быстро получить сводку за квартал, построить диаграмму и сохранить результат обратно в облако. Python справится с этим играючи.
Начнем с самого популярного хранилища — Amazon S3. Библиотека boto3 позволяет удобно и быстро взаимодействовать с ним:
import boto3
s3 = boto3.client('s3')
s3.download_file('my-bucket', 'sales/q1_report.csv', 'q1_report.csv')
После скачивания данных — аналитика. Pandas и Matplotlib — наши верные помощники:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('q1_report.csv')
summary = df.groupby('region')['sales'].sum()
summary.plot(kind='bar')
plt.title('Sales by Region - Q1')
plt.tight_layout()
plt.savefig('q1_summary.png')
Теперь результат — обратно в облако:
s3.upload_file('q1_summary.png', 'my-bucket', 'reports/q1_summary.png')
Если вы работаете с Google Drive — удобней всего использовать библиотеку pydrive или Google API. С Dropbox — dropbox SDK. Вот пример, как загрузить файл в Dropbox:
import dropbox
dbx = dropbox.Dropbox('YOUR_ACCESS_TOKEN')
with open('q1_summary.png', 'rb') as f:
dbx.files_upload(f.read(), '/reports/q1_summary.png', mode=dropbox.files.WriteMode.overwrite)
И да, облака — это не только про хранение. Google BigQuery и Amazon Redshift позволяют выполнять SQL-запросы к огромным объемам данных. Попробуем подключиться к BigQuery через pandas-gbq:
from pandas_gbq import read_gbq
query = """
SELECT region, SUM(sales) as total_sales
FROM `project.dataset.sales_data`
GROUP BY region
"""
df = read_gbq(query, project_id='your-project-id')
print(df.head())
Секунды — и у вас на руках сводка за год по всем регионам. Всё это без скачивания гигабайт данных.
Python — это швейцарский нож для работы с облачными данными. Он позволяет легко подключаться к хранилищам, анализировать данные и визуализировать результаты. Всё это буквально в несколько строк кода.
Так что если в вашем проекте используются облака — самое время подружить их с Python. Возможности открываются действительно космические.
Available now! Telegram Research 2025 — the year's key insights 
