2013-08-22 84 views
8
class FoodExpert: 
    def init(self): 
     self.goodFood = [] 
    def addGoodFood(self, food): 
     self.goodFood.append(food) 
    def likes(self, x): 
     return x in self.goodFood 
    def prefers(self, x, y): 
     x_rating = self.goodFood.index(x) 
     y_rating = self.goodFood.index(y) 
     if x_rating > y_rating: 
      return y 
     else: 
      return x 

聲明這個類之後,我寫了這個代碼:地圖方法

>>> f = FoodExpert() 
>>> f.init() 
>>> map(f.addGoodFood, ['SPAM', 'Eggs', 'Bacon', 'Rat', 'Spring Surprise']) 
[None, None, None, None, None] 

>>> f.goodFood 
['SPAM', 'Eggs', 'Bacon', 'Rat', 'Spring Surprise'] 

我無法理解的地圖功能是如何工作的篷子後面,爲什麼它返回所有列表None,但是當我檢查f.goodFood時,元素已添加到那裏?

+1

請注意,像這樣使用'map'是一個壞主意。使用'for'循環;它不會創建一個列表,並且它將在Python 3中工作,而不需要將它包裝在「list」調用中。 – user2357112

+0

(你是否期待'map'調用返回'f.goodFood'?它不,它甚至不知道'f.goodFood'是相關的。) – user2357112

+0

對於這個用法,你最好做' f.goodFood.extend([「垃圾郵件」,「雞蛋」等))' – Daenyth

回答

9

map在迭代器上應用函數並返回一個新的列表,其中函數應用於每個項目。

在你的情況下,它顯示None,因爲f.addGoodFood函數什麼都沒有返回。

出於測試目的更改addGoodFood這樣:

def addGoodFood(self, food): 
    self.goodFood.append(food) 
    return "test" 

看:

>>> map(f.addGoodFood, ['SPAM', 'Eggs', 'Bacon', 'Rat', 'Spring Surprise']) 
['test', 'test', 'test', 'test', 'test'] 
3

result = map(function, iterable)等同於:

result = [] 
for item in iterable: 
    result.append(function(item)) 

所以在內部它建立在它附加應用功能列表中的每個項目的結果列表。

由於你的函數addGoodFood什麼也沒有返回,所以map函數返回一個None的列表。

你的函數有一個副作用,將它的項目追加到goodFoods列表中,goodFoods列表被填充幷包含所有元素。但是,正如我所說的,因爲函數返回沒有map返回一個與原始列表大小相同的列表(因爲它應用在每個元素上)全部爲None s。

5

這是因爲addGoodFood沒有返回任何東西。讓它返回的東西:

def addGoodFood(self, food): 
    self.goodFood.append(food) 
    return food 

map是創建結果列表中的每個項目調用addGoodFood的列表。而且,由於列表的append方法始終返回None,因此您會得到一個None的列表。

此外,您可能希望將init功能改成這樣:

def __init__(self): 
    self.goodFood = [] 

__init__是處理一類的初始化的特殊方法。使用它意味着你不必做f.init()

4

在問題的代碼返回與None元素的列表,因爲addGoodFood()明確返回任何東西(隱式,它會返回None)。 map()收集您調用的函數的結果,並用這些結果創建一個新列表。

您不應該使用map()帶有不返回值的函數。在這種情況下,addGoodFood()而不是是使用它的好候選。這是你應該怎麼寫呢:

for food in ['SPAM', 'Eggs', 'Bacon', 'Rat', 'Spring Surprise']: 
    f.addGoodFood(food) 

要回答這個問題:如何做引擎蓋下map()工作?這裏是如何:它

def map(func, lst): 
    result = [] 
    for e in lst: 
     result.append(func(e)) 
    return result 

在上面的功能是顯而易見的,爲什麼你要None元素爲結果的列表:如果傳遞函數返回None,那麼循環將執行result.append(None),返回的列表僅會在每個位置包含None

+2

我明白你在說什麼,我正在從書中學習python,我從那裏實現了這個代碼,這就是爲什麼我也感到困惑! – AbKDs

3

因爲你沒有從addGoodFood函數返回任何東西。