Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 21, 2014 16:26:51

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

lambda и иже с ними

Хочу запилить список функций. Если перебираю методы класса вручную - список list_func_ok, то все ок - вызываются методы разных объектов.
Если перебираю методы в цикле (список list_func_err) - вызывается метод одного объекта.
Подскажите кто виноват и что делать?)

def test():
    class TestObj:
        def __init__(self , _id):
            self.id = _id
        def Show(self):
            print 'object has id %s'%self.id
        def GetId(self):
            return self.id
    test_dict = {'0':TestObj('0'), '1':TestObj('1'), '2':TestObj('2')}
    list_func_ok = [lambda:test_dict['0'].Show(), lambda:test_dict['1'].Show(), lambda:test_dict['2'].Show()]
    list_func_err = [lambda:test_dict[key].Show() for key in test_dict]
    for func in list_func_ok:
        func()
    print ' '
    for func in list_func_err:
        func()        
test()



Офлайн

#2 Апрель 21, 2014 18:25:43

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

lambda и иже с ними

А зачем тебе объявление класса в теле функции раз, два, лямбда здесь не нужна, ну и третье, ты не передаешь в лямбду ни одного аргумента.

Офлайн

#3 Апрель 21, 2014 19:37:53

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

lambda и иже с ними

Aris_P@
используй map, у тебя же лямбды связываются с указателем, указатель на каждой итерации меняется

Офлайн

#4 Апрель 21, 2014 19:47:05

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

lambda и иже с ними

fongostev
А зачем тебе объявление класса в теле функции раз, два, лямбда здесь не нужна, ну и третье, ты не передаешь в лямбду ни одного аргумента.
раз - класс для примера, думаю не стоит выкладывать сюда весь проект
два - расскажите как сделать список функций не через лямбду?
три - в лямбду можно не передавать ни одного аргумента



Офлайн

#5 Апрель 21, 2014 19:52:55

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

lambda и иже с ними

sergeek
Aris_P@используй map, у тебя же лямбды связываются с указателем, указатель на каждой итерации меняется
спасибо, похоже это то, что надо :)



Офлайн

#6 Апрель 21, 2014 20:42:14

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

lambda и иже с ними

Aris_P@
два - расскажите как сделать список функций не через лямбду?
Просто через вызов функции или, как было указано выше, через map, что по сути одно и то же:
[f(x) for x in list]
map(f, list)

Офлайн

#7 Апрель 21, 2014 22:06:26

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

lambda и иже с ними

так

    list_func_err = [test_dict[key].Show for key in sorted(test_dict)]

или так
    list_func_err = [lambda key=key: test_dict[key].Show()
                     for key in sorted(test_dict)]

fongostev
как было указано выше, через map, что по сути одно и то же
там есть разница, для map понадобится двойная lambda

list_func_err = map(lambda i: lambda: test_dict[i].Show(), sorted(test_dict))



Отредактировано py.user.next (Апрель 21, 2014 22:16:32)

Офлайн

#8 Апрель 21, 2014 22:59:41

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

lambda и иже с ними

fongostev
Просто через вызов функции или, как было указано выше, через map, что по сути одно и то же:
вы наверно не поняли что мне нужно - мне надо не вызвать функции здесь и сейчас, надо сформировать из них список
с map можно сделать так
list_func_err = map(lambda x:x.Show, test_dict.values())
py.user.next
так
тоже вариант решения, а sorted вы для копирования делали?



Офлайн

#9 Апрель 21, 2014 23:06:03

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

lambda и иже с ними

Aris_P@
а sorted вы для копирования делали?
>>> d = {'0': 1, '1': 2}
>>> d
{'1': 2, '0': 1}
>>>

для упорядочивания

Aris_P@
list_func_err = map(lambda x:x.Show, test_dict.values())
так оно тоже в произвольном порядке



Офлайн

#10 Апрель 21, 2014 23:07:27

Aris_P@
От:
Зарегистрирован: 2010-07-24
Сообщения: 46
Репутация: +  2  -
Профиль   Отправить e-mail  

lambda и иже с ними

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



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version