Can Python';s映射函数调用对象成员函数?

Can Python';s映射函数调用对象成员函数?,python,Python,我需要做一些功能等同于此的事情: for foo in foos: bar = foo.get_bar() # Do something with bar 我的第一反应是使用map,但这不起作用: for bar in map(get_bar, foos): # Do something with bar 我试图通过map实现的目标可能实现吗?我需要使用列表理解吗?关于这一点,最具Python风格的成语是什么?你想要的。当然,也可以是列表或生成器理解。使用lambda

我需要做一些功能等同于此的事情:

for foo in foos:
    bar = foo.get_bar()
    # Do something with bar
我的第一反应是使用
map
,但这不起作用:

for bar in map(get_bar, foos):
    # Do something with bar

我试图通过
map
实现的目标可能实现吗?我需要使用列表理解吗?关于这一点,最具Python风格的成语是什么?

你想要的。当然,也可以是列表或生成器理解。

使用
lambda

for bar in map(lambda foo: foo.get_bar(), foos):
或者简单地使用实例类上的实例方法引用:

for bar in map(Foo.get_bar, foos):
由于这是从注释中添加的,我想指出的是,这要求
foos
的项必须是
Foo
的实例(即
all(对于foos中的Foo,isinstance(Foo,Foo))必须为true),而不仅仅是其他选项使用
get\u bar
方法的类实例。仅此一点就足以作为不包括在这里的理由

或使用
methodcaller

import operator
get_bar = operator.methodcaller('get_bar')
for bar in map(get_bar, foos):
或使用生成器表达式:

for bar in (foo.get_bar() for foo in foos):

修改后的代码将起作用:

for bar in map(lambda f: f.get_bar(), foos):
# Do something with bar
这里提供lambda函数。仅仅提供
get\u bar
是行不通的,因为它只能通过类的实例(
f.get\u bar()
)访问,而不能单独访问。

您可以使用lambda


我认为最干净的方法是完全放弃
for
-循环,使用列表理解:

bars = [foo.get_bar() for foo in foos]
这个答案与其他一些答案相近,但不同之处在于列表实际上是返回的,而不是在后续循环中使用。根据您对
条所做的操作
,您可以使用列表来理解


我不认为带有
lambdas
map
函数具有特别的可读性,而且
map
的开销相当大。

我想在较新版本的Python中,列表理解是首选的,对吗?如果您将其更新为包含使用LC的示例代码,我将很乐意接受您的答案。:)@JoshGlover“Python的新版本”?它们至少可以追溯到2.3。Python 2.0中添加了列表理解。为什么不使用列表理解?@agf,因为列表理解用于创建列表,而不仅仅是调用序列中每个元素的函数。与Pythonic的顺序相反。另外,
map(Foo.get\u bar,foos)
其中
Foo
foos
中的对象类。我决定使用lambda,因为我意识到我需要在代码中的几个位置执行此转换,
Bar
需要字符串化和小写。:)@Dan D:如果一个参数需要传递到get_bar()中怎么办?比如get_bar(val)?@Spade我知道这已经晚了,但可能会帮助其他人。有两种方法可以做到这一点:1)使用在更高级别范围内(在定义lambda的方法内或全局范围内)定义的变量val。通常,这将作为每个理解的常数。或者,如果您有一个已知的参数序列,您可以将对象和参数压缩在一起,并使用lambda像这样挑选对象和参数--
lambda xy:xy[0]。获取工具栏(xy[1])
foos
将改为
xys=zip(foos,参数)
。这可能会变得丑陋,辅助功能或替代设计可能会更好。
bars = [foo.get_bar() for foo in foos]