2011-12-05 27 views
8

Tài liệu về các hàm dựng sẵn maxmin bằng Python cho biết tham số key sẽ hoạt động giống như chức năng sort. Nói cách khác, tôi sẽ có thể làm điều này:Phím mặc định cho các chức năng tối đa/tối thiểu của Python

a = [1, 2, 3, 4] 
max(a, key=None) 

Tuy nhiên, điều này đặt ra một lỗi: TypeError: 'NoneType' object is not callable

Nhưng, nếu tôi làm điều gì đó tương tự với sort chức năng, tôi nhận được kết quả mong đợi:

a = [1, 2, 3, 4] 
a.sort(key=None) 

Không có lỗi nào được tạo và loại mặc định được sử dụng. Một số sách cũng ngụ ý rằng tôi sẽ có thể thoát khỏi cùng một hành vi trong các hàm maxmin. Xem đoạn trích này từ Python in a Nutshell.

Đây có phải là hành vi mặc định của các hàm maxmin không? Nó phải được? Không nên chúng phù hợp với chức năng sắp xếp?

Trả lời

23

Bạn đã tình cờ gặp sự khác biệt trong việc triển khai .sortmax nhiều hơn một vấn đề với ngôn ngữ.

list.sort() lấy đối số từ khóa "khóa" xảy ra mặc định thành Không có. Điều này có nghĩa là phương thức sắp xếp không thể cho biết sự khác biệt giữa bạn cung cấp đối số key=None hoặc nó chỉ lấy giá trị mặc định. Trong cả hai trường hợp, nó hoạt động như thể không có hàm khóa nào được cung cấp.

max mặt khác đang kiểm tra sự có mặt của đối số từ khóa "khóa". Nó không có giá trị mặc định và giá trị của nó được sử dụng làm hàm chính nếu có.

Dù bằng cách nào, khóa không bao giờ được cung cấp dưới dạng Không có. Nó được coi là một hàm được sử dụng để trích xuất một giá trị "khóa" từ các mục trong danh sách/có thể lặp lại. Ví dụ:

a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)] 
a.sort(key=lambda item:item[1]) 
+0

Cảm ơn đã phản ứng. Tôi biết rằng việc triển khai thực tế các tính năng này là khác nhau, nhưng tôi đã thất vọng rằng tất cả tài liệu tôi có thể tìm thấy không làm cho sự khác biệt này rõ ràng. –

+0

Không sao cả. Nếu điều này trả lời câu hỏi của bạn, chấp nhận câu hỏi luôn được đánh giá cao. –

+1

"chìa khóa" là một cái tên thực sự khủng khiếp ... – OlivierBlanvillain

7

@ Câu trả lời của David là hoàn hảo. Chỉ cần nói thêm, trong trường hợp bạn đang tự hỏi, giá trị mặc định key (cả trong sort và trong max/min chức năng) là một cái gì đó như:

lambda x: x 
+1

Nhưng, sắp xếp xử lý đi qua None là giá trị mặc định, trong khi min/max thì không. Vì vậy, một cái gì đó đang được thực hiện khác nhau. Nếu bạn nhìn vào mã, hàm min và max chỉ cần kiểm tra xem liệu nó đã được định nghĩa trong từ điển đối số hay chưa. Tôi không tin rằng có một giá trị mặc định cho đối số khóa tối đa/phút, chỉ là hành vi mặc định. –

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