gmorgunov
Ноя. 5, 2008 14:46:51
Добрый день
Стал разбираться , как работает lambda-функция, и чем дальше-тем непонятнее.Пример взял с
http://docs.python.org/tutorial/controlflow.html#lambda-formsИз примера станет понятно, что непонятно :)
#!/usr/bin/python
# coding: utf-8
#===============================================================
# 1)
f=lambda x,n:x+n
print f(99,1)
# получаем 100
# понятно
#===============================================================
# 2)
def incr(n):
return lambda x:x+n
f=incr(99)
print f(1)
# получаем 100
# не совсем понятно
#===============================================================
# 3)
def incr(x,n):
return lambda x,n:x+n
f=incr(99,1)
print f
# получаем <function <lambda> at 0xb7c2010c> т.е. сегфолт ?
# совсем непонятно
#===============================================================
Объясните , пожалуйста, как передаются параметры в lambda. Можно с (int*) ,(void*) т.е. с использованием С
Спасибо откликнувшимся.
ice
Ноя. 5, 2008 15:06:58
# 2)
def incr(n):
return lambda x:x+n
функция incr(n) возвращает фукцию, которая принимает 1 аргумент, а второй аргумент (n) уже установлен в
f=incr(99)
поэтому возвращается вот такая функция lambda x:x+99
# 3)
def incr(x,n):
return lambda x,n:x+n
Вот этого я не понял для чего сделал.
# 3)
def incr(x,n):
return lambda:x+n
Вот если так:))
тогда
>>> f=incr(99,1)
>>> f()
но, по мойму бесполезно … хотя …
Dimka665
Ноя. 5, 2008 15:13:58
2) функция incr возвращает функцию, которая прибавляет к аргументу n, который задается при вызове incr.
3) получаем функцию, которая складывает 2 аргумента.
параметры передать можно так:
а) def incr():
n = 1
return lambda x:x + n
или так
б) def incr(x,n):
return lambda x,n=n:x+n
gmorgunov
Ноя. 5, 2008 15:57:33
Спасибо
ice Dimka665,за то,что откликнулись, но я это проверял раньше( лекции мехмата)
Проверяем сейчас:
#===============================================================
# 2)
def incr(x,n):
n=1
return lambda x:x+n
f=incr(99,1)
print f
#===============================================================
# 3)
def incr(x,n):
return lambda x,n=n:x+n
f=incr(99,1)
print f
#===============================================================
Получаем:
mike@linux:~> ./t.py
<function <lambda> at 0xb7c44684>
<function <lambda> at 0xb7c41ed4>
Т.е. опять - сегфолт.
Александр Кошелев
Ноя. 5, 2008 15:59:53
gmorgunov
Т.е. опять - сегфолт.
а что вы его всё время упоминаете? Где вы его нашли тут? Это абсолютно нормальный результат.
shiza
Ноя. 5, 2008 16:00:13
ы! это не сегфолт.
а как вы думали вам могут функцию напечатать? (не результат ее работы, а саму функцию)
gmorgunov
Ноя. 5, 2008 16:20:50
shiza
ы! это не сегфолт.
а как вы думали вам могут функцию напечатать? (не результат ее работы, а саму функцию)
А как мне получить результат ее работы. Если можно код(так непонятно :) ).
Где ошибка в последних примерах?
shiza
Ноя. 5, 2008 16:26:53
ошибок нет.
f - название фукнции.
f() - так ее вызывают.
print f - напечатали все что могли по названию функции, не вызывая ее (название, место в памяти и пр)
print f() - вызвали функцию, напечатали результат ее работы.
gmorgunov
Ноя. 5, 2008 16:43:43
shiza
ошибок нет.
f - название фукнции.
f() - так ее вызывают.
print f - напечатали все что могли по названию функции, не вызывая ее (название, место в памяти и пр)
print f() - вызвали функцию, напечатали результат ее работы.
Спасибо, пойду проветрюсь, потом обмозгую:
#===============================================================
# 2)
def incr(x,n):
n=1
return lambda x:x+n
f=incr(99,1)
print f(1)
#===============================================================
# 3)
def incr(x,n):
return lambda x,n=n:x+n
f=incr(99,1)
print f(99,1)
#===============================================================
Дает:
2
100
Вроде,что надо :)
ZZZ
Ноя. 6, 2008 00:50:06
Здесь самое главное понять, что в питоне ВСЁ ЯВЛЯЕТСЯ ОБЪЕКТАМИ. Даже функции и лямбды.
Объект может быть вызываемым (как функция, например) а может и нет (int, str…).