Автор оригинала: Adam McQuistan.
Вступление
Эта статья будет продолжением темы моей предыдущей статьи, посвященной подготовке к интервью с разработчиком Python, где я высказал свои мнения и предложения, которые, по моему мнению, поставят вас в лучшее положение, чтобы превзойти других разработчиков, конкурирующих за роль разработчика Python. В этой статье я буду рассматривать популярный курс Udemy по подготовке к собеседованию с разработчиком Python по телефону .
Прежде чем начать, мы должны упомянуть, что существует множество способов практиковать вопросы интервью по программированию , включая такие сервисы, как Daily Coding Problem , которые будут посылать вам по электронной почте новую проблему для решения каждый день.
Структура и темы, затронутые в Курсе
Структура этого курса состоит из разделов, охватывающих темы, перечисленные ниже, где каждый раздел заканчивается либо одним, либо несколькими упражнениями или викторинами для усиления материала.
Темы, затронутые Николаем в его курсе, следующие:
- Коллекции со списками и кортежами
- Введение в ООП на Python
- Модульное тестирование
- Идиоматический питон – Просите прощения, а не разрешения
- Должен знать Конструкции программирования Python
- Должен знать Структуры данных Python
- Подробнее об ООП в Python
- Понимание структуры данных
В следующих разделах я кратко обсуждаю содержание каждого раздела вместе с тем, что мне нравилось и не нравилось в каждом. Я заканчиваю дополнительным разделом, в котором обсуждаются вещи, которые, по моему мнению, выиграли бы от этого, если бы они были включены или сделаны по-другому.
Прежде чем перейти к отдельным разделам, я хотел бы отметить, что этот курс преподавался с использованием “устаревшего” Python 2.7, что, по моему мнению, является небольшим недостатком в курсе. Сообщество Python находится чуть более чем в году от полной потери поддержки со стороны основной команды разработчиков в отношении обслуживания Python 2. По этой причине я считаю необходимым, чтобы производители контента Python на 100 процентов приняли и использовали Python 3.
Коллекции со списками и кортежами
Коллекции-чрезвычайно важная тема во всех языках программирования высокого уровня, и Python, безусловно, не является исключением из этого правила, поэтому я очень рад, что они были рассмотрены в этом курсе. Николас хорошо проводит различие между неизменяемостью и изменяемостью по отношению к спискам и кортежам, которые, на мой взгляд, являются основными дифференциаторами между ними.
К сожалению, было выдвинуто обвинение в реализации списков и кортежей, которые я нашел либо очень вводящими в заблуждение, либо совершенно неверными. В этом разделе Николас утверждает, что “списки содержат однородные типы данных, в то время как кортежи должны содержать гетерогенные типы данных”. Сначала я думал, что это просто безобидная оплошность, к которой все подвержены в жизни, но позже в этом разделе она была повторена и даже подкреплена в одном из завершающих викторин раздела.
Я хотел бы потратить некоторое время, чтобы исправить это утверждение, поскольку считаю, что Николас, вероятно, пытался описать общую тенденцию использования, когда списки часто содержат однородные типы данных, в то время как кортежи часто могут содержать гетерогенные типы данных. По моему опыту, когда я использую списки, данные в них обычно одного и того же типа. Однако важно знать, что и списки, и кортежи на самом деле могут содержать разные типы данных, а также одни и те же.
Вот пример списков и кортежей, содержащих одни и те же типы данных, которые являются строками, представляющими буквы моего имени:
>>> x = ['a','d', 'a', 'm'] >>> y = ('a', 'd', 'a', 'm')
А вот пример списков и кортежей, содержащих различные типы данных строки, представляющей мое имя, и целого числа, представляющего мой возраст:
>>> x = ['Adam', 30] >>> y = ('Adam', 30)
Введение в ООП на Python
В этом разделе Николас объясняет очень важную особенность языка программирования Python в том, что каждый отдельный элемент языка имеет форму объекта. Из этого вы можете экстраполировать, что язык является полностью объектно-ориентированным языком. Николас продолжает демонстрировать и объяснять использование и полезность многих встроенных функций, которые позволяют программисту проверять такие объекты, как dir ()
, id ()
, help()
и другие.
Тем не менее, Николас действительно противоречит своим более ранним утверждениям о гомогенности/гетерогенности типов данных в списках в этом разделе, которые, как я надеюсь, могут быть очищены, поскольку я считаю, что большинство ранних пользователей Python будут совершенно сбиты с толку на этом этапе курса.
Модульное тестирование
Этот раздел курса произвел на меня самое сильное впечатление. Я чувствую, что многие, если не большинство, курсов по программированию часто не учитывают важность тестирования своего кода. Николас отлично справляется с основами модуля unittest
и даже посвящает значительное время объяснению того, как использовать test driven development и почему это важно.
Идиоматический питон – Просите прощения, а не разрешения
Это та часть курса, где Николас начинает переходить к общим конвенциям или идиомам сообщества программирования Python. Я не хочу красть гром Николаса, заходя слишком далеко в объяснении материала, рассмотренного здесь, потому что я считаю, что он делает большую работу, объясняя, что значит “просить прощения, а не разрешения”, и как эта конвенция отличается в Python в отличие от других языков, таких как Java.
Должен знать Конструкции программирования Python
Я был немного смущен тем, почему этот раздел курсов существует и почему он был помещен в середину курса. В этом разделе рассматриваются самые основные синтаксические конструкции, такие как логические выражения, условные выражения и циклы. Для курса, ориентированного на разработчиков Python среднего и старшего уровня, мне показалось, что этот раздел должен быть предполагаемым знанием, но я думаю, что для полноты картины не будет неуместным включить его. Однако я думаю, что, возможно, было бы лучше поместить этот материал в начале курса.
С учетом вышесказанного об этом разделе я действительно хочу оставить свой отзыв об этом разделе с чем-то, что я нашел довольно позитивным. Мне понравилось, что Николас объяснил, что значит в языке считаться правдивым/ложным, украсть термин из сообщества Javascript. Николас проделал большую работу, потратив время на описание полезности встроенной функции bool()
для проверки логических эквивалентов обычно используемых условных выражений для проверки таких значений, как пустые списки, пустые строки, None и другие.
Должен знать Структуры данных Python
Здесь Николас вводит дополнительный тип данных коллекции, который известен как set
и следует за сравнением наборов и списков. Во время этого объяснения он охватывает понятие того, что значит быть хешируемым.
Однако одна вещь, которую я чувствовал, что здесь не хватает, – это объяснение преимуществ производительности поиска набора для включения значения по сравнению со списком, что является основным преимуществом использования наборов.
Подробнее об ООП в Python
Этот раздел возвращается назад, чтобы более подробно остановиться на ООП в Python. Далее Николас объясняет синтаксис и значение определения пользовательского класса и создания из него объектов. Он вводит понятия определения пользовательских атрибутов и методов экземпляра, а также рассказывает о том, что такое магические методы и как они используются. В целом я чувствовал, что этот раздел хорошо освещен и является важным знанием для разработчика Python среднего и старшего уровня.
Понимание структуры данных
Курс заканчивается разделом, посвященным одной из моих любимых питонических функций-пониманию. Здесь Николас демонстрирует, как используются постижения и почему вы можете использовать их при работе со списками и словарями.
Темы для добавления, которые принесут пользу Курсу
Учитывая, что название этого курса указывает на то, что его целевая аудитория ориентирована на роли разработчиков Python среднего и старшего уровня, я чувствую, что недостаточно контента было направлено на большее описание более средних и продвинутых функций языка. Ниже приведен набор тем, которые, по моему мнению, улучшат курс, чтобы лучше удовлетворить его целевую аудиторию.
О. Более идиоматические методы программирования на Python в порядке вещей. Примером того, что я имею в виду, является простая распаковка кортежей и списков в составные элементы. Я вижу, что это часто демонстрируется в продвинутых текстах, а также в блогах, и лично нахожу, что это согласуется с хорошо известной идиомой Python, что явное лучше, чем неявное.
Я думаю, что пример кодирования лучше продемонстрировал бы здесь мой аргумент. Рассмотрим случай, когда у вас есть список кортежей, где каждый кортеж представляет длину и ширину прямоугольника, и вы хотели бы перебрать их, чтобы вычислить и отобразить площадь каждого из них. Я могу придумать два варианта, в которых я мог бы реализовать это: (i) один использует индексацию элементов кортежа, и (ii) другой использует распаковку кортежа в значимые именованные переменные.
Использование индексации:
>>> shapes = [(1,1), (2,2), (3,2)] >>> for shape in shapes: ... print "Area of shape %.2f" % (shape[0] * shape[1]) ... Area of shape 1.00 Area of shape 4.00 Area of shape 6.00
Использование распаковки:
>>> for width, height in shapes: ... print "Area of shape %.2f" % (width * height) ... Area of shape 1.00 Area of shape 4.00 Area of shape 6.00
Для меня второй пример, который использует распаковку, более удобочитаем и демонстрирует большую идиоматическую реализацию Python.
B. Обсуждение встроенных функций Python, выполняющих операции с коллекциями, было бы отличным дополнением к этому курсу. Многие из встроенных функций были предоставлены потому, что они обеспечивают решение общих проблем программирования, но имеют высоко оптимизированные реализации, которые часто дают значительное повышение производительности. Некоторые из встроенных функций, которые , как мне кажется, стоит упомянуть,-это zip , filter и map .
Например, предположим, что вы хотите отфильтровать список чисел и выбрать только четные. Я могу придумать два общих подхода, которые будут приняты. Тот, который будет использовать цикл для перебора элементов вместе с условным, чтобы проверить каждое число, чтобы увидеть, является ли оно четным или нет, и когда даже добавить число в отдельные списки, предназначенные для четных чисел. Скорее всего, это будет подход младшего разработчика, который менее знаком с языком. Во-вторых, использовать встроенную функцию filter()
вместе с лямбда-функцией для проверки четных чисел.
В коде эти два подхода выглядели бы так:
Первый способ:
>>> nums = [1, 2, 3, 4, 5, 6, 7, 8] >>> even_nums = [] >>> for num in nums: ... if num % 2 == 0: ... even_nums.append(num) ... >>> even_nums [2, 4, 6, 8]
Второй способ:
>>> even_nums = filter(lambda num: num % 2 == 0, nums) >>> even_nums [2, 4, 6, 8]
C. Еще одной темой, которую, как мне кажется, было бы полезно добавить к существующему контенту, было бы освещение некоторых расширенных типов данных коллекции, таких как именованные кортежи и упорядоченные словари. Я часто обращался к именованному кортежу в тех случаях, когда хотел представить объект реального мира, но, возможно, было бы неудобно или излишне использовать пользовательский класс или чрезмерно используемый словарь. Они не только являются отличным способом организации данных, представляющих что-то в реальном слове, но и обладают отличной производительностью, особенно лучше, чем словарь.
D. И последнее, но, конечно же, не менее важное: мне бы очень хотелось увидеть упоминание о различиях между Python 2 и 3. В частности, я считаю, что было бы важно дать некоторые указания по переносу существующих систем с Python 2 на Python 3, который быстро становится приоритетным пунктом для многих компаний и приводит к увеличению спроса на старших разработчиков Python.
Вывод
В этой статье я сделал все возможное, чтобы дать тщательный и честный обзор курса Udemy , by, который в настоящее время насчитывает около 2700 студентов.
Мое общее мнение о курсе заключается в том, что он немного вводит в заблуждение, потому что его название наводит на мысль, что контент больше ориентирован на разработчика Python среднего и старшего уровня, в то время как я обнаружил, что для этого его немного не хватает. Тем не менее, в этом курсе есть действительно отличный контент, который будет полезен разработчикам Python начального и младшего уровней.
Как всегда, я благодарю вас за чтение и приветствую комментарии и критику ниже.