Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 5, 2019 16:29:31

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

 a = print
>>> 
>>> a('x')

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

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

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

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

Офлайн

#2 Апрель 5, 2019 16:44:21

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

> А вот запись lambda arg1, *arg2: arg1(arg1, *arg2) , хоть убейте - не понятна…

Вот та же запись с обычными функциями. Надеюсь что это тебе поможет

 def foo(arg1, *arg2):
    return arg1(arg1, *arg2)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Апрель 5, 2019 16:44:41)

Офлайн

#3 Апрель 5, 2019 16:56:08

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

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]

А если если не определить, то будет ругаться.

Офлайн

#4 Апрель 5, 2019 16:59:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

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

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

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


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

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



Отредактировано py.user.next (Апрель 5, 2019 17:14:53)

Офлайн

#5 Апрель 5, 2019 17:46:40

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

py.user.next
Да. Функция при вызове будет принимать два аргумента. Второй аргумент должен будет быть функцией, так как внутри функции этот второй аргументы вызывается как функция.

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

Офлайн

#6 Апрель 5, 2019 21:00:11

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

Функция задается за пределами лямбды и передаётся как аргумент в лямбду, т.е. где-то в коде, вне lambda находится эта функция. Например:

  x = lambda arg1, arg2: arg2(arg1, arg2)
x(123, какая_то_функция)   # Вот здесь передается ФУНКЦИЯ в arg2
# эта самая "какая_то_функция" может быть встроенной, импортируемой, заданной пользователем,
#короче, любой функцией, которая по задумке автора кода должна быть здесь

Отредактировано Rafik (Апрель 5, 2019 21:04:35)

Офлайн

#7 Апрель 6, 2019 00:15:43

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

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

 x = lambda k, m: ((k + m),(print (m)),(k * m))

Отредактировано first-step (Апрель 6, 2019 00:16:41)

Офлайн

#8 Апрель 6, 2019 01:55:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

first-step
Простите, а что именно должна делать эта вызываемая функция? Где задается ее описание?
Там, где она определена. Например, функция print определена в исходниках питона. То, как работает функция, находится в её определении.

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

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

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



Отредактировано py.user.next (Апрель 6, 2019 02:21:05)

Офлайн

#9 Апрель 6, 2019 11:24:54

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

Уважаемый py.user.next, я прохожу курс обучения с нулевого уровня. Обычные функции и кортежи прошли. Вы не думайте, что я совсем уж тупой и прямо начал с изучения лямбда функций сначала. Просто на курсах не было уделено много внимания lambda функциям и они упоминались, но довольно поверхностно их синтаксис вообще не рассматривался, поэтому я столкнулся с незнакомыми штучками.

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

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

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

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

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

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

Офлайн

#10 Апрель 6, 2019 12:30:01

first-step
Зарегистрирован: 2015-09-21
Сообщения: 36
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помощи в разборе с лямбда функцией

Вот где прочитать, что лямбда функция умеет, а что не умеет? )

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version