Найти - Пользователи
Полная версия: Прошу помощи в разборе с лямбда функцией
Начало » Python для новичков » Прошу помощи в разборе с лямбда функцией
1 2 3
first-step
 a = print
>>> 
>>> a('x')

Это понятно, как никогда ) Мы сделали ассоциацию а с функцией print и при упоминании а теперь программа выполняет print.

А вот запись
 lambda arg1, *arg2: arg1(arg1, *arg2)
, хоть убейте - не понятна…
Такая запись будет корректной?
 ]lambda arg1, arg2: arg2(arg1, arg2)

Может для полного растолковывания описать смысл каждого элемента в этой записи? Типа:

lambda - начало описания функции
arg1 - первый аргумент
, - разделитель между аргуметами
*arg2 - второй аргумент
: - конец описания агруменов функции, начало описания действия функции
arg1
(
arg1
,
*arg2
)
Rodegast
> А вот запись lambda arg1, *arg2: arg1(arg1, *arg2) , хоть убейте - не понятна…

Вот та же запись с обычными функциями. Надеюсь что это тебе поможет
 def foo(arg1, *arg2):
    return arg1(arg1, *arg2)
first-step
Rodegast
Вот та же запись с обычными функциями. Надеюсь что это тебе поможет


Эта запись понятна и работает, если переменную a до вызова функции foo мы определим, как функцию…., скажем print

 def foo(arg1, *arg2):
    return arg1(arg1, *arg2)
a = print
b = [1, 2, 3]
foo(a, b)
>>> <built-in function print> [1, 2, 3]

А если если не определить, то будет ругаться.
py.user.next
first-step
Такая запись будет корректной?
 lambda arg1, arg2: arg2(arg1, arg2)
Да. Функция при вызове будет принимать два аргумента. Второй аргумент должен будет быть функцией, так как внутри функции этот второй аргументы вызывается как функция.

Ключевое слово lambda задаёт определение лямбда-функции. После ключевого слова до двоеточия перечисляются формальные параметры функции через запятую. После двоеточия начинается тело лямбда-функции, которое продолжается до какого-то признака конца (в разных контекстах разные признаки, где-то запятая, как в map(), где-то конец строки, где-то закрывающая круглая скобка). Тело лямбда-функции содержит один оператор, результат которого возвращается в качестве возвращаемого значения лямбда-функции. И вот оператор в теле лямбда-функции может иметь в себе вызов другой функции.

Когда функция вызывается, а это приводилось вот здесь (круглые скобки в конце с пятёркой - это вызов функции), в вызов передаются фактические параметры. Значит, на место arg1 встаёт первый аргумент в вызове, на место arg2 встаёт второй аргумент в вызове. Внутри тела функции используются принятые при вызове аргументы.


Это всё азы программирования. Ты их не знаешь, поэтому ничего не понимаешь. Выбрал ещё запутанный пример низкого качества и пытаешься его понять. Этот пример писал какой-то тупень, который пишет говнокод. Не надо на таких примерах учиться, бери профессиональные книги и учись по ним. Там ты таких запутанных бредов не встретишь, потому что эти книги чаще всего пишут профессионалы, которым не надо гнуть пальцы, а надо научить. Начинай с самых простых книг, потом переходи к книгам посложнее, а потом и к самым сложным. И вот тогда ты сможешь учиться по говнокоду всякому, выуживать из него хоть что-то полезное, но не раньше.

Rodegast
Надеюсь что это тебе поможет
Он не понимает, что такое аргумент формальный, аргумент фактический, возвращаемое значение, оператор, определение функции, вызов функции, - это полный набор абсолютного нуля. Так что он просто решил начать изучение с уровня, до которого ещё не дорос даже. Он не владеет базовой терминологией. Это как пытаться изучить роман Достоевского, не зная изображений русских букв. Можно хоть сто раз объяснить течение мысли автора в романе, но человек всё время будет спрашивать “а это что такое, это буква А?”.
first-step
py.user.next
Да. Функция при вызове будет принимать два аргумента. Второй аргумент должен будет быть функцией, так как внутри функции этот второй аргументы вызывается как функция.

Простите, а что именно должна делать эта вызываемая функция? Где задается ее описание?
Rafik
Функция задается за пределами лямбды и передаётся как аргумент в лямбду, т.е. где-то в коде, вне lambda находится эта функция. Например:
  x = lambda arg1, arg2: arg2(arg1, arg2)
x(123, какая_то_функция)   # Вот здесь передается ФУНКЦИЯ в arg2
# эта самая "какая_то_функция" может быть встроенной, импортируемой, заданной пользователем,
#короче, любой функцией, которая по задумке автора кода должна быть здесь
first-step
Все, спасибо всем участникам! Понял, что к чему. Просто не понимал, что в описании lambda функции может быть написано несколько операций, не связанных друг с другом типа:
 x = lambda k, m: ((k + m),(print (m)),(k * m))
py.user.next
first-step
Простите, а что именно должна делать эта вызываемая функция? Где задается ее описание?
Там, где она определена. Например, функция print определена в исходниках питона. То, как работает функция, находится в её определении.

first-step
Просто не понимал, что в описании lambda функции может быть написано несколько операций, не связанных друг с другом типа:
Ты когда пишешь, что понял, ты ничего не понял, потому что у тебя знания основ нет. Например, то, что ты написал
first-step
 x = lambda k, m: ((k + m),(print (m)),(k * m))
не является несколькими операциями. Это просто один кортеж возвращается. То, что ты этого не понимаешь, происходит из-за того, что ты не знаешь, что такое кортеж. Да, и запятая ещё может быть операцией в каких-то языках, а может и не быть операцией. Но я думаю, что ты и операцию запятая не понимаешь, потому что банально не знаешь про её существование.

Вот вместо того, чтобы переписывать сюда текст на несколько страниц из какого-нибудь учебника для новичков (про операции, про кортежи, про функции и про круглые скобочки в разных контекстах), я тебя отправляю учиться азам. Начинай с того, что в Яндекс вводи вот эти фразы из четырёх пунктов по отдельности. Оно будет выдавать ссылки на всякие сайты и на Википедию. Вот ты сначала читаешь Википедию, а потом, поняв оттуда общий принцип (про что вообще речь идёт), ищешь книжки, в которых есть эта тема. Так ты найдёшь книжки для обучения, в которых всё расписано от и до.

То, что ты решил с наскока окунуться в высокие слои программирования (ну типа ты такой умный, что вот у тебя у одного это получится), тебе никак не поможет, потому что программирование - это многослойная теория, где верхние слои опираются на нижние. Если ты нижних, базовых слоёв не знаешь, то на верхних слоях ты ничего не будешь понимать. Например, лямбда-функции нужно изучать только после обычных функций, но ты решил сделать наоборот - сначала начать изучать лямбда-функции, типа ты умнее других, а уж функции вообще не изучать, мол ты их и так знаешь. Так вот не знаешь ты нифига ни в функциях, ни в лямбда-функциях, потому что стратегия обучения у тебя неправильная. Начинать надо, как обычные школьники делают, со всяких простейших вещей, не считая себя при этом самым умным. Там нельзя ничего пропускать, потому что ненужных понятий нет. Я думаю, что вот в этом проблема, - ты слишком много про себя думаешь, про свои способности, из-за чего не можешь ничему научиться, потому что тебе кажется, что ты уже всё знаешь и тебе можно не тратить время на изучение этих элементарных вещей.
first-step
Уважаемый py.user.next, я прохожу курс обучения с нулевого уровня. Обычные функции и кортежи прошли. Вы не думайте, что я совсем уж тупой и прямо начал с изучения лямбда функций сначала. Просто на курсах не было уделено много внимания lambda функциям и они упоминались, но довольно поверхностно их синтаксис вообще не рассматривался, поэтому я столкнулся с незнакомыми штучками.

py.user.next
не является несколькими операциями. Это просто один кортеж возвращается. То, что ты этого не понимаешь, происходит из-за того, что ты не знаешь, что такое кортеж. Да, и запятая ещё может быть операцией в каких-то языках, а может и не быть операцией. Но я думаю, что ты и операцию запятая не понимаешь, потому что банально не знаешь про её существование.

Возвращает то оно кортеж, это понятно. Но перед тем, как возвратить кортеж оно еще сделает 3 операции: сложение, печать и умножение. Я именно про эти операции говорю, а не про возвраты. Не знаю, почему она не является несколькими операциями по Вашему, возможно я не правильно упоминаю термины. Может быть операцией называется действие, которое меняет состояние внешней переменной… тогда да. Это не операция. Ну ладно, я не хочу спорить на эту тему.

py.user.next
… я тебя отправляю учиться азам….

Спасибо за наставления, непременно отправляюсь. Учиться я люблю. Именно этим и занимаюсь.

py.user.next
…Начинать надо, как обычные школьники делают, со всяких простейших вещей, не считая себя при этом самым умным…

Простите, если Вам показалось, что я считаю себя самым умным. Возможно я где-то не правильно выразился, что у Вас сложилось такое мнение. Я совсем не самый умный и нахожусь только в начале развития. Базовые основы всегда готов закрепить, что и делаю каждый день. lambda функции - новинка, пока не раскрытая.

first-step
Вот где прочитать, что лямбда функция умеет, а что не умеет? )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB