ПРИМИТИВЫ, ПЕРЕМЕННЫЕ
И ВЫРАЖЕНИЯ
Python — это набор примитивных типов — целых чисел, чисел с плавающей
точкой, строк и т. д.:
Переменная — имя, указывающее на значение. Значение представляет объект некоторого типа:
Иногда тип явно указывается для имени:
Тип — лишь подсказка, упрощающая чтение кода. Он может использоваться
сторонними инструментами проверки кода. В остальных случаях он полно-
стью игнорируется. Указание типа никак не помешает вам присвоить пере-
менной значение другого типа.
Выражение — это комбинация примитивов, имен и операторов, в результате
вычисления которой будет
получено некоторое значение:
Следующая программа использует переменные и выражения для вычисления
сложных процентов:
При выполнении программа выдает следующий результат:
Команда while проверяет условное выражение, следующее сразу за ключе-
вым словом. В случае истинности проверяемого условия выполняется тело
команды while. Затем это условие проверяется повторно и тело выполняется
снова, пока условие не станет ложным. Тело цикла обозначается отступами.
Так, три оператора, следующие за while, выполняются при
каждой итерации. В спецификации Python не указана величина отступов.
Важно лишь, чтобы отступ был единым в границах блока. Чаще всего ис-
пользуются отступы из четырех пробелов на один уровень.
Один из недостатков этой программы — не очень красивый вывод.
Для его улучшения можно выровнять столбцы по правому краю и ограничить
точность вывода чисел двумя знаками в дробной части. Попробуйте изменить функцию
print(), чтобы в ней использовалась так называемая f-строка
В f-строках могут вычисляться выражения и имена переменных. Для этого они
заключаются в фигурные скобки. К каждому заменяемому элементу может
быть присоединен спецификатор формата. Так, '>3d' обозначает трехзнач-
ное десятичное число, выравниваемое по правому краю, '0.2f' обозначает
число с плавающей точкой, выводимое с двумя знаками точности.
Теперь вывод программы выглядит так:
#pythonbasics #pythonprimitives #python
Поблагодарить
И ВЫРАЖЕНИЯ
Python — это набор примитивных типов — целых чисел, чисел с плавающей
точкой, строк и т. д.:
42 # int целое число
4.2 # float число с плавающей точкой
'forty-two' # str строка
True # bool логический/булев тип
Переменная — имя, указывающее на значение. Значение представляет объект некоторого типа:
x = 42
Иногда тип явно указывается для имени:
x: int = 42
Тип — лишь подсказка, упрощающая чтение кода. Он может использоваться
сторонними инструментами проверки кода. В остальных случаях он полно-
стью игнорируется. Указание типа никак не помешает вам присвоить пере-
менной значение другого типа.
Выражение — это комбинация примитивов, имен и операторов, в результате
вычисления которой будет
получено некоторое значение:
2 + 3 * 4 # -> 14
Следующая программа использует переменные и выражения для вычисления
сложных процентов:
principal = 1000 # Исходная сумма
rate = 0.05 # Процентная ставка
numyears = 5 # Количество лет
year = 1
while year <= numyears:
principal = principal * (1 + rate)
print(year, principal)
year += 1
При выполнении программа выдает следующий результат:
1 1050.0
2 1102.5
3 1157.625
4 1215.5062500000001
5 1276.2815625000003
Команда while проверяет условное выражение, следующее сразу за ключе-
вым словом. В случае истинности проверяемого условия выполняется тело
команды while. Затем это условие проверяется повторно и тело выполняется
снова, пока условие не станет ложным. Тело цикла обозначается отступами.
Так, три оператора, следующие за while, выполняются при
каждой итерации. В спецификации Python не указана величина отступов.
Важно лишь, чтобы отступ был единым в границах блока. Чаще всего ис-
пользуются отступы из четырех пробелов на один уровень.
Один из недостатков этой программы — не очень красивый вывод.
Для его улучшения можно выровнять столбцы по правому краю и ограничить
точность вывода чисел двумя знаками в дробной части. Попробуйте изменить функцию
print(), чтобы в ней использовалась так называемая f-строка
print(f'{year:>3d} {principal:0.2f}')
В f-строках могут вычисляться выражения и имена переменных. Для этого они
заключаются в фигурные скобки. К каждому заменяемому элементу может
быть присоединен спецификатор формата. Так, '>3d' обозначает трехзнач-
ное десятичное число, выравниваемое по правому краю, '0.2f' обозначает
число с плавающей точкой, выводимое с двумя знаками точности.
Теперь вывод программы выглядит так:
1 1050.00
2 1102.50
3 1157.62
4 1215.51
5 1276.28
#pythonbasics #pythonprimitives #python
Поблагодарить
CloudTips
CloudTips – чаевые и донаты картой моментально
Сервис для приема безналичных чаевых и донатов CloudTips
🔥2
Что такое интерпретатор и как он работает?
Интерпретатор — простыми словами, это программа исполняющая другие программы. Когда вы запускаете, написанную на Python, программу, интерпретатор читает её и приводит в исполнение содержащиеся в ней инструкции, выступая прослойкой между кодом и «железом».
Самая простая программа, представляет собой текстовый файл, содержащий операторы Python. Например создайте файл example.py, откройте его в любом текстовом редакторе, который вам нравится и запишите, в него, простейший классический сценарий:
и сохраните. Обычно, для общей согласованности, всем python файлам, дают имена, оканчивающиеся на .py. Но если опустить формальности, такая схема именования, обязательна только для файлов, которые будут использоваться при импорте.
Давайте переименуем, созданный нами файл "example.py" в "example" и попробуем его запустить, как обычно:
как видите он без проблем запустился.
После запуска Python внутренне компилирует исходный код в байт-код. Под компиляцией, в данном случае, понимается трансляция, а под байт-кодом низкоуровневое представление исходного кода. Грубо говоря, Python транслирует каждый оператор исзодного кода в группу иструкций байт-кода, разбивая их на отдельные шаги. Трансляция в байт-код происходит по мере выполнения. Байт-код можно найти в каталоге с исходным кодом, который называется pycache, внутри будут файлы с расширением .рус — это и есть байт-код. При следующем запуске, Python пропустит шаг трансляции и сразу загрузить файлы .pyc, при условии, что файл с исходным кодом не менялся и не менялась используемая версия Python. Python автоматически проверяет отметки времени последней модификации для файлов исходного кода и байт-кода, чтобы выяснить, когда они должны быть перекомпилированы — если вы отредактируете и
повторно сохраните исходный код, то байт-код будет автоматически создан заново при следующем запуске программы.
Байт-код сохраняется лишь для тех файлов, которые
импортируются, но не для файлов верхнего уровня программы, выполняемых только как сценарии.
После того, как программа скомпилирована в байт-код , она отправляется на выполнение в виртуальную машину Python (PVM) — это компонент, который уже понастоящем исполняет ваш код и является, можно сказать, последним этапом "интерпретатора Python".
В Python обычно отсутствует шаг “сборки”: код выполняется сразу, а байт-код Python не является двоичным машинным кодом. Байт-код — это представление, специфичное для Python. Поэтому некоторый код на Python выполняется медленнее, чем тот же код на C/C++.
#pythonbasics #pythoninterpreter #python
Поблагодарить
Интерпретатор — простыми словами, это программа исполняющая другие программы. Когда вы запускаете, написанную на Python, программу, интерпретатор читает её и приводит в исполнение содержащиеся в ней инструкции, выступая прослойкой между кодом и «железом».
Самая простая программа, представляет собой текстовый файл, содержащий операторы Python. Например создайте файл example.py, откройте его в любом текстовом редакторе, который вам нравится и запишите, в него, простейший классический сценарий:
print('hello world')
и сохраните. Обычно, для общей согласованности, всем python файлам, дают имена, оканчивающиеся на .py. Но если опустить формальности, такая схема именования, обязательна только для файлов, которые будут использоваться при импорте.
Давайте переименуем, созданный нами файл "example.py" в "example" и попробуем его запустить, как обычно:
shell % python example
hello world
как видите он без проблем запустился.
После запуска Python внутренне компилирует исходный код в байт-код. Под компиляцией, в данном случае, понимается трансляция, а под байт-кодом низкоуровневое представление исходного кода. Грубо говоря, Python транслирует каждый оператор исзодного кода в группу иструкций байт-кода, разбивая их на отдельные шаги. Трансляция в байт-код происходит по мере выполнения. Байт-код можно найти в каталоге с исходным кодом, который называется pycache, внутри будут файлы с расширением .рус — это и есть байт-код. При следующем запуске, Python пропустит шаг трансляции и сразу загрузить файлы .pyc, при условии, что файл с исходным кодом не менялся и не менялась используемая версия Python. Python автоматически проверяет отметки времени последней модификации для файлов исходного кода и байт-кода, чтобы выяснить, когда они должны быть перекомпилированы — если вы отредактируете и
повторно сохраните исходный код, то байт-код будет автоматически создан заново при следующем запуске программы.
Символ 'c', на конце расширения '.pyc' — означает compiled, т.е. скомпилированный.
Байт-код сохраняется лишь для тех файлов, которые
импортируются, но не для файлов верхнего уровня программы, выполняемых только как сценарии.
После того, как программа скомпилирована в байт-код , она отправляется на выполнение в виртуальную машину Python (PVM) — это компонент, который уже понастоящем исполняет ваш код и является, можно сказать, последним этапом "интерпретатора Python".
В Python обычно отсутствует шаг “сборки”: код выполняется сразу, а байт-код Python не является двоичным машинным кодом. Байт-код — это представление, специфичное для Python. Поэтому некоторый код на Python выполняется медленнее, чем тот же код на C/C++.
#pythonbasics #pythoninterpreter #python
Поблагодарить
CloudTips
CloudTips – чаевые и донаты картой моментально
Сервис для приема безналичных чаевых и донатов CloudTips
🔥2
Отличные новости — Free-threaded CPython готов к экспериментам!
В статье рассказывается о новой возможности CPython 3.13, которая позволяет запускать несколько потоков параллельно внутри одного интерпретатора, отключая глобальную блокировку интерпретатора (GIL). Это улучшение направлено на повышение производительности многопоточных приложений, позволяя эффективно использовать многоядерные процессоры.
Основные проблемы, связанные с внедрением свободного многопоточности, включают:
1. Потокобезопасность: Большинство кодов на C, C+ +, Cython и других языках, использующих API CPython, ранее полагались на защиту GIL. Теперь это больше не так, что может привести к сбоям и некорректной работе.
2. Несовместимость ABI: Поскольку свободный многопоточный интерпретатор имеет другой ABI, каждая библиотека с расширениями должна теперь создавать дополнительные колеса (wheels).
Команда Quansight Labs делится своим опытом по внедрению поддержки свободного многопоточности в популярные библиотеки, такие как NumPy и Cython, и подчеркивает важность создания хорошей стратегии тестирования для обеспечения стабильности кода.
#python #news #dev
Читать статью полностью
В статье рассказывается о новой возможности CPython 3.13, которая позволяет запускать несколько потоков параллельно внутри одного интерпретатора, отключая глобальную блокировку интерпретатора (GIL). Это улучшение направлено на повышение производительности многопоточных приложений, позволяя эффективно использовать многоядерные процессоры.
Основные проблемы, связанные с внедрением свободного многопоточности, включают:
1. Потокобезопасность: Большинство кодов на C, C+ +, Cython и других языках, использующих API CPython, ранее полагались на защиту GIL. Теперь это больше не так, что может привести к сбоям и некорректной работе.
2. Несовместимость ABI: Поскольку свободный многопоточный интерпретатор имеет другой ABI, каждая библиотека с расширениями должна теперь создавать дополнительные колеса (wheels).
Команда Quansight Labs делится своим опытом по внедрению поддержки свободного многопоточности в популярные библиотеки, такие как NumPy и Cython, и подчеркивает важность создания хорошей стратегии тестирования для обеспечения стабильности кода.
#python #news #dev
Читать статью полностью
labs.quansight.org
Free-threaded CPython is ready to experiment with!
An overview of the ongoing efforts to improve and roll out support for free-threaded CPython throughout the Python open source ecosystem
👍1
Сделал себе github pages, буду туда всё материалы сохранять, с помощью mdbook. В телеграме пока что, не очень удобно большие посты, с кодом писать, к сожалению.
Вот новый материал по спискам:
https://xenpu.github.io/python-forever/basics/lists_1.html
Списки. Часть 1.
#pythonbasics #pythonlists #python
https://xenpu.github.io/python-forever/basics/lists_1.html
Вот новый материал по спискам:
https://xenpu.github.io/python-forever/basics/lists_1.html
Списки. Часть 1.
Рассказал что такое список, как его создать, как добавлять\вставлять\расширять\удалять из него объекты.
#pythonbasics #pythonlists #python
https://xenpu.github.io/python-forever/basics/lists_1.html
👍2
Перевёл интересную статью, с mathspp,
про обзор модуля itertools.
Там описываются основые возможности модуля, с примерами, в каких случаях, как и зачем, их можно применять.
Время чтения ~17 минут
Читать
#pythonbasics #pythonlists #python
про обзор модуля itertools.
Там описываются основые возможности модуля, с примерами, в каких случаях, как и зачем, их можно применять.
Время чтения ~17 минут
Читать
#pythonbasics #pythonlists #python
👍1🔥1
Пару недель назад появился PEP-751, в котором предлагается новый формат файла спецификации зависимостей для обеспечения воспроизводимой установки в среде Python.
Единый стандарт добавит переносимость между инструментами и уберёт разного рода зависимости.
В качестве имени файла будет использован, уже знакомый всем pylock.toml, либо допускается его некоторая модификация, которая, должно соответствовать регулярному выражению
#pythonpep #python #pep
В настоящее время не существует стандарта для:
— Установки зависимостей верхнего уровня в среду Python.
— Создания неизменяемой записи, такой, как файл блокировки(lock file), из которой будут устанавливаться зависимости.
Единый стандарт добавит переносимость между инструментами и уберёт разного рода зависимости.
В качестве имени файла будет использован, уже знакомый всем pylock.toml, либо допускается его некоторая модификация, которая, должно соответствовать регулярному выражению
r"pylock\.(.+)\.toml"
#pythonpep #python #pep
Всем привет, и спасибо за то, что остались на канале. Меня долго не было, обстоятельства так сложились, но не так давно, я решил возобновить свою деятельность - по написанию полезных вещей. И вот для затравочки, моя первая статья на хабре https://habr.com/ru/companies/ntechlab/articles/883578/
Да это только первая часть, но я уже пишу вторую, она будет понасыщеннее. Цель стоит потрогать новые веб-фреймовки, посмотреть как они работают, удобны ли или не очень. Будем разбираться.
#python #litestar #granian
Да это только первая часть, но я уже пишу вторую, она будет понасыщеннее. Цель стоит потрогать новые веб-фреймовки, посмотреть как они работают, удобны ли или не очень. Будем разбираться.
#python #litestar #granian
Хабр
LitestarCatsCV. Тренируемся на кошках. Пробуем litestar и другое новьё. Часть 1
Иногда хочется попробовать что-то новое, но в рабочих проектах это не всегда возможно. Поэтому предлагаю всем вместе пощупать несколько относительно новых web-фреймворков и посмотреть, что это такое и...
👍1
Недавно написал и выложил на хабр - вторую часть статьи
https://habr.com/ru/companies/ntechlab/articles/889022/
Что вас ждёт внутри:
Если в первой части мы заложили фундамент проекта (выбор инструментов, настройка окружения и структура), то здесь мы превратим этот каркас в полноценное API для управления резюме кошек (или людей — как вам ближе). Мы подключим базу данных, добавим тесты, настроим миграции и даже проверим всё в действии. К концу статьи у вас будет рабочее API, которое можно потрогать руками (или лапками 🐾). Полный код доступен на GitHub —
https://github.com/pulichkin/litestarcats.git
Приятного чтения 😊
________________________
#python #litestar #granian #sqlalchemy #alembic #pytest
https://habr.com/ru/companies/ntechlab/articles/889022/
Что вас ждёт внутри:
Если в первой части мы заложили фундамент проекта (выбор инструментов, настройка окружения и структура), то здесь мы превратим этот каркас в полноценное API для управления резюме кошек (или людей — как вам ближе). Мы подключим базу данных, добавим тесты, настроим миграции и даже проверим всё в действии. К концу статьи у вас будет рабочее API, которое можно потрогать руками (или лапками 🐾). Полный код доступен на GitHub —
https://github.com/pulichkin/litestarcats.git
Приятного чтения 😊
________________________
#python #litestar #granian #sqlalchemy #alembic #pytest
Хабр
LitestarCatsCV. Тренируемся на кошках. Реализация API и работа с данными. Часть 2
В этой статье вы узнаете, как: Поднять PostgreSQL и подготовить базу данных. Настроить тесты с Pytest и внедрить подход TDD. Создать модели данных и миграции с SQLAlchemy и Alembic. Реализовать...
👍1
📚 Не так давно прочитал книгу “Путь программиста” Джона Сонмеза (2016 г.), в оригинале “Soft skills: the software developer’s life manual.“, и она настолько зацепила меня за живое, что я просто не могу не поделиться своими впечатлениями! Если вы, как и я прошли мимо неё в то время, то настоятельно рекомендую обратить внимание сейчас, актуальности она не потеряла нисколько — это, пожалуй, одна из лучших книг для программистов, не о программировании. 🚀 Если бы она попала мне в руки раньше, возможно, многое в моей жизни сложилось бы иначе. Но, как часто бывает, большую часть из описанного я узнал на собственном опыте, что только подтверждает ценность советов автора. 📖 А советов там действительно много, включая темы, которые сейчас на хайпе: как дороже продать свои навыки работодателю и выстроить успешную карьеру.
📖 О чём эта книга?
Книга представляет собой руководство для разработчиков, которое помогает не только в профессиональном росте, но и в достижении баланса в жизни. Джон Сонмез делится практическими советами, основанными на своём опыте, и структурирует их вокруг четырёх ключевых областей:
—————————————————————
1. Карьера и навыки 💼
Учитесь постоянно: осваивайте новые технологии, читайте книги, пишите код вне работы. 📚
Найдите наставника или станьте им для других. 👨🏫
Специализируйтесь, но сохраняйте гибкость — станьте “T-shaped” разработчиком (глубокое знание в одной области + широкий кругозор). 🎯
Работайте над личным брендом: блог, пет-проекты, выступления помогут выделиться. 🌟
Не бойтесь менять работу или идти на фриланс, если это соответствует вашим целям. 🚪
—————————————————————
2. Продуктивность ⏳
Планируйте время: используйте техники вроде Pomodoro или списков задач. 🍅
Сосредоточьтесь на главном — 20% усилий дают 80% результата (принцип Парето). 📊
Избегайте многозадачности, она снижает эффективность. 🚫
Устанавливайте небольшие, достижимые цели, чтобы поддерживать мотивацию. 🎯
Автоматизируйте рутину, чтобы освободить время для творчества. 🤖
—————————————————————
3. Финансы 💸
Живите по средствам: тратьте меньше, чем зарабатываете. 💡
Инвестируйте в будущее: откладывайте деньги, изучайте основы финансов. 📈
Создайте дополнительные источники дохода (например, курсы, книги, проекты). 💼
Понимайте свою ценность на рынке и не бойтесь просить повышения. 💪
—————————————————————
4. Здоровье и образ жизни 🏋️♂️
Занимайтесь спортом: физическая активность улучшает концентрацию и настроение. 🧘♂️
Следите за питанием: здоровая еда = больше энергии для работы. 🥗
Спите достаточно: недосып снижает производительность. 😴
Работайте над уверенностью и ментальным здоровьем — это основа успеха. 🧠
—————————————————————
🎯 Главная идея книги
Сонмез призывает подходить к жизни системно, как к коду: ставьте цели, тестируйте гипотезы, исправляйте ошибки и постоянно улучшайтесь. Успех в карьере — это не только технические навыки, но и умение управлять собой, своим временем и ресурсами. 💻➡️🧠
—————————————————————
📌 Ключевые выводы
Будьте проактивны: берите ответственность за свою карьеру и жизнь. 🚀
Баланс — это важно: здоровье и личное счастье поддерживают профессиональный рост. ⚖️
Маленькие шаги каждый день ведут к большим результатам. 🐾➡️🏆
—————————————————————
Эта книга мотивирует не просто “кодить”, а строить осмысленную и устойчивую карьеру, опираясь на дисциплину и самосовершенствование. Если вы ещё не читали — самое время начать! 📖✨
#books #softskills
Книга представляет собой руководство для разработчиков, которое помогает не только в профессиональном росте, но и в достижении баланса в жизни. Джон Сонмез делится практическими советами, основанными на своём опыте, и структурирует их вокруг четырёх ключевых областей:
—————————————————————
1. Карьера и навыки 💼
Учитесь постоянно: осваивайте новые технологии, читайте книги, пишите код вне работы. 📚
Найдите наставника или станьте им для других. 👨🏫
Специализируйтесь, но сохраняйте гибкость — станьте “T-shaped” разработчиком (глубокое знание в одной области + широкий кругозор). 🎯
Работайте над личным брендом: блог, пет-проекты, выступления помогут выделиться. 🌟
Не бойтесь менять работу или идти на фриланс, если это соответствует вашим целям. 🚪
—————————————————————
2. Продуктивность ⏳
Планируйте время: используйте техники вроде Pomodoro или списков задач. 🍅
Сосредоточьтесь на главном — 20% усилий дают 80% результата (принцип Парето). 📊
Избегайте многозадачности, она снижает эффективность. 🚫
Устанавливайте небольшие, достижимые цели, чтобы поддерживать мотивацию. 🎯
Автоматизируйте рутину, чтобы освободить время для творчества. 🤖
—————————————————————
3. Финансы 💸
Живите по средствам: тратьте меньше, чем зарабатываете. 💡
Инвестируйте в будущее: откладывайте деньги, изучайте основы финансов. 📈
Создайте дополнительные источники дохода (например, курсы, книги, проекты). 💼
Понимайте свою ценность на рынке и не бойтесь просить повышения. 💪
—————————————————————
4. Здоровье и образ жизни 🏋️♂️
Занимайтесь спортом: физическая активность улучшает концентрацию и настроение. 🧘♂️
Следите за питанием: здоровая еда = больше энергии для работы. 🥗
Спите достаточно: недосып снижает производительность. 😴
Работайте над уверенностью и ментальным здоровьем — это основа успеха. 🧠
—————————————————————
🎯 Главная идея книги
Сонмез призывает подходить к жизни системно, как к коду: ставьте цели, тестируйте гипотезы, исправляйте ошибки и постоянно улучшайтесь. Успех в карьере — это не только технические навыки, но и умение управлять собой, своим временем и ресурсами. 💻➡️🧠
—————————————————————
📌 Ключевые выводы
Будьте проактивны: берите ответственность за свою карьеру и жизнь. 🚀
Баланс — это важно: здоровье и личное счастье поддерживают профессиональный рост. ⚖️
Маленькие шаги каждый день ведут к большим результатам. 🐾➡️🏆
—————————————————————
Эта книга мотивирует не просто “кодить”, а строить осмысленную и устойчивую карьеру, опираясь на дисциплину и самосовершенствование. Если вы ещё не читали — самое время начать! 📖✨
#books #softskills
🔥3
Вышла третья статья из серии про litestar. Интересно было попробовать его, granian и keydb. Если вы работает с Джанго и вдруг вам понадобиться, что-то асинхронное и производительное, то как вариант, можно использовать такую связку. Мне понравилось, что как и в джанге, можно использовать классы для роутов, а для keydb любой клиент для redis подойдёт. В целом удобная штука, можно быстро собрать что-то и оно будет работать и будет достаточно производительным.
Читать тут
Читать тут
Хабр
LitestarCatsCV. Тренируемся на кошках. Расширяем возможности и готовимся к продакшену. Часть 3
Котики выходят на новый уровень! 🐾 Привет, котики и котолюбы! В первой части нашего кошачьего приключения мы выбрали инструменты (Litestar вместо FastAPI, Granian вместо Gunicorn, KeyDB вместо Redis),...
👍1🔥1
Запостил новую статью на Хабр, вышел довольно большой вводный обзор на спецификации png, с примерами на python.
https://habr.com/ru/companies/ntechlab/articles/924638/
https://habr.com/ru/companies/ntechlab/articles/924638/
Хабр
Сравнение форматов PNG: от первой до третьей редакции
TL;DR Введение Недавно опубликованная третья редакция спецификации Portable Network Graphics (PNG) 2025 года, разработанная World Wide Web Consortium (W3C), привлекла внимание к эволюции этого формата...
👍2🔥1
написал новую статью, о том как решил сделать расширение для браузера
https://habr.com/ru/companies/ntechlab/articles/930732/
О чём статья:
Статья описывает процесс создания браузерного расширения FindMyLink за две недели — от идеи до публикации в Chrome Web Store и Firefox Add-ons. Расширение упрощает поиск по закладкам и вкладкам, с бесплатным доступом к поиску по закладкам и премиум-функцией поиска по вкладкам через подписку. Делюсь опытом выбора технологий, решения проблем и выводами для начинающих разработчиков.
Ключевые этапы:
Идея и прототип: Исследование WebExtensions API и создание прототипа с Quasar для поиска по закладкам и вкладкам.
Монетизация: Интеграция Telegram Payments API для подписок, с Telegram-ботом для обработки платежей.
Авторизация: Настройка Telegram Login Widget с переходом на API из-за требований Chrome, включая локальную разработку с HTTPS через Nginx и mkcert.
Бэкенд и API: Использование Litestar, SQLite, KeyDB и config-lib-msgspec для обработки авторизации и подписок.
Деплой: Развёртывание на VPS с Docker, Caddy и Cloudflare для HTTPS и безопасности.
Публикация: Успешная публикация в Chrome Web Store и Firefox Add-ons, трудности с верификацией в Microsoft Edge Add-ons.
Результаты: Расширение работает, данные пока ограничены, но проект развивается.
Технологии:
Фронтенд: Typescript, WebExtensions API.
Бэкенд: Litestar, SQLite, KeyDB, python-telegram-bot, config-lib-msgspec.
Инфраструктура: Docker, Caddy, Cloudflare.
https://habr.com/ru/companies/ntechlab/articles/930732/
О чём статья:
Статья описывает процесс создания браузерного расширения FindMyLink за две недели — от идеи до публикации в Chrome Web Store и Firefox Add-ons. Расширение упрощает поиск по закладкам и вкладкам, с бесплатным доступом к поиску по закладкам и премиум-функцией поиска по вкладкам через подписку. Делюсь опытом выбора технологий, решения проблем и выводами для начинающих разработчиков.
Ключевые этапы:
Идея и прототип: Исследование WebExtensions API и создание прототипа с Quasar для поиска по закладкам и вкладкам.
Монетизация: Интеграция Telegram Payments API для подписок, с Telegram-ботом для обработки платежей.
Авторизация: Настройка Telegram Login Widget с переходом на API из-за требований Chrome, включая локальную разработку с HTTPS через Nginx и mkcert.
Бэкенд и API: Использование Litestar, SQLite, KeyDB и config-lib-msgspec для обработки авторизации и подписок.
Деплой: Развёртывание на VPS с Docker, Caddy и Cloudflare для HTTPS и безопасности.
Публикация: Успешная публикация в Chrome Web Store и Firefox Add-ons, трудности с верификацией в Microsoft Edge Add-ons.
Результаты: Расширение работает, данные пока ограничены, но проект развивается.
Технологии:
Фронтенд: Typescript, WebExtensions API.
Бэкенд: Litestar, SQLite, KeyDB, python-telegram-bot, config-lib-msgspec.
Инфраструктура: Docker, Caddy, Cloudflare.
Хабр
Разработка браузерного расширения: путь от идеи до публикации в web store
Введение Разработка браузерного расширения началась с простой идеи: упростить поиск по закладкам и открытым вкладкам, а также попробовать свои силы в создании проекта с элементами монетизации. В этой...
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Привет, друзья, я решил ввести новую рубрику "Алгоритмы для чайников", в которой разберу всё по полочкам, как говорится и сам повторю и вам расскажу, будет интересно.
А начнём с линейного поиска, будет несколько постов по нему и вот первый:
А начнём с линейного поиска, будет несколько постов по нему и вот первый:
👍3
Алгоритмы для чайников.
Линейный поиск
Теория
Линейный поиск (Linear Search) — это простейший алгоритм поиска элемента в неупорядоченном массиве. Он проверяет каждый элемент по порядку, пока не найдёт целевой элемент или не дойдёт до конца массива.
Может применяться для:
- Поиска всех совпадений в небольших наборах данных
- Анализа логов или записей, где нужно найти все вхождения определенного значения
- Задач, где важна простота реализации, а не максимальная производительность
Асимптотическая сложность:
- Временная сложность:
- Лучший случай: O(1) — элемент найден на первой позиции.
- Средний случай: O(n/2) — в среднем нужно проверить половину массива.
- Худший случай: O(n) — элемент в конце или отсутствует.
- Пространственная сложность: O(1) — не требует дополнительной памяти.
---------
Псевдокод
Пример
Рассмотрим массив A = [3, 1, 4, 1, 5] и ищем элемент x = 4.
Результат: Индекс элемента 4 равен 2.
Реализация 1:
Реализация 2:
Визуализация
Представьте массив как последовательность ячеек:
Линейный поиск проверяет ячейки слева направо: [3] → [1] → [4] (найдено!).
Упражнения для закрепления:
1. Простая задача:
- Реализуйте линейный поиск на Python, чтобы найти все вхождения элемента в массив (например, для A = [3, 1, 4, 1, 5] и x = 1 вернуть [1, 3]).
- Сложность: O(n).
2. Оптимизация:
- Модифицируйте алгоритм, чтобы он останавливался, если массив отсортирован по возрастанию и текущий элемент больше искомого. Реализуй и сравни с обычным линейным поиском.
3. Прикладная задача:
- Напиши функцию, которая ищет пользователя по имени в списке словарей (например, [{"name": "Alice", "id": 1}, {"name": "Bob", "id": 2}]). Применение: поиск в небольшой базе данных.
4. Задача с LeetCode:
- Find the Index of the First Occurrence in a String (Easy). Это аналог линейного поиска для строки.
----------
Линейный поиск
Теория
Линейный поиск (Linear Search) — это простейший алгоритм поиска элемента в неупорядоченном массиве. Он проверяет каждый элемент по порядку, пока не найдёт целевой элемент или не дойдёт до конца массива.
Может применяться для:
- Поиска всех совпадений в небольших наборах данных
- Анализа логов или записей, где нужно найти все вхождения определенного значения
- Задач, где важна простота реализации, а не максимальная производительность
Асимптотическая сложность:
- Временная сложность:
- Лучший случай: O(1) — элемент найден на первой позиции.
- Средний случай: O(n/2) — в среднем нужно проверить половину массива.
- Худший случай: O(n) — элемент в конце или отсутствует.
- Пространственная сложность: O(1) — не требует дополнительной памяти.
Временная сложность алгоритма - это характеристика, которая описывает, как быстро увеличивается время выполнения алгоритма при увеличении размера входных данных.
---------
Пространственная сложность алгоритма – это количество памяти, необходимое для его выполнения, в зависимости от размера входных данных. Она показывает, как объем используемой памяти увеличивается или уменьшается по мере роста размера входной информации
Псевдокод
Функция LinearSearch(массив A, искомый элемент x):
Для каждого индекса i от 0 до длины A - 1:
Если A[i] равно x:
Вернуть i // Элемент найден, возвращаем его индекс
Вернуть -1 // Элемент не найден
Пример
Рассмотрим массив A = [3, 1, 4, 1, 5] и ищем элемент x = 4.
| Начало
|-> Проверяем A[0] = 3 → не равно 4.
|-> Проверяем A[1] = 1 → не равно 4.
|-> Проверяем A[2] = 4 → найдено!
|-> Возвращаем индекс 2.
Результат: Индекс элемента 4 равен 2.
Реализация 1:
def linear_search(arr, x):
for i in range(len(arr)):
if arr[i] == x:
return i
Реализация 2:
def linear_search(arr, x):
for idx, value in enumerate(arr):
if value == x:
return i
# Пример использования
arr = [3, 1, 4, 1, 5]
x = 4
result = linear_search(arr, x)
if result is not None::
print(f"Элемент {x} найден на индексе: {result}") # Вывод: Элемент 4 найден на индексе: 2
else:
print("Элемент не найден")
Визуализация
Представьте массив как последовательность ячеек:
Значение:[3, 1, 4, 1, 5]
> > *
Индекс: 0 1 2 3 4
Линейный поиск проверяет ячейки слева направо: [3] → [1] → [4] (найдено!).
Упражнения для закрепления:
1. Простая задача:
- Реализуйте линейный поиск на Python, чтобы найти все вхождения элемента в массив (например, для A = [3, 1, 4, 1, 5] и x = 1 вернуть [1, 3]).
- Сложность: O(n).
2. Оптимизация:
- Модифицируйте алгоритм, чтобы он останавливался, если массив отсортирован по возрастанию и текущий элемент больше искомого. Реализуй и сравни с обычным линейным поиском.
3. Прикладная задача:
- Напиши функцию, которая ищет пользователя по имени в списке словарей (например, [{"name": "Alice", "id": 1}, {"name": "Bob", "id": 2}]). Применение: поиск в небольшой базе данных.
4. Задача с LeetCode:
- Find the Index of the First Occurrence in a String (Easy). Это аналог линейного поиска для строки.
----------
LeetCode
Find the Index of the First Occurrence in a String - LeetCode
Can you solve this real interview question? Find the Index of the First Occurrence in a String - Given two strings needle and haystack, return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:…
Example 1:…
🔥3
Оптимизация линейного поиска для отсортированного массива
Линейный поиск, рассмотренный ранее, проверяет каждый элемент массива, даже если массив отсортирован. Для отсортированного массива (по возрастанию) можно оптимизировать алгоритм, останавливая поиск, как только текущий элемент превышает искомый. Это не меняет асимптотику в худшем случае, но уменьшает количество проверок в среднем.
- Применение:
- Поиск в отсортированных небольших наборах данных (например, в логе событий, отсортированном по времени).
- Предварительный поиск перед использованием более сложных алгоритмов.
- Полезно, когда сортировка уже выполнена, но данные редко меняются.
- Асимптотика:
- Временная сложность:
- Лучший случай: O(1)) — элемент найден на первой позиции или первый элемент больше искомого.
- Средний случай: O(n/2) — в среднем проверяется половина массива.
- Худший случай: O(n) — элемент отсутствует или находится в конце.
- Пространственная сложность: O(1) — не требует дополнительной памяти.
- Примечание: Если мы ищем число 5 в отсортированном массиве [1, 3, 4, 6, 8], как только мы видим 6, можно остановиться, потому что все последующие элементы больше 5, а значит они нам не нужны.
Псевдокод
Реализация на Python
Пример использования
Пример работы
Рассмотрим массив A = [1, 3, 4, 6, 8] (отсортирован по возрастанию) и ищем x = 5.
1. i = 0: A[0] = 1 < 5, продолжаем.
2. i = 1: A[1] = 3 < 5, продолжаем.
3. i = 2: A[2] = 4 < 5, продолжаем.
4. i = 3: A[3] = 6 > 5, останавливаемся, возвращаем -1.
Результат: Элемент 5 отсутствует, возвращается -1.
Теперь ищем x = 4:
1. i = 0: A[0] = 1 < 4, продолжаем.
2. i = 1: A[1] = 3 < 4, продолжаем.
3. i = 2: A[2] = 4 = 4, возвращаем 2.
Результат: Элемент 4 найден на индексе 2.
Визуализация
Для x = 5 поиск останавливается на A[3] = 6, так как 6 > 5.
Упражнения
1. Простая задача:
- Модифицируй код, чтобы он возвращал индекс первого элемента, строго большего x (например, для x = 5 вернуть индекс 3, где A[3] = 6).
- Сложность: O(n).
2. Оптимизация:
- Реализуй версию, которая ищет все вхождения элемента в отсортированном массиве, используя раннюю остановку (например, для [1, 2, 2, 2, 3] и x = 2 вернуть [1, 2, 3]).
3. Прикладная задача:
- Напиши функцию для поиска всех событий в отсортированном логе (список словарей [{"time": 10, "event": "start"}, ...]), где время меньше заданного (например, max_time = 15). Применение: фильтрация логов.
4. Задача с LeetCode:
- [Search Insert Position](https://leetcode.com/problems/search-insert-position/) (Easy). Задача требует найти позицию для вставки элемента, что связано с нашей оптимизацией.
Линейный поиск, рассмотренный ранее, проверяет каждый элемент массива, даже если массив отсортирован. Для отсортированного массива (по возрастанию) можно оптимизировать алгоритм, останавливая поиск, как только текущий элемент превышает искомый. Это не меняет асимптотику в худшем случае, но уменьшает количество проверок в среднем.
- Применение:
- Поиск в отсортированных небольших наборах данных (например, в логе событий, отсортированном по времени).
- Предварительный поиск перед использованием более сложных алгоритмов.
- Полезно, когда сортировка уже выполнена, но данные редко меняются.
- Асимптотика:
- Временная сложность:
- Лучший случай: O(1)) — элемент найден на первой позиции или первый элемент больше искомого.
- Средний случай: O(n/2) — в среднем проверяется половина массива.
- Худший случай: O(n) — элемент отсутствует или находится в конце.
- Пространственная сложность: O(1) — не требует дополнительной памяти.
- Примечание: Если мы ищем число 5 в отсортированном массиве [1, 3, 4, 6, 8], как только мы видим 6, можно остановиться, потому что все последующие элементы больше 5, а значит они нам не нужны.
Псевдокод
Функция OptimizedLinearSearch(массив A, искомый элемент x):
Для каждого индекса i от 0 до длины A - 1:
Если A[i] равно x:
Вернуть i // Элемент найден
Если A[i] больше x:
Вернуть -1 // Элемент не найден, дальнейший поиск бессмыслен
Вернуть -1 // Элемент не найден
Реализация на Python
def optimized_linear_search(arr, x):
for i in range(len(arr)):
if arr[i] == x:
return i
elif arr[i] > x:
return -1
return -1
# Пример использования
arr = [1, 3, 4, 6, 8]
x = 5
result = optimized_linear_search(arr, x)
print(f"Элемент {x} найден на индексе: {result}") # Вывод: Элемент 5 найден на индексе: -1
Пример использования
Пример работы
Рассмотрим массив A = [1, 3, 4, 6, 8] (отсортирован по возрастанию) и ищем x = 5.
1. i = 0: A[0] = 1 < 5, продолжаем.
2. i = 1: A[1] = 3 < 5, продолжаем.
3. i = 2: A[2] = 4 < 5, продолжаем.
4. i = 3: A[3] = 6 > 5, останавливаемся, возвращаем -1.
Результат: Элемент 5 отсутствует, возвращается -1.
Теперь ищем x = 4:
1. i = 0: A[0] = 1 < 4, продолжаем.
2. i = 1: A[1] = 3 < 4, продолжаем.
3. i = 2: A[2] = 4 = 4, возвращаем 2.
Результат: Элемент 4 найден на индексе 2.
Визуализация
Индекс: 0 1 2 3 4
Значение:[1, 3, 4, 6, 8]
↑ ↑
x=4 x=5 (остановка)
Для x = 5 поиск останавливается на A[3] = 6, так как 6 > 5.
Упражнения
1. Простая задача:
- Модифицируй код, чтобы он возвращал индекс первого элемента, строго большего x (например, для x = 5 вернуть индекс 3, где A[3] = 6).
- Сложность: O(n).
2. Оптимизация:
- Реализуй версию, которая ищет все вхождения элемента в отсортированном массиве, используя раннюю остановку (например, для [1, 2, 2, 2, 3] и x = 2 вернуть [1, 2, 3]).
3. Прикладная задача:
- Напиши функцию для поиска всех событий в отсортированном логе (список словарей [{"time": 10, "event": "start"}, ...]), где время меньше заданного (например, max_time = 15). Применение: фильтрация логов.
4. Задача с LeetCode:
- [Search Insert Position](https://leetcode.com/problems/search-insert-position/) (Easy). Задача требует найти позицию для вставки элемента, что связано с нашей оптимизацией.
👍3