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]