功能map(func,iterable)
可以很容易地应用于普通函数,但如果我想将a_method
应用于实例列表,我该怎么办呢?我知道列表推导可以快速完成,但仍然想看看是否存在功能方式并且还感觉到pythonic。
class cls(object):
def __init__(self,val):
self.val=val
def clstest(self,val):
return self.val==val
a=cls(9)
b=cls(18)
c=cls(19)
lst=[a,b,c]
然后以下工作:list(map(repr,lst))
返回
['<__main__.Cls object at 0x00000000070EDB70>',
'<__main__.Cls object at 0x00000000070EDBE0>',
'<__main__.Cls object at 0x00000000070EDE80>']
,但list(map(clstest(10),lst))
会有错误消息:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-165-f10396f98b58> in <module>()
----> 1 list(map(clstest,lst))
NameError: name 'clstest' is not defined
更新:纠正我在定义课程时的错误。错误消息仍然存在。
答案 0 :(得分:1)
另一种可能性(在this answer的帮助下)
class cls(object):
def __init__(self,val):
self.val=val
def clstest(self,val):
return self.val==val
a=cls(9)
b=cls(10)
c=cls(19)
lst=[a,b,c]
# use functools.partial
from functools import partial
list(map(partial(cls.clstest,val=10),lst))
答案 1 :(得分:1)
这是你在找什么?
import operator
lst = [ cls(9), cls(18), cls(19) ]
x = operator.methodcaller('clstest', 10)
map( x, lst )
methodcaller
函数创建一个可调用对象,该对象在其参数上调用命名方法,因此例如x(lst[0])
与lst[0].clstest(10)
相同。
答案 2 :(得分:0)
您应该将函数包装在lambda
:
list(map(lambda instance: instance.clstest(10), lst))
或者正如您所提到的,作为列表理解:
[instance.clstest(10) for instance in lst]
此外,这一行让我哭泣:lst=list([a,b,c])
应该是lst = [a,b,c]
答案 3 :(得分:0)
代码中的第一个单词应该是 class ,而不是 def 。 Python中接受的做法是给出 ClassNames ( cls 通常用于类方法)。而你的缩进需要修复。
这是未经完整的完整答案
class MyClass(object):
def __init__(self,val):
self.val=val
def clstest(self,val):
return self.val==val
objects = [MyClass(v) for v in (9, 18,19)]
map(lambda o: o.clstest(10), objects)
答案是 - 是的,你可以