Рассмотрим следующий код, который просто вызывает метод для каждого члена списка:
class Demo:
def make_change(self):
pass
foo = [Demo(), Demo(), Demo()]
map(lambda x: x.make_change(), foo)
Есть ли способ выполнить это без синтаксиса синтаксиса lambda
? Например, в Scala работает нечто подобное map(_.make_change(), foo)
. Имеет ли Python эквивалент?
Не очень pythonic использовать карту только для побочных эффектов
так почему бы не
for item in foo:
item.make_change()
Это будет работать быстрее, чем использование карты
вы можете поместить его на одну строку, если вы настаиваете, но я бы не
for item in foo:item.make_change()
operator.methodcaller('make_change')
Как насчет синтаксиса генератора?
>>> [x.make_change() for x in foo]
[None, None, None]
(где None
исходит из того факта, что нет возвращаемого значения в классе примера, конечно.)
Я с гнибблером на питоничность. Кроме того, это также возможно:
map(Demo.make_change, foo)
У него есть проблемы:
class Demo(object):
def __init__(self):
self.x = 1
self.y = 2
def make_change(self):
self.x = 5
class SubDemo(Demo):
def make_change(self):
self.y = 7
d = Demo()
s = SubDemo()
map(Demo.make_change, [d, s])
assert d.x == 5 and s.y == 7 # oops!