Подборка Telegram каналов для программистов
https://t.me/piterspb Канал о Санкт-Петербурге 🌇❤️💙
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин 👩
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/piterspb Канал о Санкт-Петербурге 🌇❤️💙
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин 👩
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Совет по Python💡
Вы можете использовать
Пример 👆
👉@BookPython
Вы можете использовать
any()
, чтобы проверить, является ли любой элемент в iterable
истинным.Пример 👆
👉@BookPython
Scrapy - это лицензированный BSD быстрый высокоуровневый фреймворк для веб-скраппинга, используемый для просмотра веб-сайтов и извлечения структурированных данных с их страниц. Его можно использовать для самых разных целей, от добычи данных до мониторинга и автоматизированного тестирования.
https://pypi.org/project/Scrapy/
👉@BookPython
https://pypi.org/project/Scrapy/
👉@BookPython
PyPI
Scrapy
A high-level Web Crawling and Web Scraping framework
UV
Чрезвычайно быстрый менеджер пакетов и проектов на языке Python, написанный на Rust.
Создатели позиционируют его как замену pip, pip-tools и virtualenv. Это, кстати, те же разработчики, которые сделали линтер Ruff.
https://astral.sh/blog/uv
https://github.com/astral-sh/uv
👉@BookPython
Чрезвычайно быстрый менеджер пакетов и проектов на языке Python, написанный на Rust.
Создатели позиционируют его как замену pip, pip-tools и virtualenv. Это, кстати, те же разработчики, которые сделали линтер Ruff.
https://astral.sh/blog/uv
https://github.com/astral-sh/uv
👉@BookPython
Блок
Вывод:
👉@BookPython
else
для выражений for
и try
используется довольно редко. Однако, комбинируя их вместе, можно написать код, который выполняет итерацию по коллекции до первого успешного результата без использования дополнительных флагов.
import logging
from typing import List, Optional
logging.basicConfig(level=logging.DEBUG)
def first_int(iterable: List[str]) -> Optional[int]:
for x in iterable:
try:
result = int(x)
except ValueError:
logging.debug('Bad int: %s', x)
else:
break
else:
result = None
logging.error('No int found')
return result
print(first_int(('a', 'b', '42', 'c')))
Вывод:
DEBUG:root:Bad int: a
DEBUG:root:Bad int: b
42
👉@BookPython
В Python 3 методы
Можно утверждать, что индексация ключей не особо нужна, так как их порядок случайный, но это не совсем так. Во-первых,
👉@BookPython
keys
, values
и items
для словарей возвращают объекты-представления (view objects). В Python 2 они возвращали списки. Основное различие в том, что представления не хранят все элементы в памяти, а предоставляют их по мере запроса. Это работает отлично, пока вы просто итерируете ключи (что обычно и делается), но теперь вы не можете получить доступ к элементам по индексу.
TypeError: 'dict_keys' object does not support indexing
Можно утверждать, что индексация ключей не особо нужна, так как их порядок случайный, но это не совсем так. Во-первых,
d.keys()[0]
может быть удобным способом получить любой ключ (используйте next(iter(d.keys()))
в Python 3). Во-вторых, начиная с Python 3.6, словари в CPython упорядочены по порядку добавления, и с версии Python 3.7 это стало стандартной особенностью языка.👉@BookPython
Если
А вот зачем:
👉@BookPython
dict
запоминает порядок элементов в Python 3.6+, тогда зачем нужен collections.OrderedDict
? А вот зачем:
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
>>> dict(a=1, b=2) == dict(b=2, a=1)
True
👉@BookPython
Известный синтаксис декораторов в Python (
По сути, идентификатор после
👉@BookPython
@this_one
) — это способ вызова функции высшего порядка. Раньше людям приходилось делать это вручную:
# prior to Python 2.4
def query():
pass
query = atomic(query)
# now
@atomic
def query():
pass
По сути, идентификатор после
@
— это то, что будет вызвано. Можно также использовать идентификатор со скобками (@atomic(skip_errors=True)
), что обычно используется для параметризированных декораторов. Также работает что-то вроде @decorators.db.atomic(True)
. Кажется, что любой вид выражения можно использовать в качестве декоратора, но это не так. После @
должен следовать один «дот-идентификатор» (например, decorators.atomic) и, при необходимости, одна пара скобок с аргументами (как вызов функции). Так что @decorators[2]
использовать нельзя. Вот строка из грамматики Python:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
👉@BookPython
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
Вы когда-нибудь задумывались, почему при попытке выйти из интерактивного Python с помощью простого
exit
или quit
появляется это сообщение? Решение довольно неожиданное, но изящное. Это не специальный случай для интерактивной оболочки, она просто показывает представление каждого вычисленного результата, а эта строка - просто представление функции exit.Строго говоря, вы не должны использовать exit в своих повседневных проектах, поскольку она была создана специально для интерактивной оболочки. Вместо этого используйте
sys.exit()
.👉@BookPython
Если вы хотите перехватить как
👉@BookPython
IndexError
, так и KeyError
, вы можете и должны использовать LookupError
, их общего предка. Это оказалось полезным при доступе к сложным вложенным данным.
try:
db_host = config['databases'][0]['hosts'][0]
except LookupError:
db_host = 'localhost'
👉@BookPython
Python 3 позволяет сделать некоторые аргументы функции обязательными именованными аргументами, что означает, что их нужно передавать как
Это может быть полезно, чтобы предотвратить вызовы функции вроде:
Чтобы достичь этого результата, следует разместить обязательные именованные аргументы после аргумента переменной длины (также известного как
Если вам не нужен
👉@BookPython
(arg=value)
, а не просто (value)
.Это может быть полезно, чтобы предотвратить вызовы функции вроде:
grep(text, pattern, True, False, True)
, где True, False, True
на самом деле означают: игнорировать регистр, не инвертировать совпадение, шаблон — регулярное выражение Perl. Было бы неплохо заставить использовать единственный разумный вид вызова:
grep(text, pattern,
ignore_case=True,
perl_regexp=True)
Чтобы достичь этого результата, следует разместить обязательные именованные аргументы после аргумента переменной длины (также известного как
*args
):
def grep(
text, pattern, *args,
ignore_case=False,
invert_match=False,
perl_regexp=False,
):
pass
Если вам не нужен
*args
(как в примере), просто замените его на одиночную звездочку:
def grep(
text, pattern, *,
ignore_case=False,
invert_match=False,
perl_regexp=False,
):
pass
👉@BookPython
Популярный способ объявить абстрактный метод в Python — использовать исключение
Хотя этот способ довольно популярен и даже поддерживается IDE (PyCharm считает такой метод абстрактным), у него есть недостаток. Ошибка возникает только при вызове метода, а не при создании экземпляра класса.
Используйте
👉@BookPython
NotImplementedError
:
def human_name(self):
raise NotImplementedError
Хотя этот способ довольно популярен и даже поддерживается IDE (PyCharm считает такой метод абстрактным), у него есть недостаток. Ошибка возникает только при вызове метода, а не при создании экземпляра класса.
Используйте
abc
, чтобы избежать этой проблемы:
from abc import ABCMeta, abstractmethod
class Service(metaclass=ABCMeta):
@abstractmethod
def human_name(self):
pass
👉@BookPython
Очередь с приоритетом — это структура данных, которая поддерживает две операции: добавление элемента и извлечение минимального из всех ранее добавленных элементов.
Одной из самых распространённых реализаций очереди с приоритетом является бинарная куча. Это полное бинарное дерево со следующим свойством: ключ, хранящийся в каждом узле, меньше или равен (≤) ключам в дочерних узлах. Минимум всех элементов находится в корне такого дерева.
В бинарной куче сложность операций вставки и извлечения составляет O(log n).
Обычный способ хранения полного бинарного дерева в памяти — это массив, где дочерние элементы для x[i] находятся в x[2*i+1] и x[2*i+2].
В Python нет бинарной кучи в виде класса, но предоставляется ряд функций, которые позволяют использовать список как бинарную кучу. Эти функции находятся в модуле
👉@BookPython
Одной из самых распространённых реализаций очереди с приоритетом является бинарная куча. Это полное бинарное дерево со следующим свойством: ключ, хранящийся в каждом узле, меньше или равен (≤) ключам в дочерних узлах. Минимум всех элементов находится в корне такого дерева.
1
3 7
5 4 9 8
15 16 17 18 19
В бинарной куче сложность операций вставки и извлечения составляет O(log n).
Обычный способ хранения полного бинарного дерева в памяти — это массив, где дочерние элементы для x[i] находятся в x[2*i+1] и x[2*i+2].
[1, 3, 7, 5, 4, 9, 8, 15, 16, 17, 18, 19]
В Python нет бинарной кучи в виде класса, но предоставляется ряд функций, которые позволяют использовать список как бинарную кучу. Эти функции находятся в модуле
heapq
.
In [1]: from heapq import *
In [2]: heap = [3,2,1]
In [3]: heapify(heap)
In [4]: heap
Out[4]: [1, 2, 3]
In [5]: heappush(heap, 0)
In [6]: heap
Out[6]: [0, 1, 3, 2]
In [7]: heappop(heap)
Out[7]: 0
In [8]: heap
Out[8]: [1, 2, 3]
👉@BookPython
Реализация парсеров с Pylasu
В этой статье рассказывается, как реализовать парсеры на Python с использованием Pylasu и ANTLR. Пошагово:
1. Создадим грамматику ANTLR для простого языка программирования Slang и сгенерируем парсер.
2. Определим абстрактное синтаксическое дерево (AST) с помощью Pylasu и научимся строить его из дерева разбора ANTLR.
3. Интегрируем парсер с CLI-приложением для обработки кода Slang из строк и файлов, с выводом AST в формате JSON.
Полный код проекта доступен на GitHub. Вы можете экспериментировать, вносить улучшения и делиться идеями!
https://tomassetti.me/implement-parsers-with-pylasu/
👉@BookPython
В этой статье рассказывается, как реализовать парсеры на Python с использованием Pylasu и ANTLR. Пошагово:
1. Создадим грамматику ANTLR для простого языка программирования Slang и сгенерируем парсер.
2. Определим абстрактное синтаксическое дерево (AST) с помощью Pylasu и научимся строить его из дерева разбора ANTLR.
3. Интегрируем парсер с CLI-приложением для обработки кода Slang из строк и файлов, с выводом AST в формате JSON.
Полный код проекта доступен на GitHub. Вы можете экспериментировать, вносить улучшения и делиться идеями!
https://tomassetti.me/implement-parsers-with-pylasu/
👉@BookPython
This media is not supported in your browser
VIEW IN TELEGRAM
Самый простой способ добавить вход по волшебной ссылке с использованием Django ✉️
Статья объясняет, как реализовать вход через "магическую ссылку" в Django. Описаны этапы настройки кастомной модели пользователя, конфигурации email-бэкендов, создания ссылок для верификации, а также добавления необходимых представлений и шаблонов.
Этот метод позволяет пользователям безопасно входить в систему без паролей, подтверждая вход через ссылку в email.
https://www.photondesigner.com/articles/email-sign-in
👉@BookPython
Статья объясняет, как реализовать вход через "магическую ссылку" в Django. Описаны этапы настройки кастомной модели пользователя, конфигурации email-бэкендов, создания ссылок для верификации, а также добавления необходимых представлений и шаблонов.
Этот метод позволяет пользователям безопасно входить в систему без паролей, подтверждая вход через ссылку в email.
https://www.photondesigner.com/articles/email-sign-in
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Python предоставляет мощную библиотеку для работы с датой и временем: datetime. Интересный момент заключается в том, что объекты datetime имеют специальный интерфейс для поддержки часовых поясов (а именно атрибут tzinfo), но этот модуль поддерживает интерфейс лишь частично, оставляя остальную часть задачи другим модулям.
Наиболее популярный модуль для этой задачи — pytz. Однако сложность в том, что pytz не полностью соответствует интерфейсу tzinfo. Документация pytz указывает на это одной из первых строк: «Эта библиотека отличается от документированного API Python для реализаций tzinfo».
Нельзя использовать объекты часовых поясов pytz в качестве атрибута tzinfo. Если попытаться это сделать, можно получить абсолютно неожиданные результаты.
Посмотрите на этот смещение +00:09. Правильное использование pytz выглядит следующим образом:
Кроме того, после любых арифметических операций вам следует нормализовать объект datetime на случай изменения смещения (например, на границе периода летнего времени).
Начиная с Python 3.6, рекомендуется использовать dateutil.tz вместо pytz. Он полностью совместим с tzinfo, может быть передан как атрибут, не требует нормализации, хотя работает немного медленнее.
👉@BookPython
Наиболее популярный модуль для этой задачи — pytz. Однако сложность в том, что pytz не полностью соответствует интерфейсу tzinfo. Документация pytz указывает на это одной из первых строк: «Эта библиотека отличается от документированного API Python для реализаций tzinfo».
Нельзя использовать объекты часовых поясов pytz в качестве атрибута tzinfo. Если попытаться это сделать, можно получить абсолютно неожиданные результаты.
In : paris = pytz.timezone('Europe/Paris')
In : str(datetime(2017, 1, 1, tzinfo=paris))
Out: '2017-01-01 00:00:00+00:09'
Посмотрите на этот смещение +00:09. Правильное использование pytz выглядит следующим образом:
In : str(paris.localize(datetime(2017, 1, 1)))
Out: '2017-01-01 00:00:00+01:00'
Кроме того, после любых арифметических операций вам следует нормализовать объект datetime на случай изменения смещения (например, на границе периода летнего времени).
In : new_time = time + timedelta(days=2)
In : str(new_time)
Out: '2018-03-27 00:00:00+01:00'
In : str(paris.normalize(new_time))
Out: '2018-03-27 01:00:00+02:00'
Начиная с Python 3.6, рекомендуется использовать dateutil.tz вместо pytz. Он полностью совместим с tzinfo, может быть передан как атрибут, не требует нормализации, хотя работает немного медленнее.
👉@BookPython