Python:在map函数中调用方法

8

map() 和列表推导式大致相当:

map(function, list1)
[function(i) for i in list1]

如果我们想要使用的函数是一个方法怎么办?

[i.function() for i in list1]
map(.function, list1) # error!
map(run_method(function), list1) # error!

我该如何使用map进行这种操作?
2个回答

18
你可以使用 operator.methodcaller()
from operator import methodcaller

map(methodcaller('function'), list1)
methodcaller() 接受额外的参数,然后将它们传递给被调用的方法;methodcaller('foo', 'bar', spam='eggs')(object) 相当于 object.foo('bar', spam='eggs')
如果 list1 中所有对象都是相同类型或该类型的子类,并且您想要调用的方法不需要任何参数,则可以将未绑定的方法作为要调用的函数传递给 map。例如,要将列表中的所有字符串转换为小写,您可以使用:
map(str.lower, list_of_strings)

str.lower 是字符串类型上的未绑定方法。

请注意,列表推导式并不真正等同于 map()map() 只能执行一个完全在 C 语言层面完成的循环操作。 map() 会将多个可迭代对象使用 zip() 进行配对,并且Python 3中的 map() 本身也是一个迭代器。

另一方面,列表推导式可以执行多个(嵌套的)循环和过滤操作,而左侧表达式可以是任何有效的 Python 表达式,包括嵌套的列表推导式。


1
你可以使用对象的类型直接调用该方法。
map(lambda x: type(x).function(), list1)

这并没有比更加直接的方式更加令人兴奋。

map(lambda x: x.function(), list1)

然而,它指出如果Python有一个函数组合运算符会很好,类似于f ** g(x) == f(g(x))。那么你就可以这样写

map(type**function, list1)

你实际上并没有调用函数;在lambda中使用type()调用是相当无意义的,因为它只是将对象映射到解除引用仅仅方法。只有当列表中的所有对象都是相同类型,并且您使用未绑定方法的直接引用时,它才变得有趣。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接