2010-04-24 49 views
18

Tôi đang xem một số mã có nhiều cuộc gọi sắp xếp bằng cách sử dụng các hàm so sánh và có vẻ như nó nên sử dụng các hàm chính.lambda so với operator.attrgetter ('xxx') như chức năng khóa sắp xếp trong Python

Nếu bạn đã thay đổi seq.sort(lambda x,y: cmp(x.xxx, y.xxx)), đó là một lợi thế:

seq.sort(key=operator.attrgetter('xxx')) 

hay:

seq.sort(key=lambda a:a.xxx) 

Tôi cũng sẽ quan tâm đến ý kiến ​​về những giá trị của việc thay đổi mã hiện có mà làm việc.

Trả lời

17

"Thực hiện thay đổi đối với mã hiện có hoạt động" là cách chương trình phát triển ;-). Viết một bài kiểm tra pin tốt cho kết quả đã biết với mã hiện có, lưu các kết quả đó (thường được gọi là "tệp vàng" trong ngữ cảnh thử nghiệm); sau đó thực hiện các thay đổi, chạy lại các kiểm tra và xác minh (lý tưởng theo cách tự động) rằng những thay đổi duy nhất đối với kết quả của các thử nghiệm là những kết quả cụ thể là có ý định ở đó - không có tác dụng phụ không mong muốn hoặc không mong muốn. Người ta có thể sử dụng các chiến lược đảm bảo chất lượng tinh vi hơn, tất nhiên, nhưng đây là ý chính của nhiều phương pháp "thử nghiệm tích hợp". Đối với hai cách để viết hàm key= đơn giản, mục đích thiết kế là làm cho operator.attrgetter nhanh hơn bằng cách chuyên biệt hơn, nhưng ít nhất trong các phiên bản hiện tại của Python không có sự khác biệt về tốc độ. Đó là trường hợp, trong tình huống đặc biệt này, tôi sẽ giới thiệu lambda, đơn giản chỉ vì nó ngắn gọn hơn và chung chung (và tôi không phải là người yêu thích lambda, bạn!).

+7

tôi đồng ý với câu trả lời của Alex (đó là anh ấy không có người yêu lambda) :-) nhưng cũng thứ hai khái niệm của lambda. trong ví dụ trên, nó có thể nhanh hơn một chút vì bạn không phải tra cứu 'toán tử' hoặc' toán tử.attrgetter() '... bạn có đối tượng hàm thực tế rồi! Tuy nhiên, nó hầu như không đáng chú ý như Alex đã nói, nhưng giải pháp 'lambda' không giành được điểm Zen Zen bằng cách dễ đọc hơn. – wescpy

+0

Cảm ơn, Alex và Wesley! – PaulMcG

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