我需要做一些与此功能相同的事情:
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
实现目标吗?我需要使用列表理解吗?对此最常用的Pythonic成语是什么?
答案 0 :(得分:45)
使用lambda
:
for bar in map(lambda foo: foo.get_bar(), foos):
或者只是在实例的类上使用实例方法引用:
for bar in map(Foo.get_bar, foos):
由于这是从评论中添加的,我想请注意,这需要foos
的项目为Foo
的实例(即all(isinstance(foo, Foo) for foo in foos)
必须为真)并且不仅因为其他选项使用get_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):
答案 1 :(得分:7)
你想要operator.methodcaller()
。或者,当然,列表或生成器理解。
答案 2 :(得分:4)
我认为最干净的方法是完全放弃varContentType="application/json; charset=utf-8";
$.ajax({
type: varType, //GET or POST or PUT or DELETE verb
url: varUrl, // Location of the service
data: varData, //Data sent to server
contentType: varContentType, // content type sent to server
dataType: varDataType, //Expected data format from server
processData: false,
crossDomain: true,
});
- 循环并使用列表理解:
for
这个答案接近其他一些答案,但不同之处在于列表实际上已经返回而未在后续循环中使用。根据您对bars = [foo.get_bar() for foo in foos]
的处理方式,您可以使用列表推导。
除了bars
的开销很大,我认为map
lambdas
函数与map
的特殊性无关。
答案 3 :(得分:2)
此修改后的代码将起作用:
for bar in map(lambda f: f.get_bar(), foos):
# Do something with bar
你在这里提供lambda功能。简单地提供get_bar
不起作用,因为它只能通过类(f.get_bar()
)的实例访问,而不能单独访问。
答案 4 :(得分:1)
您可以使用 lambda
for bar in map(lambda foo: foo.get_bar(), foos):
# Do something with bar