Вопрос №69 от пользователя Юра Жлоба в уроке «Python functions», курс «Введение в Python»

Юра Жлоба

По-моему, задание довольно сложное. test2 и test3 я осилил быстро, а вот с test1 пришлось возиться долго. Или, может, не сложное, а просто я такой тупой, к питону не приспособленный.

Эти *args и **kwagrs -- совершенно неинтуитивная хрень :)

17 1

Ivan Grishaev

На мой взгляд, первое самое легкое: в докстринге по сути уже половина решения. По сравнению с лиспами args/kwargs, конечно, костыли, но что поделаешь.

0

Юра Жлоба

Забавно, что я легко написал код, который проходит 1-й и 2-й тесты, но не проходит 3-й. И, наоборот, легко написал код, который проходит 3-й тест, но не проходит 1-й и 2-й. Дальше думал в сторону написания внутри лямбы условия, каким-то образом развевляющего эти два варинта. Примерно час ушел на гугление и изучение доков, что не помогло. Потом была просто догадка, как это можно написать, и она оказалась верной.

Итого: материал урока, гугл и официальные доки по питону не помогли решить 1-е задание. Помогла случайная догадка, которая вполне могла и не придти в голову. Ну и на это ушел час времени.

Поэтому мне кажется, что упражнение достаточно сложное, и может отсечь много студентов. Может быть есть смысл как-то улучшить материал урока.

3

user-dd78189dffe37326

Объясните пожалуйста как в задании №1 получать параметры для func1 и func2 ???

0

Ivan Grishaev

Функция, что вы возвращаете, должна принимать произвольные аргументы: любое число позиционных параметров и любое число именованных. Сигнатура подобного рода задается как *args, **kwargs

2

Ivan Grishaev

В общем, учту замечания, возможно, задание 1 сделаю проще.

0

Стас Стекольщиков

мне кажется нужно искать компромисс. сложные задания тоже очень нужны. может быть выделять их как дополнительные задания, задания со звездочкой, etc. задания интересные и заставляют напрячь мозги, это интересно

0

Андрей Волосович

Функция, что вы возвращаете, должна принимать произвольные аргументы: любое число позиционных параметров и любое число именованных. Сигнатура подобного рода задается как *args, **kwargs

то есть в функцию которая задается оператором ретурн может передаться неограниченное количество позиционных аргументов, и одновременно неограниченное количество именных аргументов?

0

Ivan Grishaev

Андрей, дело не в операторе ретурн. Переменные *args **kwargs накапливают в себе позиционные и именованные аргументы. Вы можете объявить функцию в любом месте и вернуть ее как результат другой функции.

0

Андрей Волосович

как оказалось задание 1 реализуется очень просто. Внимательно просмотреть теорию, поэксперементировать с *args **kwargs и включить логику

0

Алексей Кадач

Не понимаю что нужно передать в качестве параметра func1. Число параметров там же всегда меняется

0

Ivan Grishaev

Алексей, извините, что с опозданием, ну указывайте, в каком именно задании трудности. Сразу прикладывайте код на pastebin.

0

Алексей Кадач

task1. Я так понимаю нужно вернуть функцию типо этой func3 = lambda args,kwargs:func2(map(func1,*)) Но я не знаю что и как нужно поставить вместо звездочек чтобы все работало. Уже 3 раза лекцию пересмотрел. Все равно не понятно=(

0

Андрей Волосович

args и kwargs это просто название которое принято для именования позиционных и именованных аргументов. С таким же успехом можно писать всё что угодно например *x, **y, *a, **b, *pozicionnue, **imenovanue . Именно указанние звездочек позволяет переменной накапливать данные того или иного типа. В своём примере Вы допустили как минимум 2 ошибки: после лямбды не поставили звездочки корректно (есть переменная args и много позиционных переменных kwargs а в задаче сказано "приём данных любого типа"), и вторая func1 это функция, в которую нужно передать аргументы y=f(x), x у вас нет, так откуда лямбде посчитать результат?

0

Алексей Кадач

Ой да звездочки я не так написал. Вот func3 = lambda args,kwargs:func2(func1(*)). И все равно я не очень понял что нужно в качестве аргумента передавать в func1 ведь там в 1 тесте один аргумент который записывается в args, во втором два которые тоже записываются в args, а в третьем три которые записываются в kwargs.

0

Андрей Волосович

В любом уроке есть решение учителя, и Вы можете его посмотреть.

func1 ведь там в 1 тесте один аргумент который записывается в args, во втором два которые тоже записываются в args, а в третьем три которые записываются в kwargs.

Вот и указывайте оба как аргумент функции.

0

Алексей Кадач

Спасибо.Я понял=)

0

Ivan Grishaev

@Алексей Кадач

func3 = lambda args, *kwargs:func2(func1())

Две ошибки: нет звездочки перед args и вы не прокидываете *args, *kwargs в вызов func1. Поправьте и должно заработать.

0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
1 декабря 8 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
1 декабря 8 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
1 декабря 8 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
1 декабря 8 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
1 декабря 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Новый
Создает веб-приложения со скоростью света
1 декабря 5 месяцев