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']

map 関数がフードの背後でどのように機能しているかを理解できません。なぜすべてのリストを返すのですか?要素がそこに追加されているNoneことを確認すると?f.goodFood

4

5 に答える 5

9

mapiterable に関数を適用し、関数が各アイテムに適用された新しいリストを返します。

あなたの場合、関数が何も返さない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']
于 2013-08-22T18:33:06.453 に答える
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()

于 2013-08-22T18:31:56.473 に答える
4

result = map(function, iterable)次と同等です。

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

したがって、内部的に、リスト内のすべての項目に関数を適用した結果を追加するリストを作成します。

関数addGoodFoodは何も返さないため、関数は s のmapリストを返しますNone

goodFoods関数には、その項目をリストに追加するという副作用があり、goodFoodsリストにデータが入力され、すべての要素が含まれます。しかし、私が言ったように、関数は何も返さないため、マップは元のリストと同じサイズのリストを返しました (すべての要素に適用されるため) Nones でいっぱいです。

于 2013-08-22T18:31:55.863 に答える
4

問題のコードは、None要素を含むリストを返しています。これは、明示的addGoodFood()に何も返さないためです(暗黙的に、 を返します)。呼び出した関数の結果を収集し、それらの結果で新しいリストを作成します。Nonemap()

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

于 2013-08-22T18:32:03.413 に答える
3

関数から何も返さなかったからaddGoodFoodです。

于 2013-08-22T18:33:13.740 に答える