Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 14, 2011 13:51:45

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

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

def init():                                                                                       
cb = []
for i in range(10):
cb.append(lambda x: x*i)
return cb

for l in init():
print l(2)



Офлайн

#2 Ноя. 14, 2011 14:02:25

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

Переменная i - одна на все лямбда-функции. Очевидно, после выполнения цикла она будет равна 9, и как результат 2*9=18 для всех функций.



Офлайн

#3 Ноя. 14, 2011 16:12:17

Юрчек
От:
Зарегистрирован: 2009-04-14
Сообщения: 45
Репутация: +  0  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

Isem
Переменная i - одна на все лямбда-функции. Очевидно, после выполнения цикла она будет равна 9, и как результат 2*9=18 для всех функций.
Ах вот оно как. Спасибо, все встало на свои места.



Офлайн

#4 Ноя. 14, 2011 16:38:52

Spectral
От:
Зарегистрирован: 2010-07-13
Сообщения: 51
Репутация: +  1  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

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

def init():                                                                                       
cb = []
for i in range(10):
cb.append(lambda x: x*i)
return cb

for l in init():
print l(2)
Возможно, вы хотели вот так:
def init():                                                                                       
cb = []
for i in xrange(10):
cb.append(lambda x,i: x*i)
return cb


for l in xrange(len(init())):
print init()[l](2, l)
?



Офлайн

#5 Ноя. 14, 2011 17:51:30

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

Вот так обмануть можно:

from __future__ import print_function
def init():
cb = []
for i in xrange(10):
cb.append(eval('lambda x: x * %s' % i, globals(), locals()))
return cb
for f in init():
print(f(2), end=" ")
----------------------------------
0 2 4 6 8 10 12 14 16 18



Отредактировано (Ноя. 14, 2011 17:52:00)

Офлайн

#6 Ноя. 15, 2011 00:38:18

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

Но можно сделать так:

def init():
def get_lambda(i): return lambda x: x*i
return [get_lambda(i) for i in range(10)]

for l in init():
print( l(2) )
В этом случае переменные i после вызова функции get_lambda уже будут разными сущностями и каждая лямбда-функция будет ссылаться на свою переменную i.



Отредактировано (Ноя. 15, 2011 02:54:39)

Офлайн

#7 Ноя. 15, 2011 07:10:35

Virtuos86
От:
Зарегистрирован: 2010-11-17
Сообщения: 33
Репутация: +  1  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

# Используем "заморозку" значения переменной
def init():
cb = []
for i in xrange(10):
cb.append(lambda x, i=i: x*i)
return cb

for l in init():
print l(2)

# Используем замыкание
def init():
cb = []
for i in xrange(10):
cb.append(
(lambda i: lambda x: x*i)(i)
)
return cb

for l in init():
print l(2)



Офлайн

#8 Ноя. 27, 2011 01:51:28

baa
От:
Зарегистрирован: 2011-11-25
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

объясните на что умножается x ?

def init():
return [lambda x,i=i: x*i for i in range(10)]

for l in init():
print l(2)



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version