Вопрос №69 от пользователя Юра Жлоба в уроке «Python functions», курс «Введение в Python»
По-моему, задание довольно сложное. test2 и test3 я осилил быстро, а вот с test1 пришлось возиться долго. Или, может, не сложное, а просто я такой тупой, к питону не приспособленный.
Эти *args и **kwagrs -- совершенно неинтуитивная хрень :)
На мой взгляд, первое самое легкое: в докстринге по сути уже половина решения. По сравнению с лиспами args/kwargs, конечно, костыли, но что поделаешь.
Забавно, что я легко написал код, который проходит 1-й и 2-й тесты, но не проходит 3-й. И, наоборот, легко написал код, который проходит 3-й тест, но не проходит 1-й и 2-й. Дальше думал в сторону написания внутри лямбы условия, каким-то образом развевляющего эти два варинта. Примерно час ушел на гугление и изучение доков, что не помогло. Потом была просто догадка, как это можно написать, и она оказалась верной.
Итого: материал урока, гугл и официальные доки по питону не помогли решить 1-е задание. Помогла случайная догадка, которая вполне могла и не придти в голову. Ну и на это ушел час времени.
Поэтому мне кажется, что упражнение достаточно сложное, и может отсечь много студентов. Может быть есть смысл как-то улучшить материал урока.
Объясните пожалуйста как в задании №1 получать параметры для func1 и func2 ???
Функция, что вы возвращаете, должна принимать произвольные аргументы: любое число позиционных параметров и любое число именованных. Сигнатура подобного рода задается как *args, **kwargs
В общем, учту замечания, возможно, задание 1 сделаю проще.
мне кажется нужно искать компромисс. сложные задания тоже очень нужны. может быть выделять их как дополнительные задания, задания со звездочкой, etc. задания интересные и заставляют напрячь мозги, это интересно
Функция, что вы возвращаете, должна принимать произвольные аргументы: любое число позиционных параметров и любое число именованных. Сигнатура подобного рода задается как *args, **kwargs
то есть в функцию которая задается оператором ретурн может передаться неограниченное количество позиционных аргументов, и одновременно неограниченное количество именных аргументов?
Андрей, дело не в операторе ретурн. Переменные *args
**kwargs
накапливают в себе позиционные и именованные аргументы. Вы можете объявить функцию в любом месте и вернуть ее как результат другой функции.
как оказалось задание 1 реализуется очень просто. Внимательно просмотреть теорию, поэксперементировать с *args **kwargs
и включить логику
Не понимаю что нужно передать в качестве параметра func1. Число параметров там же всегда меняется
Алексей, извините, что с опозданием, ну указывайте, в каком именно задании трудности. Сразу прикладывайте код на pastebin.
task1. Я так понимаю нужно вернуть функцию типо этой func3 = lambda args,kwargs:func2(map(func1,*)) Но я не знаю что и как нужно поставить вместо звездочек чтобы все работало. Уже 3 раза лекцию пересмотрел. Все равно не понятно=(
args и kwargs это просто название которое принято для именования позиционных и именованных аргументов. С таким же успехом можно писать всё что угодно например
*x, **y, *a, **b, *pozicionnue, **imenovanue
. Именно указанние звездочек позволяет переменной накапливать данные того или иного типа.
В своём примере Вы допустили как минимум 2 ошибки: после лямбды не поставили звездочки корректно (есть переменная args и много позиционных переменных kwargs а в задаче сказано "приём данных любого типа"), и вторая func1 это функция, в которую нужно передать аргументы y=f(x), x у вас нет, так откуда лямбде посчитать результат?
Ой да звездочки я не так написал. Вот func3 = lambda args,kwargs:func2(func1(*)). И все равно я не очень понял что нужно в качестве аргумента передавать в func1 ведь там в 1 тесте один аргумент который записывается в args, во втором два которые тоже записываются в args, а в третьем три которые записываются в kwargs.
В любом уроке есть решение учителя, и Вы можете его посмотреть.
func1 ведь там в 1 тесте один аргумент который записывается в args, во втором два которые тоже записываются в args, а в третьем три которые записываются в kwargs.
Вот и указывайте оба как аргумент функции.
Спасибо.Я понял=)
@Алексей Кадач
func3 = lambda args, *kwargs:func2(func1())
Две ошибки: нет звездочки перед args
и вы не прокидываете *args, *kwargs
в вызов func1. Поправьте и должно заработать.
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







