Python академия. Учи Python быстро и легко. По всем вопросам @evgenycarter
Priming
В предыдущем примере была строчка кода, в которой мы отправили значение None в только что созданную корутину перед её использованием.
Такое действие называется priming корутины (на русский сложно адекватно перевести). В случае, если не выполнить эту операцию, возникнет исключение TypeError.
Priming корутины может быть выполнен либо путем передачи None (на что и намекает сообщение ошибки), либо просто вызовом функции next с передачей корутины. И эта операция должна быть выполнена обязательно ровно один раз в самом начале.
Подписывайтесь на канал 👉@pythonofff
Генераторы
В этом посте освежим знания про генераторы, чтобы далее разобрать такую интересную тему, как корутины.
Функции-генераторы выглядят как и обычные, но содержат выражения с ключевым словом yield для последовательного генерирования значений. В целом, генератор – это особый, более изящный случай итератора.
Вызов подобной функции вернёт не значение, а объект генератора. Далее из этого объекта можно получать значения, например, с помощью функции next или циклом for.
Если генератору больше нечего возвращать, то будет вызвано исключение StopIteration.
Подписывайтесь на канал 👉@pythonofff
Нижнее подчеркивание
В Python имя переменной может состоять из одного подчеркивания: _. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _ имеет общепринятый смысл.
Во-первых, _ используется, когда вам нужно придумать имена для значений, которые вам не нужны – например, в циклах for.
Во-вторых, интерактивный режим использует _ для хранения результата последнего выполненного выражения.
В-третьих, руководство модуля gettext рекомендует псевдоним его функции gettext() для _(), чтобы минимизировать загромождение вашего кода.
Подписывайтесь на канал 👉@pythonofff
Сравнение строк другими операторами
Для сравнения строк в Python используются не только == и !=. Как и при сравнении чисел, мы можем использовать операторы <, >, <= и >=.
Мы присваиваем значение «chinese» для string и «china» для string1. Теперь сравним эти две строки с помощью операторов сравнения <, >, <=, >=.
После сравнения string и string1 оператором < мы получаем False. Первые четыре символа «chinese» и «china» идентичны. Однако пятый символ переменной string – «е», в то время как пятый символ string1 – «а». Значение «e» в Юникоде равно 101, а «a» – 97. Таким образом, в результате сравнения этих переменных «chinese» оказывается больше, чем «china».
Подписывайтесь на канал 👉@pythonofff
__new__ и __init__
new используется, когда нужно определить кортежи dict или base перед созданием класса. Возвращаемое значение new обычно является экземпляром cls. new позволяет подклассам неизменяемых типов настраивать создание экземпляров. Его можно переопределить в пользовательских метаклассах, чтобы настроить создание класса.
init обычно вызывается после создания объекта для его инициализации.
Подписывайтесь на канал 👉@pythonofff
Проектирование Singleton с использованием метакласса
Данный шаблон проектирования ограничивает создание экземпляра класса только одним объектом. Это может оказаться полезным, например, при разработке класса для подключения к базе данных. Возможно, вы захотите иметь только один экземпляр класса соединения.
Подписывайтесь на канал 👉@pythonofff
Множественное наследование без super()
Давайте рассмотрим пример множественного наследования без изменения каких-либо родительских методов и, в свою очередь, без super().
Подписывайтесь на канал 👉@pythonofff
Избавляемся от вложенных циклов с помощью функции product
Вложенные циклы — настоящая головная боль. Они усложняют не только сам код, но и его читаемость. Выход из этих циклов — задача тоже сложная. Чтобы найти ошибку, приходится приложить много усилий, ведь нужно проверить каждый внутренний цикл.
К счастью, существует очень полезная встроенная функция — product. Она является частью встроенного модуля Python — itertools. С ее помощью мы можем избавиться от вложенных циклов.
Подписывайтесь на канал 👉@pythonofff
Считываем бинарный файл со строковыми данными в массив байтов
Функция open() открывает для чтения string.bin, а функция read() на каждой итерации цикла while считывает по 7 символов в файле и выводит их. Далее мы используем функцию read() еще раз, но уже без аргументов — для считывания всего файла. После считывания содержимое выводится на экран.
Подписывайтесь на канал 👉@pythonofff
Примитивный метод удаления символа из строки
Суть этого метода проста. Мы пишем цикл и создаем новую пустую строку. Цикл работает так: все символы кроме элемента с индексом n помещаются в новую строку. (n — индекс элемента, который нам нужно удалить)
Подписывайтесь на канал 👉@pythonofff
Считываем бинарный файл со строковыми данными в массив
Бинарный файл содержит список с числовыми данными. Функция open() открывает файл и читает из него данные. Затем из бинарника читаются первые 5 чисел и перед выводом объединяются в список.
Подписывайтесь на канал 👉@pythonofff
Удаление символа с помощью метода join() и генераторов списков
Суть этого метода в том, чтобы конвертировать строку в эквивалентный список. После этого все элементы кроме того, который мы собираемся удалить, объединяются в строку.
Подписывайтесь на канал 👉@pythonofff
Возведение в квадрат всех чисел в заданном диапазоне
В этом фрагменте для нахождения квадрата каждого целого числа в заданном диапазоне прибегнем к помощи встроенной функции itertools
Подписывайтесь на канал 👉@pythonofff
Вычисление времени выполнения в оболочке
Иногда важно знать время выполнения в оболочке или в блоке кода для получения лучшего алгоритма с минимальным количеством затраченного им времени
Подписывайтесь на канал 👉@pythonofff
Подборка Telegram каналов для программистов
Системное администрирование 📌
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT.
/channel/phis_mat Обучающие видео, книги по Физике и Математике
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
Чат программистов📌
/channel/developers_ru
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Английский 📌
/channel/UchuEnglish Английский с нуля
Математика 📌
/channel/Pomatematike Канал по математике
Excel лайфхак📌
/channel/Excel_lifehack
Корутины (Coroutines)
В PEP 342 были представлены корутины, которые стали некой противоположностью генераторов. Для примера напишем функцию, которая будет в бесконечном цикле подставлять значение и выводить строку.
Обратите внимание на то, как было использовано ключевое слово yield. При таком написании создаётся корутина, а не генератор, что позволяет не просто генерировать значения, но и принимать их.
Функция работает так: при отправке значения через метод send локальная переменная name принимает его, а далее значение подставляется в строку и выводится на экран.
Подписывайтесь на канал 👉@pythonofff
Оператор pass
В ходе исполнения данного оператора ничего не происходит, поэтому он может использоваться в качестве некой заглушки в тех местах, где это синтаксически необходимо.
Например, вам надо сделать несколько функций, вы написали def'ы и названия, но сам код еще не успели, однако программу надо запустить и проверить что-то другое. Вот тут и понадобится pass.
Или в конструкции try-except, чтобы просто проигнорировать и никак не обрабатывать ошибку в программе.
Подписывайтесь на канал 👉@pythonofff
Функция itertools.cycle
В пайтон есть классный модуль itertools для создания собственных итераторов. Функции данного модуля довольно эффективны в работе, поэтому их часто используют в реальных проектах.
Сегодня мы бы хотели показать вам функцию cycle() из itertools. Данная функция принимает на вход итерируемый объект и создает бесконечный итератор, циклически возвращающий элементы данного объекта. Фишка заключается в том, что когда элементы последовательности заканчиваются, итерация начинается вновь с первого элементы.
К примеру, функция cycle() из последовательности ['red', 'white', 'blue'] генерирует повторяющуюся бесконечную. Но важно при проходе при итерации по такому итератору предусмотреть выход из цикла (а не как у нас в первом случае с colors:). Так как это итератор, то мы можем использовать его для получения значений через функцию next(colors).
Мы также можем воспользоваться islice(), который вернет итератор по подмножеству переданного объекта.
Подписывайтесь на канал 👉@pythonofff
Находим соответствия в строках
В стандартной библиотеке Python существует модуль difflib, в котором есть интересный метод get_close_matches. Он позволяет найти в списке строки, похожие на некую исходную.
Данный метод ищет "наилучшие" возможные совпадения. Первый аргумент задаёт искомую строку, второй аргумент – список, в котором выполняется поиск.
Также в метод можно передать необязательный аргумент n, который задаёт максимальное число возвращаемых совпадений.
Подписывайтесь на канал 👉@pythonofff
Смягчение грамматических ограничений декораторов
Ещё один приятный момент из недавнего обновления связан с декораторами. В целом, нового здесь немного, но появилась возможность слегка упросить код.
Изменение позволило заметно улучшить читаемость кода на PyQt5 и упростить сопровождение данного модуля.
Подписывайтесь на канал 👉@pythonofff
Новый оператор объединения словарей
В Python есть много разных способов объединить несколько словарей. Мне, например, больше всего нравилась распаковка словарей в один новый.
Но в последнем обновлении добавили специальный оператор |, с помощью которого можно это делать ещё проще.
Подписывайтесь на канал 👉@pythonofff
Дробные числа
По умолчанию числа с плавающей точкой используют память привычным образом, то есть они хранятся в двоичном виде. Это означает, что вы обычно работаете с приблизительными значениями, а не точными.
Можно использовать тип данных Decimal, который предоставит намного большую точность, но и его может не хватить в некоторых случаях.
Поэтому для идеальных вычислений лучше использовать Fraction, который представляет и хранит число в виде рациональной дроби.
Подписывайтесь на канал 👉@pythonofff
Инкремент с помощью __pos__
В Python нет операции инкремента ++ как в си-подобных языках, поэтому используется x += 1. Однако запись ++x является валидным кодом (но не x++), так как это просто два унарных оператора сложения.
При применении унарного плюса у объекта вызывается магический метод __pos__, то есть запись ++x можно понять как x.__pos__().__pos__(). Зная это, можно реализовать класс, который будет представлять число и поддерживать поведение инкремента.
Код на картинке может показаться сначала немного сложным, но лучше проследить логику и понять работу метода __pos__. Если реализовать все остальные необходимо магические методы, то может получится полноценный класс числа, но в продакшне такие приколы лучше не писать.
Подписывайтесь на канал 👉@pythonofff
Лимит рекурсии
В Python не поддерживается хвостовая рекурсия, из-за чего зачастую возникает RecursionError во время создания рекурсивных алгоритмов. Но с помощью модуля sys можно посмотреть и даже изменить максимальную глубину рекурсии.
Однако делать это слегка опасно, так как каждый новый вызов занимает достаточно много памяти. И вообще лучше стараться использовать не рекурсию, а обычные циклы.
Подписывайтесь на канал 👉@pythonofff
Символы Юникода
Добавлять юникод-символы в строковые литералы можно не только с помощью их номеров, но и по их названиям.
Более того, такая запись символов юникода совместима и с f-строками, а это очень удобно.
Подписывайтесь на канал 👉@pythonofff
Создание словаря из набора ключей
Для создания словаря из известного набора ключей и одинаковых значений часто используют генераторы словарей (dict comprehensions).
Однако класс dict имеет удобный метод fromkeys, который был создан специально для таких случаев.
Подписывайтесь на канал 👉@pythonofff
Функция reduce
Модуль functools позволяет хорошо раскрыть функциональные возможности Python. Например, в functools есть интересная функция reduce, которая позволяет «сжимать» данные, применяя последовательно функцию и запоминая результат.
Таким образом, в примере выше reduce умножает 1 на 2, затем результат этого умножения на 3 и так далее.
Подписывайтесь на канал 👉@pythonofff
Функция zip
Функция zip создаёт итератор, который комбинирует элементы нескольких списков. Это позволяет осуществлять параллельный обход списков в циклах for или, например, выполнять параллельную сортировку.
Подписывайтесь на канал 👉@pythonofff
Нахождение наиболее частых элементов списка
Если необходимо найти несколько наиболее часто повторяющихся значений, лучше воспользоваться счетчиком Counter из библиотеки collections.
Метод Counter.most_common(x) возвращает x кортежей, в которых первое значение – элемент, а второе – количество его повторений.
Подписывайтесь на канал 👉@pythonofff
Ключевое слово del
Для удаления элемента из списка можно использовать ключевое слово del с названием списка после него. Также потребуется передать индекс того элемента, который нужно удалить.
Подписывайтесь на канал 👉@pythonofff