Как реализовать анти-спам бота?
В данной статье автор рассказывает, как сделал для Телеграм-канала анти-спам бота. Ты узнаешь, почему не все решения подойдут для такой задачи, и как ChatGPT может облегчить задачу.
Читать...
Разъяснивший Python
В данной статье автор рассказывает, как сделал для Телеграм-канала анти-спам бота. Ты узнаешь, почему не все решения подойдут для такой задачи, и как ChatGPT может облегчить задачу.
Читать...
Разъяснивший Python
Хабр
Как ChatGPT удалил в нашем чате 555 спам-сообщений с точностью 98,38%
Небольшой православный телеграм-канал на ~4 тыс. чел., где я состою в числе редакторов, ежедневно атакуют спамеры. Ввиду его тематики к обычному спаму прибавляется еще и разный специфический, о чем я...
Атрибуты класса и атрибуты экземпляра (ч.1)
Переменные класса и переменные в экземплярах класса внутренне обрабатываются как словари объекта класса. Если имя переменной не найдено в словаре текущего класса, выполняется поиск по нему в родительских классах.
Разъяснивший Python
Переменные класса и переменные в экземплярах класса внутренне обрабатываются как словари объекта класса. Если имя переменной не найдено в словаре текущего класса, выполняется поиск по нему в родительских классах.
Разъяснивший Python
Атрибуты класса и атрибуты экземпляра (ч.2)
+= Оператор изменяет изменяемый объект на месте, не создавая новый объект. Таким образом, изменение атрибута одного экземпляра влияет на другие экземпляры, а также на атрибут class.
Разъяснивший Python
+= Оператор изменяет изменяемый объект на месте, не создавая новый объект. Таким образом, изменение атрибута одного экземпляра влияет на другие экземпляры, а также на атрибут class.
Разъяснивший Python
Масштабирование глубокого обучения с помощью Horovod и Kubernetes
В этой статье пойдет речь о том, как масштабировать модельки с помощью Horovod и Kubernetes.
Читать...
Разъяснивший Python
В этой статье пойдет речь о том, как масштабировать модельки с помощью Horovod и Kubernetes.
Читать...
Разъяснивший Python
Хабр
Масштабирование глубокого обучения с помощью Horovod и Kubernetes
Привет, Хабр! Horovod — это фреймворк для распределенного глубокого обучения, изначально разработанный в Uber . Он позволяет масштабировать обучение моделей на сотни и тысячи GPU, сокращая время...
Уступая от ... return! (ч.1)
Куда "wtf" делся? Это из-за какого-то особого эффекта yield from?
Начиная с Python 3.3, стало возможным использовать return инструкцию со значениями внутри генераторов (см. PEP380). В официальных документах говорится, что,
"... return expr в генераторе возникают причины StopIteration(expr), которые возникают при выходе из генератора".
Разъяснивший Python
Куда "wtf" делся? Это из-за какого-то особого эффекта yield from?
Начиная с Python 3.3, стало возможным использовать return инструкцию со значениями внутри генераторов (см. PEP380). В официальных документах говорится, что,
"... return expr в генераторе возникают причины StopIteration(expr), которые возникают при выходе из генератора".
Разъяснивший Python
Уступая от ... return! (ч.2)
В случае с some_func(3), StopIteration возникает в начале из-за return заявления. StopIteration Исключение автоматически перехватывается внутри list(...) оболочки и for цикла. Следовательно, два приведенных выше фрагмента приводят к пустому списку.
Чтобы получить ["wtf"] от генератора some_func, нам нужно перехватить StopIteration исключение.
Разъяснивший Python
В случае с some_func(3), StopIteration возникает в начале из-за return заявления. StopIteration Исключение автоматически перехватывается внутри list(...) оболочки и for цикла. Следовательно, два приведенных выше фрагмента приводят к пустому списку.
Чтобы получить ["wtf"] от генератора some_func, нам нужно перехватить StopIteration исключение.
Разъяснивший Python
Условное присваивание с оператором or
Иногда нужно задать значение по умолчанию, если переменная пуста или None. Вместо длинной конструкции if, можно использовать короткий трюк.
Итог:
Оператор or — удобный способ задать значение по умолчанию, когда переменная может быть пустой, None, 0 или ''. Упрощает код и делает его чище.
Разъяснивший Python
Иногда нужно задать значение по умолчанию, если переменная пуста или None. Вместо длинной конструкции if, можно использовать короткий трюк.
Итог:
Оператор or — удобный способ задать значение по умолчанию, когда переменная может быть пустой, None, 0 или ''. Упрощает код и делает его чище.
Разъяснивший Python
Nan-рефлексивность (ч.1)
'inf' и 'nan' - это специальные строки (без учета регистра), которые при явном приведении к float типу используются для представления математической "бесконечности" и "не числа" соответственно.
Поскольку, согласно стандартам IEEE NaN != NaN, соблюдение этого правила нарушает предположение о рефлексивности элемента коллекции в Python, т. Е. если x является частью коллекции, подобной list, реализации, подобные comparison, основаны на предположении, что x == x.
Разъяснивший Python
'inf' и 'nan' - это специальные строки (без учета регистра), которые при явном приведении к float типу используются для представления математической "бесконечности" и "не числа" соответственно.
Поскольку, согласно стандартам IEEE NaN != NaN, соблюдение этого правила нарушает предположение о рефлексивности элемента коллекции в Python, т. Е. если x является частью коллекции, подобной list, реализации, подобные comparison, основаны на предположении, что x == x.
Разъяснивший Python
Используй enumerate вместо счётчиков вручную
Когда нужно одновременно итерироваться по элементам и знать их индекс — не нужно делать это вручную!
Итог:
enumerate — твой друг при работе с индексами в цикле. Это Pythonic и избавляет от лишнего кода.
Разъяснивший Python
Когда нужно одновременно итерироваться по элементам и знать их индекс — не нужно делать это вручную!
Итог:
enumerate — твой друг при работе с индексами в цикле. Это Pythonic и избавляет от лишнего кода.
Разъяснивший Python
Распаковка словаря в аргументы функции
Иногда нужно передать значения из словаря в функцию — можно сделать это красиво и лаконично.
data автоматически распакует ключи словаря как имена аргументов, а значения — как аргументы функции.
Итог:
Когда у тебя есть словарь с нужными данными, не передавай каждый параметр вручную — просто используй . Это сокращает код и повышает читаемость.
Разъяснивший Python
Иногда нужно передать значения из словаря в функцию — можно сделать это красиво и лаконично.
data автоматически распакует ключи словаря как имена аргументов, а значения — как аргументы функции.
Итог:
Когда у тебя есть словарь с нужными данными, не передавай каждый параметр вручную — просто используй . Это сокращает код и повышает читаемость.
Разъяснивший Python
Nan-рефлексивность (ч.2)
Из-за прошлого предположения сначала сравнивается идентификатор (поскольку это быстрее) при сравнении двух элементов, а значения сравниваются только тогда, когда идентификаторы не совпадают.
Поскольку идентификаторы x и y различны, учитываются значения, которые также различны; следовательно, сравнение возвращается False на этот раз.
Разъяснивший Python
Из-за прошлого предположения сначала сравнивается идентификатор (поскольку это быстрее) при сравнении двух элементов, а значения сравниваются только тогда, когда идентификаторы не совпадают.
Поскольку идентификаторы x и y различны, учитываются значения, которые также различны; следовательно, сравнение возвращается False на этот раз.
Разъяснивший Python
Быстрая проверка времени выполнения с timeit
Иногда нужно быстро узнать, сколько времени занимает тот или иной фрагмент кода. Вместо написания таймеров — используй модуль timeit.
Модуль timeit точно измеряет производительность фрагмента кода и учитывает мелкие колебания времени.
Итог:
timeit — отличный инструмент для быстрой и точной оценки производительности. Удобен для сравнений разных реализаций алгоритмов и оптимизаций.
Разъяснивший Python
Иногда нужно быстро узнать, сколько времени занимает тот или иной фрагмент кода. Вместо написания таймеров — используй модуль timeit.
Модуль timeit точно измеряет производительность фрагмента кода и учитывает мелкие колебания времени.
Итог:
timeit — отличный инструмент для быстрой и точной оценки производительности. Удобен для сравнений разных реализаций алгоритмов и оптимизаций.
Разъяснивший Python
Распознаватель PDF-счетов
Данный проект позволяет извлекать нужные даннгые из PDF-документов. Работает следующим образом: сначала читается текст из PDF, находим дату, номер, сумму и поставщика, а затем сохраняем данные в JSON. При желании ты можешь переделать поиск под свои нужды.
Ссылка на код
Разъяснивший Python
Данный проект позволяет извлекать нужные даннгые из PDF-документов. Работает следующим образом: сначала читается текст из PDF, находим дату, номер, сумму и поставщика, а затем сохраняем данные в JSON. При желании ты можешь переделать поиск под свои нужды.
Ссылка на код
Разъяснивший Python
"Изменение" неизменяемого! (ч.1)
Это может показаться тривиальным, если вы знаете, как работают ссылки в Python.
Цитирую из https://docs.python.org/3/reference/datamodel.html
Неизменяемые последовательности Объект неизменяемого типа последовательности не может измениться после его создания. (Если объект содержит ссылки на другие объекты, эти другие объекты могут быть изменяемыми и могут быть изменены; однако коллекция объектов, на которые непосредственно ссылается неизменяемый объект, не может измениться.)
Разъяснивший Python
Это может показаться тривиальным, если вы знаете, как работают ссылки в Python.
Цитирую из https://docs.python.org/3/reference/datamodel.html
Неизменяемые последовательности Объект неизменяемого типа последовательности не может измениться после его создания. (Если объект содержит ссылки на другие объекты, эти другие объекты могут быть изменяемыми и могут быть изменены; однако коллекция объектов, на которые непосредственно ссылается неизменяемый объект, не может измениться.)
Разъяснивший Python
Исчезающая переменная из внешней области (ч.1)
Когда исключение было назначено с использованием as target, оно очищается в конце except предложения.
Это означает, что исключению должно быть присвоено другое имя, чтобы иметь возможность ссылаться на него после предложения except. Исключения удаляются, потому что с привязкой к ним обратной трассировки они образуют ссылочный цикл с фреймом стека, сохраняя все локальные файлы в этом фрейме живыми до тех пор, пока не произойдет следующая сборка мусора.
Разъяснивший Python
Когда исключение было назначено с использованием as target, оно очищается в конце except предложения.
Это означает, что исключению должно быть присвоено другое имя, чтобы иметь возможность ссылаться на него после предложения except. Исключения удаляются, потому что с привязкой к ним обратной трассировки они образуют ссылочный цикл с фреймом стека, сохраняя все локальные файлы в этом фрейме живыми до тех пор, пока не произойдет следующая сборка мусора.
Разъяснивший Python
Проверка типов переменной с помощью typing.get_origin и typing.get_args
Когда ты работаешь с аннотациями типов (особенно с Union, List[int], Optional[str] и т.п.), стандартной проверки isinstance() недостаточно.
Это удобно, когда ты хочешь программно проанализировать или валидировать типы в декораторах, валидаторах, фреймворках и библиотеках.
Итог:
С помощью get_origin и get_args ты можешь "распаковать" сложные типы и точно понимать, что за структура стоит за аннотацией. Очень полезно при создании универсальных функций или фреймворков.
Разъяснивший Python
Когда ты работаешь с аннотациями типов (особенно с Union, List[int], Optional[str] и т.п.), стандартной проверки isinstance() недостаточно.
Это удобно, когда ты хочешь программно проанализировать или валидировать типы в декораторах, валидаторах, фреймворках и библиотеках.
Итог:
С помощью get_origin и get_args ты можешь "распаковать" сложные типы и точно понимать, что за структура стоит за аннотацией. Очень полезно при создании универсальных функций или фреймворков.
Разъяснивший Python
Исчезающая переменная из внешней области (ч.2)
Эти предложения не ограничены в Python. Все в примере присутствует в той же области видимости, а переменная e была удалена из-за выполнения except предложения. То же самое не относится к функциям, которые имеют свои отдельные внутренние области.
В Python 2.x имя переменной e присваивается Exception() экземпляру, поэтому при попытке печати ничего не выводится.
Разъяснивший Python
Эти предложения не ограничены в Python. Все в примере присутствует в той же области видимости, а переменная e была удалена из-за выполнения except предложения. То же самое не относится к функциям, которые имеют свои отдельные внутренние области.
В Python 2.x имя переменной e присваивается Exception() экземпляру, поэтому при попытке печати ничего не выводится.
Разъяснивший Python
Таинственное преобразование типа ключа (ч.1)
И объект, s и строка "s" имеют одинаковое значение, потому что SomeClass наследуют hash метод str класса.
SomeClass("s") == "s" вычисляется как, True потому что SomeClass также наследует eq метод от str класса.
Разъяснивший Python
И объект, s и строка "s" имеют одинаковое значение, потому что SomeClass наследуют hash метод str класса.
SomeClass("s") == "s" вычисляется как, True потому что SomeClass также наследует eq метод от str класса.
Разъяснивший Python
👎1
Таинственное преобразование типа ключа (ч.2)
Поскольку оба объекта имеют одинаковое значение и равны, они представлены одним и тем же ключом в словаре.
Для желаемого поведения мы можем переопределить eq метод в SomeClass
Разъяснивший Python
Поскольку оба объекта имеют одинаковое значение и равны, они представлены одним и тем же ключом в словаре.
Для желаемого поведения мы можем переопределить eq метод в SomeClass
Разъяснивший Python
Давайте посмотрим, сможете ли вы догадаться об этом? (ч.1)
Согласно справочнику по языку Python, операторы присваивания имеют вид
Оператор присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделенный запятыми, последний выдает кортеж) и присваивает отдельный результирующий объект каждому из целевых списков слева направо.
+ In (target_list "=")+ означает, что может быть один или более целевых списков. В данном случае целевыми списками являются a, b и a[b] (обратите внимание, что список выражений равен ровно одному, что в нашем случае и есть {}, 5).
После вычисления списка выражений его значение распаковывается в целевые списки слева направо. Итак, в нашем случае сначала {}, 5 кортеж распаковывается в a, b, и теперь у нас есть a = {} и b = 5.
a теперь присвоен {}, который является изменяемым объектом.
Разъяснивший Python
Согласно справочнику по языку Python, операторы присваивания имеют вид
(target_list "=")+ (expression_list | yield_expression)
Оператор присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделенный запятыми, последний выдает кортеж) и присваивает отдельный результирующий объект каждому из целевых списков слева направо.
+ In (target_list "=")+ означает, что может быть один или более целевых списков. В данном случае целевыми списками являются a, b и a[b] (обратите внимание, что список выражений равен ровно одному, что в нашем случае и есть {}, 5).
После вычисления списка выражений его значение распаковывается в целевые списки слева направо. Итак, в нашем случае сначала {}, 5 кортеж распаковывается в a, b, и теперь у нас есть a = {} и b = 5.
a теперь присвоен {}, который является изменяемым объектом.
Разъяснивший Python