2013-08-22 30 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 

Sau khi tuyên bố lớp này, tôi đã viết mã này:Bản đồ phương pháp trong python

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

Tôi không thể hiểu làm thế nào các chức năng bản đồ đang làm việc phía sau mui xe, tại sao là nó trả về một danh sách tất cả None, nhưng khi tôi kiểm tra f.goodFood các yếu tố đã được thêm vào đó?

+1

Lưu ý rằng việc sử dụng 'bản đồ' như thế này là một ý tưởng tồi. Sử dụng vòng lặp 'for'; nó sẽ không tạo danh sách và nó sẽ hoạt động trong Python 3 mà không cần bạn quấn nó trong một cuộc gọi 'list'. – user2357112

+0

(Bạn có mong đợi lệnh gọi 'map' trả về' f.goodFood' không? Nó không biết 'f.goodFood' có liên quan.) – user2357112

+0

Để biết cách sử dụng này, bạn nên làm tốt hơn ' f.goodFood.extend (["spam", "trứng", vv]) ' – Daenyth

Trả lời

9

map áp dụng một hàm trên lặp lại và trả về danh sách mới trong đó hàm được áp dụng cho từng mục.

Trong trường hợp của bạn, nó hiển thị None vì hàm f.addGoodFood không trả về gì cả.

Đối với mục đích thử nghiệm thay đổi addGoodFood theo cách này:

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

và xem:

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

result = map(function, iterable) tương đương với:

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

Vì vậy, trong nội bộ nó xây dựng một danh sách trong đó nó gắn kết quả của việc áp dụng các chức năng trên tất cả các mục trong danh sách.

Vì hàm của bạn addGoodFood không trả về gì, hàm map trả về danh sách None s.

Chức năng của bạn có tác dụng phụ để thêm các mục vào danh sách goodFoods, danh sách goodFoods được điền và có tất cả các phần tử. Nhưng vì, như tôi đã nói, hàm trả về không có gì bản đồ trả về một danh sách có cùng kích thước với danh sách gốc (vì nó được áp dụng trên mọi phần tử) đầy đủ của None s.

5

Đó là vì addGoodFood không trả lại bất kỳ thứ gì. Làm cho nó trở lại một cái gì đó:

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

map đang tạo ra một danh sách các kết quả gọi addGoodFood trên mỗi mục trong danh sách. Và, vì phương thức append của danh sách luôn trả về None, bạn sẽ nhận được danh sách None.

Ngoài ra, bạn có thể muốn thay đổi chức năng init của bạn như thế này:

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

__init__ là một phương pháp đặc biệt để xử lý việc khởi tạo của một lớp. Sử dụng nó có nghĩa là bạn không phải làm f.init().

4

Mã trong câu hỏi được trả lại một danh sách với None yếu tố vì addGoodFood() không rõ ràng trở lại bất cứ điều gì (ngầm, nó sẽ trở None). map() thu thập các kết quả của chức năng mà bạn gọi và tạo danh sách mới với các kết quả đó.

Bạn không nên sử dụng map() với hàm không trả về giá trị. Trong trường hợp này, addGoodFood()không phải một ứng cử viên tốt để sử dụng nó. Đây là cách bạn nên viết:

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

Để trả lời câu hỏi: map() hoạt động như thế nào?đây là cách:

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

Trong hàm trên nó rõ ràng lý do tại sao bạn đang nhận được một danh sách các None yếu tố kết quả là: nếu chức năng thông qua trả None, sau đó vòng lặp sẽ thực hiện result.append(None), và danh sách trả về sẽ chỉ chứa None ở mỗi vị trí.

+2

Tôi hiểu bạn đang nói gì, tôi đang học python từ một cuốn sách, tôi đã triển khai mã này từ đó, đó là lý do tại sao tôi cũng nhầm lẫn! – AbKDs

3

Bởi vì bạn không trở về bất cứ điều gì từ addGoodFood chức năng.

Các vấn đề liên quan