Python академия
7.72K subscribers
2.33K photos
5 videos
269 links
Python академия. Учи Python быстро и легко. По всем вопросам @evgenycarter
Download Telegram
Switch-конструкция с помощью словаря

Привет, на связи Адриан. Начинающие программисты достаточно часто спрашивают меня про switch-конструкции, а в Python их вобщем-то нет.

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

В этом примере я использовал lambda-функции для упрощения кода, но вместо них можете подставить любые другие. Объясню немного подробнее, lambda – объявление анонимной функции, x и y - принимаемые аргументы, x + y – возвращаемый результат.

Подписывайтесь на канал 👉@pythonofff
👍5💩1😐1
Генерация уникальных идентификаторов

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

Стандартный модуль uuid — быстрый и простой способ сгенерировать UUID (universally unique identifier), глобально уникальный идентификатор.

Так, мы можем создать случайное 128-битное число, которое наверняка будет уникальным. Существует более 2¹²² возможных UUID. Это более 5 ундециллионов, то есть 36 нулей.

Вероятность нахождения дубликатов в заданном наборе крайне мала. Даже при наличии триллиона UUID вероятность того, что среди них есть дубликат, гораздо меньше, чем один к миллиарду.

Вполне недурно для двух строк кода.

Подписывайтесь на канал 👉@pythonofff
👍5🤔1
Упаковка параметров с помощью urlencode

Новая неделя – новые знания. В это утро понедельника я подготовил для вас крайне практичный пост.

Довольно часто приходится работать с разнообразными API и совершать get-запросы с передачей множества параметров. Чаще всего составление запроса в коде выглядит примерно так:

url = 'https://example.com?item={}&size={}&color={}&amount={}'.format('t-shirt', 'M', 'white', 5)

Смотрится не слишком презентабельно, однако есть слегка более длинный, но значительно улучающий читаемость кода вариант – функция urlencode из из модуля urllib.

Подписывайтесь на канал 👉@pythonofff
👍1
⁠Кэширование функций

Кэширование может сэкономить время, когда связанная с вводом или выводом функция периодически вызывается с одинаковыми аргументами. Раньше приходилось создавать свою реализацию, но в Python 3.2+ появился декоратор lru_cache, который позволяет нам быстро кэшировать и вскрывать возвращаемые значения функции.

Давайте реализуем калькулятор чисел Фибоначчи с использованием кэша. Советую попробовать запустить любую рекурсивную функцию с кэшированием и без него, прирост в скорости замечается сразу.

Подписывайтесь на канал 👉@pythonofff
👍2
Ускоряем код с помощью векторизации

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

Вообще лучший способ ускорить любой цикл – это отказаться от него. В примере выше для работы с функцией my_func мы могли бы вызвать ее в цикле для каждого элемента списка, но гораздо проще использовать vectorize.

По сути, vectorize преобразует функцию таким образом, что она начинает принимать весь вектор целиком, а не отдельный его элемент. Надо помнить, что такой подход не всегда приводит к значительному ускорению.

Подписывайтесь на канал 👉@pythonofff
Explicit Conversion Flag

Флаг явного преобразования используется для преобразования значения поля format перед его непосредственным форматированием.

Это поле можно использовать для переопределения поведения format для какого либо конкретного типа и форматирования значения. В настоящее время распространены два явных флага преобразования:

!r – преобразует значение в строку, используя функцию repr()
!s – преобразует значение в строку, используя функцию str()

В примере, в случае с флагом !r строка 'Hello' будет напечатана с кавычками в поле шириной не менее 20 символов, а в случае с флагом !s – без кавычек (в более удобном для чтения виде).

Подписывайтесь на канал 👉@pythonofff
Вычисляем размер объектов в памяти

Чтобы вычислить размер какого-либо объекта, можно воспользоваться функцией sys.getsizeof(object[, default]). Поскольку Python написан в полном соответствии с парадигмой ООП, таким объектом может быть все что угодно.

Однако, следует помнить, что хотя все built-in (встроенные) объекты и вернут правильный размер, в общем случае это не должно быть верно для каких-либо пользовательских объектов.

Аргумент default позволяет определить значение, которое будет возвращено, если тип объекта не предоставляет средства для извлечения размера и вызовет TypeError .

Функция getsizeof вызывает метод __sizeof__ объекта и добавляет дополнительные служебные данные сборщика мусора, если конечно объект управляется сборщиком мусора.

Подписывайтесь на канал 👉@pythonofff
😐3👍2
⁠Автоматический счетчик во время итераций по коллекциям

Привет. Достаточно часто я наблюдаю ситуации, в которых новички создают "костыли", когда им необходим счетчик во время обхода коллекции. И вот решение проблемы.

Итак, встроенная в Python функция enumerate применяется для итерируемых коллекций (строки, списки, словари и другие) и создает объект, который генерирует кортежи, состоящие из двух элементов – индекса элемента и самого элемента.

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

Подписывайтесь на канал 👉@pythonofff
👍5
⁠Логические any и all

Одна из многих причин, почему Python является таким популярным языком, заключается в том, что он читаем и выразителен. Предлагаю взглянуть на прикрепленный ниже код.

Функция any возвращает значение True, если хотя бы одно из переданных утверждений верно, all – в случае, если все верны.

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

Подписывайтесь на канал 👉@pythonofff
👍4
⁠Блок else в циклах for

Хауди хо, друзья. Практически все новички теряются при виде блока else после циклов, поэтому сейчас немного проясним ситуацию.

В Python блок else может быть представлен не только в условных конструкциях после if, но и в циклах после for и while. В данном случае код внутри else выполняется, только если цикл не был прерван с помощью break.

Типичный пример использования – поиск чего-либо в цикле с использованием ключевого слова break при нахождении, как показано на картинке. Исходный код текстом можете найти в нашем чате.

Подписывайтесь на канал 👉@pythonofff
👍3
Прочитать произвольную строку из файла

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

И конечно же не обошлось без приветствия, вы специально заготовили несколько различных вариантов в файле text.txt:

Приветствую!
Здравствуйте!
Ку, здарова.
Добрый день!
Привет!

Чтобы вывести это на экран, может помочь функция getline из модуля linecache. В чем главное отличие этой функции от обычного метода чтения из файла? Функция getline кеширует все строчки файла в списке, так что следующие вызовы get_answer отработают моментально.

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

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

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

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

Подписывайтесь на канал 👉@pythonofff
👍4
Метод get для словарей

У словарей есть метод get, который возвращает значение по ключу, переданному в аргументах функции.

Однако если такого ключа в словаре нет, то исключение не выбрасывается, а возвращается значение по умолчанию, которое передаётся вторым аргументом, или же None, если второй аргумент не передан.

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

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

Модуль pyperclip имеет функции copy() и paste(), которые позволяют отправлять текст в буфер обмена вашего компьютера и получать его оттуда.

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

Установить этот модуль можно привычным способом через пакетный менеджер pip.

Подписывайтесь на канал 👉@pythonofff
👍2
Как легко отсортировать объект по нескольким ключам?

Перед нами стоит задача отсортировать список машин. Но сделать это нужно не просто по названию бренда или году производства, а сразу по обоим полям.
Решить эту задачу можно очень просто с помощью operator.itemgetter(). В результате все бренды сгруппированы и отсортированы по возрасту.

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

Встроенный модуль dis позволяет декомпилировать написанную вами программу в байт-код Python.

На картинке показана работа этого модуля на примере функции, но такое можно повторить и с классами – в таком случае все его функции будут дизассемблированы.

Подписывайтесь на канал 👉@pythonofff
Немного про цифры и юникод

0, 1, 2, 3, 4, 5, 6, 7, 8, 9 – не единственные символы, которые считаются цифрами. Python следует правилам Юникода и обрабатывает несколько сотен символов как цифры, полный список вот здесь.

Это влияет на такие функции, как int, unicode.isdecimal и даже re.match. Предупрежден – значит вооружен.

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

Привет, в этом посте разберем возможные в Python методы форматирования строк. Все примеры использования можете посмотреть на прикрепленной ниже картинке.

Самый древний и уже редко используемый способ – с помощью оператора %. Написание %s и %d зависит от того, что мы туда передаем и что хотим увидеть в итоге, но это уже тема отдельного поста.

В Python 2.6 появился метод .format() с немного отличающимся синтаксисом от существующего оператора %. К слову, этот метод активно используется и по сей день, в отличии от его предшественника.

Начиная с версии Python 3.6, доступны f-строки – свежий и наиболее производительный способ форматирования строк.

Подписывайтесь на канал 👉@pythonofff
👍3
Сортировка словаря по значениям

Сортировка данных словаря по значениям ключей, а не по самим ключам, нередко ставит в тупик.

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

Подписывайтесь на канал 👉@pythonofff
👍3
Списковые включения.

В python можно заменить громоздкие циклы, которые используются для заполнения списков. Самый простой пример использования списковых включений представлен в первом примере.

В примере 2 показано как можно добавить немного математики.

Вы даже можете использовать свои функции, как в примере 3.

Ну и куда без условного оператора? Посмотреть пример в онлайн редакторе.

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