Найти - Пользователи
Полная версия: lambda и иже с ними
Начало » Python для новичков » lambda и иже с ними
1 2
Aris_P@
Хочу запилить список функций. Если перебираю методы класса вручную - список 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()
fongostev
А зачем тебе объявление класса в теле функции раз, два, лямбда здесь не нужна, ну и третье, ты не передаешь в лямбду ни одного аргумента.
sergeek
Aris_P@
используй map, у тебя же лямбды связываются с указателем, указатель на каждой итерации меняется

Aris_P@
fongostev
А зачем тебе объявление класса в теле функции раз, два, лямбда здесь не нужна, ну и третье, ты не передаешь в лямбду ни одного аргумента.
раз - класс для примера, думаю не стоит выкладывать сюда весь проект
два - расскажите как сделать список функций не через лямбду?
три - в лямбду можно не передавать ни одного аргумента
Aris_P@
sergeek
Aris_P@используй map, у тебя же лямбды связываются с указателем, указатель на каждой итерации меняется
спасибо, похоже это то, что надо :)
fongostev
Aris_P@
два - расскажите как сделать список функций не через лямбду?
Просто через вызов функции или, как было указано выше, через map, что по сути одно и то же:
[f(x) for x in list]
map(f, list)
py.user.next
так
    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))
Aris_P@
fongostev
Просто через вызов функции или, как было указано выше, через map, что по сути одно и то же:
вы наверно не поняли что мне нужно - мне надо не вызвать функции здесь и сейчас, надо сформировать из них список
с map можно сделать так
list_func_err = map(lambda x:x.Show, test_dict.values())
py.user.next
так
тоже вариант решения, а sorted вы для копирования делали?
py.user.next
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())
так оно тоже в произвольном порядке
Aris_P@
py.user.next
а порядок мне неважен, мне надо сформировать список функций, которые будут потом вызываться
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