Отзыв на урок №8 и упражнение к нему в курсе "Python: Функции"
Причины написания отзыва:
Ощущения от курса "Python: Функции" и особенно от урока №8 сильно контрастируют с ощущениями от всех ранее пройденных курсов в рамках профессии "Python-разработчик". И не в пользу упомянутого урока.
На решение простого (как после выяснилось) упражнения у меня ушло около трёх часов.
Ранее для решения упражнения мне хватало приведённой в уроке и ранее разобранной теории, или в крайнем случае прибегал к дополнительным материалам, ссылки на который есть в материалах урока или курса. В этом уроке так не получилось. Да и дополнительных материалов к уроку и к курсу в целом нет.
Содержание урока:
В уроке рассматривается тема "Замыканий" — это такой способ работать с функциями внутри функций в Python. А также приведены примеры работы данных "замыканий". Примеров всего три, и они иллюстрируют процессы работы с функциями одной переменной.
Содержание упражнения:
Далее прямое цитирование:
В этом упражнении вам нужно будет реализовать две функции высшего порядка, возвращающие замыкания: partial_apply() и flip().
partial_apply() принимает функцию от двух аргументов и первый аргумент для неё, а возвращает замыкание — функцию, которая примет второй аргумент и наконец применит замкнутую функцию к обоим аргументам (и вернёт результат).
def greet(name, surname):
return f'Hello, {name} {surname}!'
f = partial_apply(greet, 'Dorian')
f('Grey')
# 'Hello, Dorian Grey!'
Функция flip() принимает в качестве единственного аргумента функцию от двух аргументов. Возвращаемое замыкание должно также принять два аргумента, а затем применить к ним замкнутую функцию, но аргументы подставить в обратном порядке. Таким образом flip() как бы "переворачивает" ("flips") исходную функцию.
def greet(name, surname):
return f'Hello, {name} {surname}!'
f = flip(greet)
f('Christian', 'Teodor')
# 'Hello, Teodor Christian!'_
Ощущения от урока и упражнения:
После прочтения урока складывается ощущение, что речь идёт о каком-то не очень нужном и малополезном функционале языка Python. Нет примера или описания, который мог бы проиллюстрировать зачем мне понадобится данный функционал в моей будущей работе. А еще в конце урока слова "… не является эксклюзивным для Python "костылём"…" закрепляют ощущения.
Язык, которым написан урок и упражнение к нему ощущается, как диалог двух профессионалов, для которых очевиден контекст и нюансы. То есть мне, как читателю, должно быть и так всё понятно. Но, честно говоря, понятно оказалось не всё и не сразу.
Не сложное на первый взгляд упражнение приводит в ступор при решении. Понимаешь, что решение должно занять несколько строк, что оно не сложное… и не решаешь и всё тут. Перечитываешь теорию, копируешь в VS Code примеры и по-всякому крутишь их в надежде понять, ищешь дополнительные материалы в курсе, а их нет… Гуглишь и не находишь с первых попыток примеров, отличных от приведённых в уроке… Начинаешь чувствовать себя "туповатым"… Злишься на курс…
А вот когда нашел решение, вот тут прям ярость охватывает. Решение действительно простое. А вот примера или текста урока, который направил бы к этому решению нет. И да, это моё личное мнение и ощущение, возможно у вас всё было иначе.
Поиск решения:
Сперва попытался в лоб решить и вызвал функцию greet(name, surname) непосредственно в созданной функции partial_apply(), рассчитывая, что замыканием будет сама функция greet(). Но так оно не работает…
Перечитав ещё раз теорию я решил воспользоваться приведёнными примерами и создал функцию greet(name, surname) внутри функции partial_apply(). Такая конструкция выводила правильный результат (соответствующий приведённому в упражнении), но тесты не проходила. Оно и понятно, так как в задании подразумевалось, на входе функция partial_apply() должна в виде данных принимать внешнюю функцию от двух переменных и один параметр. Полез разбираться в тестах (вот тут отдельное спасибо за понятно написанные тесты).
Взял данные из тестов и уже с ними стал громоздить разнообразные конструкции, действую в парадигме того, что замыканием должна быть именно вызываемая функция. Ничего не получалось. Полез "гуглить". В основном попадались примеры, аналогичные приведённым в уроке, то есть конструкции из функций от одной или двух переменных в виде параметров. Через некоторое время наткнулся на видеоуроки с Ютуба Замыкания в Python. Closure Python (https://www.youtube.com/watch?v=lA979PBb0TY&ab_channel=egoroff_channel) и Замыкания в Python Часть 2. Closure Python part 2 (https://www.youtube.com/watch?v=vrkLShOYwI0&ab_channel=egoroff_channel). И вот к концу второго видеоурока я начал понимать, что именно я делаю не так.
В задании надо просто в теле функции partial_apply() создать функцию "замыкание", в которой уже и вызвать внешнюю функцию greet(). Вроде как "ларчик просто открывался", но это простое знание вот ни как мне не удалось вытащить из урока №8. И дополнительных материалов к уроку нет, что вынуждает "блуждать по интернету" в поисках и сомнениях. Развитие навыка самостоятельного поиска, конечно, тоже важно, но почему-то именно в этом уроке оно начало проявляться, в отличии от ранее пройденных мною 14 курсах на Хекслете. Раньше справлялся теми материалами, которые даны в уроке и в приложениях.
Все вышеописанные действия происходили в несколько подходов и в сумме заняли около трёх часов.
Пожелания:
Уважаемые разработчики курсов Хекслет, у вас получается делать по-настоящему классный образовательный продукт, но курс "Python: Функции" и особенно урок №8 вызвал у меня сильные отталкивающие чувства. Прошу Вас переработать курс. На мой взгляд в курс необходимо добавить дополнительные материалы, упростить язык повествования (сделать его более доступным к пониманию без контекста) и добавить больше разобранных примеров. Не сомневаюсь, что у вас получится сделать его на уровне с остальные замечательными курсами.