Продолжаем исследование книг по Питону и сегодня на обзоре «Python. Полное руководство» Кольцова Д. М., которая гарантирует, что вы начнете уверенно работать с языком Python с нуля: от базовых основ до ООП, включая метапрограммирование, многопоточность, масштабирование и наглядные практические примеры. Одним словом «Полное руководство».
Книга относительно новая, в ней используется Python 3.9. По крайней мере так заявлено в первой главе, но как мы увидим позже это не совсем так. Тем не менее это всё равно третий питон, а следовательно все программы нужно писать в кодировке UTF-8, и Дмитрий Михайлович об этом тоже говорит.
Также он приводит пример как запустить код, если он находится в другой кодировке, скажем в windows-1251. Для этого в верхней строке программы надо написать так:
# _*_ coding: cp1251 _*_
И далее автор пишет, что для UTF-8 файлов можно указать вот такую строку:
# _*_ coding: utf-8 _*_
Но так как Python 3 использует UTF-8 по умолчанию, то её можно и не указывать. И тут Дмитрий добавляет, что наличие такой строки в ваших программах свидетельствует о хорошем тоне.
Нет, друзья. Не свидетельствует. Скорее наоборот. Не помню за последние лет 10 или 15 ни одной программы на Python 3, в которой бы явно указывали кодировку, не говоря уже про UTF-8. Это как минимум странно. И уж точно не относится к хорошему тону.
Списывание
Далее автор вводит еще несколько тем и тут я натыкаюсь вот на такую строку:
И понимаю, что я её уже где-то видел. Разумеется, я её видел много раз в официальной документации. Но тут другой случай. Похожая строка была в одной из книг, на которые я делал обзор. Я покопался и нашел — «Python 3. Самое Необходимое» Дронова и Прохоренка:
И проблема была в том, что данное описание функции print() может отпугнуть новичка. Тут реально ничего не понятно. И если Дронов с Прохоренком приводят много примеров, которые раскрывают возможности print(). То у Кольцова всё по верхам.
Более того, само форматирование функции у Кольцова не совсем корректное (запятые и пробелы расставлены не так).
А еще у него отсутствует параметр flush, который появился в Python 3.3. То есть выходит, что эта строка в книгу попала очень давно. При том, что у Дронова и Прохорёнка всё ОК.
И тут я решил сравнить эти книги и обнаружил очень интересную особенность. Сразу после принта в обеих книгах идет описание sys.stdout.write(), что уже странно, а после и input(). Причем примеры очень похожи. Именно концептуально.
Тот случай, когда ученик списывает, но при этом ему хватает смекалки внести такие изменения, чтобы было незаметно, что он списывает. Как будто это он сам. С этими книгами также.
Я решил копнуть еще чуть глубже и если мы сравним содержание этих книг, то найдем там очень много похожих друг на друга разделов. Например, в главе про строки последний раздел в обеих книгах посвящен шифрованию строк с помощью hashlib:
Или, например, глава про работу с интернетом в обеих книгах начинается с Разбора URL-адреса, после чего идет кодирование и декодирование.
И таких пересечений тут полно. Явно кто-то, если не списывал, то как минимум подглядывал. Но давайте вернемся к полному руководству и посмотрим, что в этой книге есть уникального.
Сложное повествование
И из уникального я обнаружил периодические провалы в повествовании, а также плохую структурированность и излишнюю сложность текста.
В какой-то момент я решил заглянуть в главу про словари. И там практически с самого начала, автор приводит функцию zip(), с помощью которой генерирует словарь на базе кортежей:
И это не новичковый уровень. Конечно, в предыдущих главах было описание функции zip(), но начинать изучение словарей с этого не лучшая тактика. Да и само описание, сам текст очень тяжело читается.
А еще автор пишет, что ключи словаря выводится в произвольном порядке, но это уже давно не так. Кажется, где-то с версии 3.6 ключи начали выводиться в порядке их добавления.
И в итоге в начале книги нам обещают Python 3.9, но фактически мы видим что-то ближе к Python 3.0. И бы даже сказал, что начало книга берет где-то во второй версии. И это проблема многих книг.
Так как для подготовки издания к новой версии, нужно полностью пересмотреть все формулировки и перезапустить все примеры. Это сложная и кропотливая работа. Хорошо с ней справился Тони Гэддис, когда переходил с 4-го издания на 5-е, но тут нет.
Справедливости ради я посмотрел про словари у Прохоренка и Дронова. И они тоже начинаются с функции zip():
Вся структура главы как под копирку. Разница только в самих текстах и примерах. И у Кольцова примеры мне понравились больше. Выбор ключей и значений для словарей более наглядный. Если у Прохоренка используются ключи a, b, c и значения, 1, 2, 3, то в полном руководстве это name, surname и так далее. Но в то же время у Дронова количество примеров примерно в 1,5 раза больше. Так что всё относительно.
При этом, помимо содержания, в книге есть проблемы с вёрсткой, не критичные, но всё же. Между некоторыми строками стоит двойной отступ. И так чуть ли не на каждой странице:
А еще автор раньше явно писал на Паскале, так как он, во-первых, зачем-то приводит фрагмент кода на Pascal.
А во-вторых, даёт странный совет про что, что все необходимые переменные желательно объявлять в начале программы путем присваивания им начальных значений. Как это было в паскале и многих компилируемых языках программирования. Но нет, тут мы изучаем питон и не надо всё оформлять под одну гребенку.
Не для новичков
При этом, даже несмотря на проблемы с версткой, в книге много примеров, и они вполне рабочие.
Есть разные продвинутые шаблоны, регулярные выражения, декораторы, рекурсия, работа с множествами и датой, обработка CSV, JSON и XML файлов, взаимодействие с сетью и даже многопоточность.
Но всё это не для новичков в программировании. Для бывалых программистов — да, вполне сойдет. Но чтобы эти темы раскрыть для начинающих разработчиков, книга должна быть в два, а то и в три раза больше. А тут галопом по Европам. Да есть ООП, но там всего 14 страничек, часть из которых посвящена перегрузке операторов, а также декораторам классов. Что опять же не для новичков.
Также в книге есть информация про метапрограммирование и метаклассы, но зачем они здесь, да еще и с искусственными примерами? Загадка.
При этом сложность метаклассов надо дополнительно умножить на тяжесть повествования. Книгу реально тяжело читать.
И в итоге если выбирать между двумя книгами, я бы выбрал Дронова и Прохоренка. Потому что, во-первых, они проходятся практически по тем же темам. Но у них более понятные объяснения и больше примеров. А во-вторых, у них есть главы про базы данных. А у Кольцова ничего подобного.
Высокий балл поставить книге я объективно не могу, так как она откровенно слабая.