Python 为什么地图功能无效?

Python 为什么地图功能无效?,python,python-3.x,class,dictionary,Python,Python 3.x,Class,Dictionary,我没有被打动,但我觉得很奇怪。下面是我编写的代码片段: from hashClass import HashTable a = HashTable(11) input_value = list((54,26,93,17,77,31,44,55,20)) map(lambda x: a.put(x,x),input_value)) print(a.data) 我已经创建了自己的哈希表类。它有一个名为put的方法,该方法接受键值对和HashTable.data属性显示表中的所有值 当我对正常的

我没有被打动,但我觉得很奇怪。下面是我编写的代码片段:

from hashClass import HashTable

a = HashTable(11)
input_value = list((54,26,93,17,77,31,44,55,20))

map(lambda x: a.put(x,x),input_value))
print(a.data)
我已经创建了自己的哈希表类。它有一个名为put的方法,该方法接受键值对和HashTable.data属性显示表中的所有值

当我对正常的键值对使用put方法时,它工作得非常好。我知道该解决方案可以通过以下方式实施:

for i in input_value: a.putt(i,i)
但是我想知道为什么map函数无效?当我尝试用put方法映射每个输入值时,如果我没有错的话,它必须将值添加到实例中。我的理由是我可能没有使用映射值,但在语法上,当我映射时,它应该更新实例变量

下面是我创建的供参考的哈希类

class HashTable(object):

    def __init__(self,size):
        self.size = size
        self.slots = self.size*[None]
        self.data = self.size*[None]
        self.values = 0

    def put(self,key,value):
        hashValue = self.hashFunction(key)
        if self.slots[hashValue] == None:
            self.slots[hashValue] = key
            self.data[hashValue] = value
            self.values += 1
        elif self.slots[hashValue] == key:
            self.data[hashValue] = value
        else:
            hashValue = self.reHash(hashValue)
            while self.slots[hashValue] != None and self.slots[hashValue] != key:
                hashValue = self.reHash(hashValue)
            self.slots[hashValue] = key
            self.data[hashValue] = value
            self.values += 1


    def reHash(self,oldValue):
        return (oldValue+1)%self.size

    def __len__(self):
        return self.values


    def get(self,key):
        hashValue = self.hashFunction(key)
        if self.slots[hashValue] == None:
            return "No Value associated"
        elif self.slots[hashValue] == key:
            return self.data[hashValue]


    def hashFunction(self,key):
        return key%self.size

我将在这里冒险,假设你正在使用蟒蛇3

对于python3,延迟评估非常方便,这意味着除非确实需要,否则它不会执行其功能。你要做的是使用地图产生副作用。当然,您可以通过以下方式完成此操作:

list(map(lambda x: a.put(x,x), input_value)))
该列表强制进行评估

然而,使用map作为副作用有点反模式。我更喜欢更清晰、更地道的东西,比如你提到的for循环

例如:

In [854]: s = set()

In [862]: m = map(lambda x=x: s.add(x), [1, 2, 3])

In [863]: s
Out[863]: set()
到目前为止,s没有发生任何事情。现在,将列表应用于贴图对象

无副作用是典型的副作用症状。然而

In [865]: s
Out[865]: {1, 2, 3}

所以,它起作用了。但是它看起来确实不太好。

我想在这里做一个假设,假设你正在使用Python3

对于python3,延迟评估非常方便,这意味着除非确实需要,否则它不会执行其功能。你要做的是使用地图产生副作用。当然,您可以通过以下方式完成此操作:

list(map(lambda x: a.put(x,x), input_value)))
该列表强制进行评估

然而,使用map作为副作用有点反模式。我更喜欢更清晰、更地道的东西,比如你提到的for循环

例如:

In [854]: s = set()

In [862]: m = map(lambda x=x: s.add(x), [1, 2, 3])

In [863]: s
Out[863]: set()
到目前为止,s没有发生任何事情。现在,将列表应用于贴图对象

无副作用是典型的副作用症状。然而

In [865]: s
Out[865]: {1, 2, 3}

所以,它起作用了。但它看起来确实不太好。

您的映射行似乎有一个额外的右参数?我怀疑您使用的是Python 3,其中映射返回一个迭代器。因此,在遍历map迭代器之前,map不会调用该函数。然而,你们不应该纯粹为了这种副作用而使用map。@PM2Ring:是的,这是有道理的。我同样使用Python3,这样做是不好的风格[a.putx,在input_值中x代表x],因为它使用列表理解方法调用的副作用,并且您实际上不想要列表,它可能没有任何内容。您的映射行似乎有一个额外的右参数?我怀疑您使用的是Python3,其中map返回一个迭代器。因此,在遍历map迭代器之前,map不会调用该函数。然而,你们不应该纯粹为了这种副作用而使用map。@PM2Ring:是的,这是有道理的。我同样使用python3,这样做是不好的风格[a.putx,在input_值中x代表x],因为它使用列表理解来处理方法调用的副作用,而您实际上并不想要列表,它可能没有任何内容。这是一个巨大的变化,永远不会改变为python3,然后:D更多,像l=map这样的作业。。。触发惰性评估?没有python3可供尝试。应该是m=maplambda x:s.addx,顺便说一句,在您的示例中,[1,2,3]无法编辑答案,因为6个字符规则没有meet@armnotstrong1.它没有,并且2。这是有效的语法-lambda的作用域说明符。检查屏幕截图上的版本,它是Python3.6.2LOL,这就是为什么人们不使用Python3:D这是一个巨大的变化,永远不会改变为Python3:D更多,像l=map这样的赋值。。。触发惰性评估?没有python3可供尝试。应该是m=maplambda x:s.addx,顺便说一句,在您的示例中,[1,2,3]无法编辑答案,因为6个字符规则没有meet@armnotstrong1.它没有,并且2。它是有效的语法-lambda的作用域说明符。检查屏幕截图上的版本,它是Python3.6.2LOL,这就是人们不使用Python3:D的原因