Python академия
7.73K subscribers
2.32K photos
6 videos
268 links
Python академия. Учи Python быстро и легко. По всем вопросам @evgenycarter
Download Telegram
Разница между == и is

Недавно в чате наши подписчики затрагивали эту тему, поэтому мы решили разложить всё по полочкам, чтобы в дальнейшем не возникало вопросов.

Итак, оператор == проверяет равенство значений двух объектов. А оператор is в свою очередь проверяет идентичность самих объектов. Его используют, чтобы удостовериться, что переменные указывают на один и тот же объект в памяти.

Однако Python в целях производительности кеширует короткие строки и малые целые числа, поэтому возможны некоторые казусы, как в примере.

Подписывайтесь на канал 👉@pythonofff
Как округлить до тысячных в python?

Вы можете использовать round()

Подписывайтесь на канал 👉@pythonofff
3👍1
Библиотека FuzzyWuzzy

Интересная и полезная библиотека поиска совпадений в тексте. Очень поможет вам при работе над общающимися ботами: голосовыми или текстовыми помощниками.

Разумеется, это один из инструментов, всегда можно использовать другой, но я лично пользуюсь этим.

Библиотеку следует установить:

install fuzzywuzzy

Подписывайтесь на канал 👉@pythonofff
👍2
Избегайте неоправданных циклов с коллекциями

Предположим, что требуется создать новый список, элементами которого будут являться квадраты чисел данного списка. Большинство сразу же напишут простенький цикл for.

Но в этом и проблема. Такой подход займет как минимум три строчки: объявление новой переменной, создание цикла и инструкции внутри него. При этом также снижается скорость работы скрипта.

На прикрепленной картинке я привел две достойные альтернативы, а именно использование генератора списков и функции map. В обоих вариантах не только код становится короче и выразительнее, но и заметно повышается производительность.

Подписывайтесь на канал 👉@pythonofff
👍1
"Быстрый" контейнер deque

Встроенных списков в Python иногда может не хватать, поэтому покажем одну хорошую альтернативу. Deque может быть реализован c помощью модуля collections.

Deque предпочтительнее, чем обычный список, в тех случаях, когда нам нужны более быстрые операции добавления и вытягивания элементо из обоих концов контейнера, поскольку deque обеспечивает линейную сложность O(1) для операций добавления и выталкивания по сравнению со списком, у которого сложность по времени для тех операций составляет O(n).

Также для deque есть возможность использовать стандартные функции по типу sum, min, max и тому подобные.

Подписывайтесь на канал 👉@pythonofff
3
Как проверить существование переменной в Python?

Вы можете использовать in locals() или in globals(), чтобы проверить переменная существует в Python, разница только:

in locals() проверяет если переменная объявлена в локальной зоне видимости
in globals() проверяет если переменная объявлена в глобальной зоне видимости

Подписывайтесь на канал 👉@pythonofff
👍42
Контекстные менеджеры

Контекстные менеджеры позволяют задать поведение при работе с конструкцией with: при входе и выходе из блока. Это упрощает работу с ресурсами в части их захвата и освобождения; транзакциями, когда нужно либо полностью закончить транзакцию, либо откатить ее целиком.

Простейшей функцией, использующей данный принцип является функция open. Каждый раз, когда мы открываем файл, нам необходимо его закрыть, чтобы вытолкнуть выходные данные на диск (на самом деле Python вызывает метод close автоматически, но явное его использование является хорошим тоном).

Чтобы каждый раз не вызывать метод close мы можем воспользоваться контекстным менеджером функции open, который автоматически закроет файл после выхода из блока.

Подписывайтесь на канал 👉@pythonofff
1
Вывод значения по умолчанию для отсутствующего ключа словаря

Если вы обратитесь к несуществующему ключу словаря, то это вызовет исключение. Избежать этого можно, вызывая метод get. В примере метод выдает None (по умолчанию) или заданное значение аргумента.

Подписывайтесь на канал 👉@pythonofff
1👍1
Декораторы

Очень важная тема, с помощью декорирования можно писать очень удобные логи или существенно расширять функции.

Многие библиотеки работают с использованием декораторов: Flask и aiogram хорошие тому примеры.

Мы показываем лишь простой пример, возможности куда шире. Позже покажем пример использования с упоминаемыми выше библиотеками.

Подписывайтесь на канал 👉@pythonofff
2
Удаление дубликатов в списке

Первое что приходит на ум — преобразовать список во множество и обратно. Это хороший и рабочий способ. Но если вам нужно сохранить последовательность, то этот способ не подойдёт. С этой задачей легко справится OrderedDict из модуля collections

Подписывайтесь на канал 👉@pythonofff
6🥰1
Как красиво напечатать json в Python?

Вы можете использовать json.dumps() в Python, чтобы красиво напечатать json.

Подписывайтесь на канал 👉@pythonofff
2👍2
Асинхронное программирование

Обычно мы пишем синхронный код - выполняется по порядку один за другим. Но иногда требуется, чтобы выполнялось несколько задач одновременно. К примеру, пока копируются файлы можно было поиграть в игру. Это возможно благодаря нескольким ядрам и потокам. ВАЖНО! Асинхронность не обязательно делает код быстрее, но может повысить его эффективность. В момент простаивания процессор будет переключаться на другие задачи.

На картинке программа, где повар готовит сразу несколько блюд. По другому бы нам пришлось по-очереди готовить каждое блюдо, но мы можем вернуться к другим, если поставили блюдо на огонь.

Подписывайтесь на канал 👉@pythonofff
8👏2
Библиотека JmesPath

Как вы уже заметили работать с json файлами в python очень удобно, ведь они отлично конвертируется в словарь. Также мы разобрали полезную библиотеку json, поэтому еще раз говорить о ней не будем.

Но вот нам надо получить данные из файла. А формат json, как правило имеет множество вложений. Искать что-то нужное можно, но не всегда это удобно и красиво (а дзен Python говорит, что красота имеет значение)

JmesPath облегчает работу в несколько раз. Вместо file['a']['b']['c'] можно написать jmespath.search('a.b.c', file). Кажется стало длиннее, но это потому что мы взяли мало элементов, и согласитесь a.b.c выглядит лучше. Даже отредактировать в случае чего будет проще.

Подписывайтесь на канал 👉@pythonofff
Библиотека schedule

Гибкая библиотека для создания планировщика. Точнее с её помощью можно создавать задачи, которые будут выполняться с определенным интервалом. Промежуток настраивается как душе угодно и работает до выключения пользователем приложения.

Конечно можно было использовать стандартный таймер, но зачем изобретать велосипед? С данной библиотекой планировка задач станет намного проще и понятнее другим программистам.

Библиотеку необходимо установить:

install schedule

В примере используется seconds, но можно использовать minutes, hour, day.at("8:00"), monday, minute.at(":17"). Если добавлять at, то указываем во сколько именно произойдет событие.

Подписывайтесь на канал 👉@pythonofff
👍4
Библиотека Progressbar

Думали ли вы когда-нибудь над полоской прогресса? Иногда бывает полезно добавить в код отображение прогресса, чтобы пользователь не беспокоился, что программа не отвечает.

В первую очередь это касается синхронных приложений. Ведь, если наш код выполняет что-то одно, то на другие действия он не будет реагировать, ставя их в очередь. Ну и еще один вариант показывать, что программа не виснет, а думает, при этом не обязательно показывать прогресс.

Все это очень интересно, но если мы начнем самостоятельно писать полосу прогресса, то отвлечемся от основного кода. К счастью, в python есть библиотека Progressbar, которая делает все за нас.

Подписывайтесь на канал 👉@pythonofff
👍5🔥1
Избегайте пустого списка

Пустой список нельзя использовать как аргумент по умолчанию в Python из-за того, что значения по умолчанию для аргументов функции вычисляются только один раз, при определении функции. Если вы попытаетесь использовать пустой список в качестве значения по умолчанию для аргумента функции, то он будет создан при определении функции и будет ссылаться на один и тот же объект в памяти каждый раз, когда функция вызывается.

Это означает, что если внутри функции изменяется пустой список, то изменение будет сохранено в этом списке для всех последующих вызовов функции, так как все они будут использовать один и тот же объект списка. Это может привести к неожиданным и нежелательным результатам, так как изменение списка в одном вызове функции может повлиять на другие вызовы, которые рассчитывают на неизменность значения по умолчанию.

Чтобы избежать подобных проблем, рекомендуется использовать в качестве значения по умолчанию неизменяемые объекты, такие как None, числа или строки. Если необходимо использовать изменяемый объект, то лучше создавать его внутри функции, чтобы каждый вызов функции работал с отдельным экземпляром объекта и не влиял на другие вызовы.


def my_function(my_list=None):
if my_list is None:
my_list = []
my_list.append("element")
print(my_list)

my_function() # ["element"]
my_function() # ["element"] (не изменяет значение по умолчанию)


В приведенном примере использовано None как значение по умолчанию для аргумента функции, и внутри функции создается новый пустой список, если аргумент не был передан. Это позволяет избежать проблем с изменяемыми объектами и гарантирует, что каждый вызов функции работает с отдельным списком, не влияя на другие вызовы.

Подписывайтесь на канал 👉@pythonofff
👍4👏3
infinity

Самая типичная проблема при написании некоторых сортировок — назначение самой большой переменной. Часто она решается простым вводом большого числа или возведением в степень. Это, конечно, не стареющая классика, но метод максимально не надежный, а главное есть более удачные способы

float('infinity') или float('inf') для получения максимально возможного числа

float('-infinity') или float('-inf') для получения минимально возможного числа.

Не работает с int, требуется использовать именно float.

Подписывайтесь на канал 👉@pythonofff
👍2😁1
Замена текста с re.sub()

Метод re.sub() в модуле re является функцией, которая позволяет заменять фрагменты строки в соответствии с определенным шаблоном. Этот метод очень полезен при работе с регулярными выражениями в Python, так как он позволяет легко заменять или модифицировать текст в строке.

Для использования метода re.sub(), необходимо передать ему три аргумента: шаблон (регулярное выражение), строку замены и строку, в которой нужно произвести замену. При этом, если шаблон не найден в строке, то замена не будет выполнена.

Пример использования метода re.sub():


import re

text = "Hello, World!"
new_text = re.sub(r"Hello", "Hi", text)
print(new_text) # Output: Hi, World!


В данном примере мы импортируем модуль re, создаем переменную text с исходным текстом «Hello, World!» и заменяем слово «Hello» на «Hi» с помощью метода re.sub(). Результатом будет строка «Hi, World!».

Подписывайтесь на канал 👉@pythonofff
👍4
hex, oct, bin

Приходилось вам раньше работать с различными системами счисления? Если да, то вы знаете, как написать программу переводящую из одной системы в другую. Пишется она довольно просто, но иногда стоит задача быстро написать код с какой-то популярной системой счисления. Обычно это двоичная, восьмеричная или шестнадцатеричная. Для всех этих систем есть встроенные функции, которые переводят в нужную нам систему!

Из 10-ричной:
hex - перевод в 16-ричную систему
oct - перевод в 8-ричную систему
bin - перевод в 2-ичную систему

А из любой системы счисления можно получить число максимально простым способом:
int(number, base)

Подписывайтесь на канал 👉@pythonofff
👍3
Регулярные выражения

Метод sub позволяет заменить в строке по шаблону на нужный нам текст.

repl, string, max=0)

pattern - шаблон
repl - на что заменяем
string - строка по которой ищем
max - сколько раз заменяем

Соответственно, этот метод возвращает нужную нам строку.

Подписывайтесь на канал 👉@pythonofff
5👍1