Да, вы правы — в Python логическая интерпретация объектов не ограничивается только пустыми коллекциями, 0, None и False. У классов действительно могут быть определены специальные методы, которые задают собственное поведение в логическом контексте. Я упрощённо сформулировал мысль, чтобы подчеркнуть стандартные “ложные” значения, но стоит уточнить, что механизм шире.
Собственно, в этом и заключается суть — речь идёт о поведении именно функций, и неважно, как они определены: через lambda или через def. Особенность позднего связывания одинаково проявляется в обоих случаях.
Пример с funcs.append(lambda: i) действительно выглядит искусственным — тут нет никакой необходимости в функциях, можно хранить сами значения. Но как только задача сводится к тому, чтобы зафиксировать часть аргументов (а остальные подставлять при вызове), мы вынуждены оперировать именно функциями. И тогда уже приходится либо использовать аргументы по умолчанию, либо functools.partial, либо ещё что-то.
В данном случае суть проблемы не в том, что используется lambda — её хоть сразу перепиши на именованную функцию, особенность позднего связывания от этого никуда не денется. Чтобы избежать эффекта, нужно явно “фиксировать” значение переменной в момент создания функции, например через аргументы по умолчанию.
На самом деле a += [3] эквивалентно не append, а extend.
То есть правильнее сравнивать:
a += [3] # [1, 2, 3]
a.extend([3]) # [1, 2, 3]
А append() в этом случае даёт другой результат:
a.append([3]) # [1, 2, [3]]
Пример с += был больше как иллюстрация того, что оператор перегружен и работает со списками, а не как рекомендация к применению. В реальном проекте я бы тоже наругал за это.
Работать или нет в такой компании где задают подобные вопросы на собеседовании - это ваш выбор, и я ничего не имею против него. Но если у вас есть конкретные предложения по улучшению описания оператора +=, то будет здорово их увидеть.
На собеседованиях действительно можно услышать очень разные вопросы, и многое зависит и от роли, и от контекста, и от конкретного интервьюера (в том числе его настроения). Собеседование - это всегда субъективная история. Но есть ряд вещей в Python, знание и понимание которых показывает уровень зрелости разработчика — и именно про такие моменты статья.
Я и сам неоднократно сталкивался с этими вопросами, когда проходил интервью, и сейчас иногда задаю их кандидатам - живые примеры у меня на канале. Конечно, не всё подряд и не всем, а исходя из позиции и задач.
Спасибо за комментарий. Позволю себе немного уточнить, что в Python поиск имён идёт по правилу LEGB: сначала в локальной области, потом во внешних функциях (enclosing), затем в глобальной и, наконец, в builtins. Поэтому кроме globals и locals есть ещё один важный уровень — enclosing. При этом globals() и locals() действительно возвращают словари, но это скорее интерфейс: в функциях локальные переменные хранятся иначе для скорости, и изменения в locals() не затрагивают реальные значения. Что касается лямбды, замыкание создаётся только если она действительно использует переменные из внешней области; если таких переменных нет, то замыкания тоже нет.
Это было сделано сознательно: модель остаётся простой и предсказуемой, переменные удобно использовать в интерактивной работе (например, в REPL или Jupyter), а сама идея идёт ещё от языков, на которые ориентировался Python, где также не было блочной видимости.
Благодарю за обратную связь и позволю себе немного прояснить ситуацию.
Ваш комментарий касается качества курса, тогда как сама статья посвящена его особенностям и “фишкам”, а не образовательной методике или содержанию.
Что касается качества: как автор и технический руководитель текущей версии, могу с уверенностью сказать, что это один из самых проработанных и эффективных курсов по изучению Python и основ программирования с нуля. Мы регулярно обновляем его с учётом обратной связи от студентов, а содержание разрабатывается совместно с опытными практикующими разработчиками.
Создаётся впечатление, что ваша оценка основана на устаревшей информации или видео со сторонних каналов, не связанных с разработкой курса. В первом спринте задания, связанные с Pygame, отсутствуют — к ним студенты переходят только в третьем. И это одни из самых любимых заданий студентов.
Кстати, у меня также есть YouTube-канал, где я бесплатно провожу открытые собеседования для всех желающих — не только для студентов Практикума. Формат максимально прозрачный и практикоориентированный.
Если вы действительно проходили курс целиком и у вас есть конкретные идеи по его улучшению — буду признателен за конструктив. А если хотите продемонстрировать свои навыки в рамках пробного интервью со мной — с удовольствием организую такую встречу.
Предложение сделать курс полностью бесплатным и свободно распространяемым звучит действительно вдохновляюще и, как вы справедливо отметили, немного контринтуитивно. Как автор и технический лид курса, я, к сожалению, не принимаю решений по вопросам монетизации и модели распространения, поэтому не могу подробно прокомментировать эту часть.
Тем не менее, хочу отметить, что у курса есть обширная и действительно качественная бесплатная часть. Вполне возможно, что даже некоторые платные предложения на рынке уступают ей по насыщенности и системности.
Ну и эта статья, к которой вы оставили комментарий, на самом деле не о доступности курса как таковой — она посвящена пасхалкам, скрытым деталям и игровым элементам, встроенным в процесс обучения. Такие “пасхалки” есть не только в полной версии, но и в бесплатной части курса.
Кстати, как вам обновлённая бесплатная часть? Буду рад услышать ваше мнение!
Спасибо за комментарий и за дополнение. Всё верно, есть интерфейс через который можно вводить команды и есть программы, как консольные, так и графические, которые можно через этот интерфейс запускать.
На ранних стадиях изучения языка я бы не стал сразу углубляться в детали создания архитектуры приложений и паттерны. После того, как основы будут освоены и получен некоторый практический опыт, то изучение архитектурных паттернов и принципов проектирования станет логичным следующим шагом.
В моей подборке есть книга "Чистый код", и хотя книга больше посвящена написанию чистого и поддерживаемого кода, она также затрагивает моменты, которые помогут создавать более качественные архитектуры. А непосредственно про архитектуру от того же Роберта Мартина есть книга - "Чистая архитектура".
Помимо Мартина, классической рекоммендацией тут будет книга "Design Patterns: Elements of Reusable Object-Oriented Software", в которой разобраны основные паттерны проектирования, используемые в объектно-ориентированном программировании.
Не очень понимаю о каких "последствиях" идет речь, у нас обычно за полезную и конструктивную обратную связь бывают бенефиты. Но даже в таком формате - спасибо, мы проанализируем и учтём.
Спасибо за честный и подробный отзыв. А в какой когорте вы учились? Вы ведь знаете, что те студенты, которые прошли обучение, сохраняют доступ не только к пройденному курсу, но также и к обновлениям, которые выходят позже?
Над курсом работаю не только я, тут работает большая команда и обновления выходят практически ежедневно. Это связано не с тем, что курс содержит какие-то ошибки, а с тем, что мир ИТ постоянно изменяется, выходят новые версии библиотек и фрэймворков, обновляется синтаксис языка, появляются или закрываются разные сторонние сервисы задействованные в заданиях и так далее, поэтому и наш материал тоже постоянно обновляется, разрабатываются новые проекты и задачи, улучшается подача текущего материала.
Например сейчас в дополнение к текстовым урокам появились и видеолекции. Вы их смотрели? Дипломная работа тоже была существенно переработана, мы об этом даже статью выпускали. Я могу с уверенностью 100% сказать что тот курс который был 1-2 года назад и текущий - это два разных курса и мне было бы интересно получить отзыв именно по актуальной версии от вас.
Очень хорошо помню перфокарты, а арифмометр Однера у меня до сих пор в рабочем состоянии. Также хорошо помню и свои первые языки программирования - фортран, бэйсик, ассемблер и ада. И да, все развивается и меняется, языки рождаются и умирают, а те, которые выживают - их синтаксис и возможности эволюционируют. Об этом и статья. Я выбрал пример с упоминанием Python 2 только потому, что он будет понятен большему числу читателей в 2024 году. Пример на базе фортрана или ассемблера был бы совсем непонятным на мой взгляд :)
А вот это хорошо подмечено, и идея тут в том, что GPT-чаты сейчас очень быстро развиваются и хорошо дополняют другие источники информации, но использовать их в качестве основного и единственного источника знаний я бы не стал. Поэтому я считаю, что получить второе мнение от чата с помощником - ОК, слепо довериться - НЕТ.
Да, вы правы — в Python логическая интерпретация объектов не ограничивается только пустыми коллекциями,
0
,None
иFalse
. У классов действительно могут быть определены специальные методы, которые задают собственное поведение в логическом контексте. Я упрощённо сформулировал мысль, чтобы подчеркнуть стандартные “ложные” значения, но стоит уточнить, что механизм шире.Собственно, в этом и заключается суть — речь идёт о поведении именно функций, и неважно, как они определены: через lambda или через def. Особенность позднего связывания одинаково проявляется в обоих случаях.
Пример с funcs.append(lambda: i) действительно выглядит искусственным — тут нет никакой необходимости в функциях, можно хранить сами значения. Но как только задача сводится к тому, чтобы зафиксировать часть аргументов (а остальные подставлять при вызове), мы вынуждены оперировать именно функциями. И тогда уже приходится либо использовать аргументы по умолчанию, либо functools.partial, либо ещё что-то.
В данном случае суть проблемы не в том, что используется lambda — её хоть сразу перепиши на именованную функцию, особенность позднего связывания от этого никуда не денется. Чтобы избежать эффекта, нужно явно “фиксировать” значение переменной в момент создания функции, например через аргументы по умолчанию.
На самом деле a += [3] эквивалентно не append, а extend.
То есть правильнее сравнивать:
А append() в этом случае даёт другой результат:
Пример с += был больше как иллюстрация того, что оператор перегружен и работает со списками, а не как рекомендация к применению. В реальном проекте я бы тоже наругал за это.
Да, вы абсолютно правы!
В Python функция round() по умолчанию использует стратегию округления, называемую “round half to even” (или банковское округление).
Работать или нет в такой компании где задают подобные вопросы на собеседовании - это ваш выбор, и я ничего не имею против него. Но если у вас есть конкретные предложения по улучшению описания оператора +=, то будет здорово их увидеть.
На собеседованиях действительно можно услышать очень разные вопросы, и многое зависит и от роли, и от контекста, и от конкретного интервьюера (в том числе его настроения). Собеседование - это всегда субъективная история. Но есть ряд вещей в Python, знание и понимание которых показывает уровень зрелости разработчика — и именно про такие моменты статья.
Я и сам неоднократно сталкивался с этими вопросами, когда проходил интервью, и сейчас иногда задаю их кандидатам - живые примеры у меня на канале. Конечно, не всё подряд и не всем, а исходя из позиции и задач.
Спасибо за комментарий. Позволю себе немного уточнить, что в Python поиск имён идёт по правилу LEGB: сначала в локальной области, потом во внешних функциях (enclosing), затем в глобальной и, наконец, в builtins. Поэтому кроме globals и locals есть ещё один важный уровень — enclosing. При этом globals() и locals() действительно возвращают словари, но это скорее интерфейс: в функциях локальные переменные хранятся иначе для скорости, и изменения в locals() не затрагивают реальные значения. Что касается лямбды, замыкание создаётся только если она действительно использует переменные из внешней области; если таких переменных нет, то замыкания тоже нет.
Это было сделано сознательно: модель остаётся простой и предсказуемой, переменные удобно использовать в интерактивной работе (например, в REPL или Jupyter), а сама идея идёт ещё от языков, на которые ориентировался Python, где также не было блочной видимости.
Благодарю за обратную связь и позволю себе немного прояснить ситуацию.
Ваш комментарий касается качества курса, тогда как сама статья посвящена его особенностям и “фишкам”, а не образовательной методике или содержанию.
Что касается качества: как автор и технический руководитель текущей версии, могу с уверенностью сказать, что это один из самых проработанных и эффективных курсов по изучению Python и основ программирования с нуля. Мы регулярно обновляем его с учётом обратной связи от студентов, а содержание разрабатывается совместно с опытными практикующими разработчиками.
Создаётся впечатление, что ваша оценка основана на устаревшей информации или видео со сторонних каналов, не связанных с разработкой курса. В первом спринте задания, связанные с Pygame, отсутствуют — к ним студенты переходят только в третьем. И это одни из самых любимых заданий студентов.
Кстати, у меня также есть YouTube-канал, где я бесплатно провожу открытые собеседования для всех желающих — не только для студентов Практикума. Формат максимально прозрачный и практикоориентированный.
Если вы действительно проходили курс целиком и у вас есть конкретные идеи по его улучшению — буду признателен за конструктив. А если хотите продемонстрировать свои навыки в рамках пробного интервью со мной — с удовольствием организую такую встречу.
Большое спасибо за ваш комментарий!
Предложение сделать курс полностью бесплатным и свободно распространяемым звучит действительно вдохновляюще и, как вы справедливо отметили, немного контринтуитивно. Как автор и технический лид курса, я, к сожалению, не принимаю решений по вопросам монетизации и модели распространения, поэтому не могу подробно прокомментировать эту часть.
Тем не менее, хочу отметить, что у курса есть обширная и действительно качественная бесплатная часть. Вполне возможно, что даже некоторые платные предложения на рынке уступают ей по насыщенности и системности.
Ну и эта статья, к которой вы оставили комментарий, на самом деле не о доступности курса как таковой — она посвящена пасхалкам, скрытым деталям и игровым элементам, встроенным в процесс обучения. Такие “пасхалки” есть не только в полной версии, но и в бесплатной части курса.
Кстати, как вам обновлённая бесплатная часть? Буду рад услышать ваше мнение!
Спасибо за комментарий и за дополнение. Всё верно, есть интерфейс через который можно вводить команды и есть программы, как консольные, так и графические, которые можно через этот интерфейс запускать.
Ага, всё верно. Я примерно с таких железяк и начинал свой путь в ИТ когда-то.
На ранних стадиях изучения языка я бы не стал сразу углубляться в детали создания архитектуры приложений и паттерны. После того, как основы будут освоены и получен некоторый практический опыт, то изучение архитектурных паттернов и принципов проектирования станет логичным следующим шагом.
В моей подборке есть книга "Чистый код", и хотя книга больше посвящена написанию чистого и поддерживаемого кода, она также затрагивает моменты, которые помогут создавать более качественные архитектуры. А непосредственно про архитектуру от того же Роберта Мартина есть книга - "Чистая архитектура".
Помимо Мартина, классической рекоммендацией тут будет книга "Design Patterns: Elements of Reusable Object-Oriented Software", в которой разобраны основные паттерны проектирования, используемые в объектно-ориентированном программировании.
Не очень понимаю о каких "последствиях" идет речь, у нас обычно за полезную и конструктивную обратную связь бывают бенефиты. Но даже в таком формате - спасибо, мы проанализируем и учтём.
Спасибо за честный и подробный отзыв. А в какой когорте вы учились? Вы ведь знаете, что те студенты, которые прошли обучение, сохраняют доступ не только к пройденному курсу, но также и к обновлениям, которые выходят позже?
Над курсом работаю не только я, тут работает большая команда и обновления выходят практически ежедневно. Это связано не с тем, что курс содержит какие-то ошибки, а с тем, что мир ИТ постоянно изменяется, выходят новые версии библиотек и фрэймворков, обновляется синтаксис языка, появляются или закрываются разные сторонние сервисы задействованные в заданиях и так далее, поэтому и наш материал тоже постоянно обновляется, разрабатываются новые проекты и задачи, улучшается подача текущего материала.
Например сейчас в дополнение к текстовым урокам появились и видеолекции. Вы их смотрели? Дипломная работа тоже была существенно переработана, мы об этом даже статью выпускали. Я могу с уверенностью 100% сказать что тот курс который был 1-2 года назад и текущий - это два разных курса и мне было бы интересно получить отзыв именно по актуальной версии от вас.
Очень хорошо помню перфокарты, а арифмометр Однера у меня до сих пор в рабочем состоянии. Также хорошо помню и свои первые языки программирования - фортран, бэйсик, ассемблер и ада. И да, все развивается и меняется, языки рождаются и умирают, а те, которые выживают - их синтаксис и возможности эволюционируют. Об этом и статья. Я выбрал пример с упоминанием Python 2 только потому, что он будет понятен большему числу читателей в 2024 году. Пример на базе фортрана или ассемблера был бы совсем непонятным на мой взгляд :)
А чем не подходит упоминание Python 2 в контексте того, что язык развивается, меняется его синтаксис и так далее?
А вот это хорошо подмечено, и идея тут в том, что GPT-чаты сейчас очень быстро развиваются и хорошо дополняют другие источники информации, но использовать их в качестве основного и единственного источника знаний я бы не стал. Поэтому я считаю, что получить второе мнение от чата с помощником - ОК, слепо довериться - НЕТ.
В статье есть ссылки на репозитории студентов, где можно посмотреть все подробности именно их реализаций.