我能画一张地图吗;“绑定”;方法使用python中的map()创建实例列表?
functional我能画一张地图吗;“绑定”;方法使用python中的map()创建实例列表?,python,functional-programming,Python,Functional Programming,functionalmap(func,iterable)可以很容易地应用于普通函数,但是如果我想将a_方法应用于实例列表,我该怎么做呢?我知道列表理解可以很快做到这一点,但我还是想看看是否存在一种功能性的方式,并且感觉像是pythonic class cls(object): def __init__(self,val): self.val=val def clstest(self,val): return self.val==val a=cls(
map(func,iterable)
可以很容易地应用于普通函数,但是如果我想将a_方法应用于实例列表,我该怎么做呢?我知道列表理解可以很快做到这一点,但我还是想看看是否存在一种功能性的方式,并且感觉像是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>']
更新:更正我在定义类时的错误。错误消息仍然存在。您应该将函数包装在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]
代码中的第一个单词应该是class,而不是def。
Python中公认的做法是提供类名(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)
答案是-是的,你可以另一种可能性(在
类cls(对象):
定义初始值(self,val):
self.val=val
def clstest(自身,val):
返回self.val==val
a=cls(9)
b=cls(10)
c=cls(19)
lst=[a,b,c]
#使用functools.partial
从functools导入部分
列表(地图(局部(cls.clstest,val=10),lst))
这就是你要找的吗
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)
首先,def cls(object)
定义一个名为cls
的函数,该函数使用一个名为object的参数。如果您想要一个从对象继承的类
,那么应该使用类cls(对象)
。其次,在你的地图中尝试cls.clstest
,这是非常正确的(可能只是复制到SO中的一个打字错误),但我不相信它回答了OP的问题。@mhlester,我没有竞争答案-你已经提供了一个。你有没有试过你的-它对现在的定义有用吗?(顺便说一句,downvote不是我)。如果你没有回答这个问题,这应该是一个评论,而不是一个你也没有回答的答案——用错误的定义,你的答案是错误的useless@NathaneilCapital,因为clstest是在类的边界内定义的。请看我编辑的answerpartial在保存引用时很有用,在这种情况下这是对资源的浪费apartial
对象只是一个包装器,类似于lambda,但具有更灵活的语义。这会起作用,但使用“``按名称调用方法似乎不是很“平滑”(pythonic?)。
import operator
lst = [ cls(9), cls(18), cls(19) ]
x = operator.methodcaller('clstest', 10)
map( x, lst )