Hướng dẫn why was cmp removed from python? - tại sao cmp bị xóa khỏi python?

Thí dụ

Trong Python 3, hàm tích hợp cmp đã được loại bỏ, cùng với phương pháp đặc biệt

>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
0.

Từ tài liệu:

Hàm

>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
1 nên được coi là biến mất và phương pháp đặc biệt
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
2 không còn được hỗ trợ. Sử dụng
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
3 để sắp xếp,
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
4 với
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
5 và các so sánh phong phú khác khi cần thiết. (Nếu bạn thực sự cần chức năng
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
1, bạn có thể sử dụng biểu thức
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
7 tương đương với
>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1
8.)

Ngoài ra, tất cả các hàm tích hợp chấp nhận tham số cmp bây giờ chỉ chấp nhận tham số từ khóa

>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
0.

Trong mô-đun

>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
1, cũng có chức năng hữu ích
>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
2 cho phép bạn chuyển đổi từ chức năng kiểu ____ 9 thành chức năng kiểu ____ 20::

Chuyển đổi một hàm so sánh kiểu cũ thành một hàm chính. Được sử dụng với các công cụ chấp nhận các chức năng chính (chẳng hạn như

>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
5,
>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
6,
>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
7,
>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
8,
>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))
9,
>>> sorted(lists, key=lambda a:len(a))
0). Chức năng này chủ yếu được sử dụng như một công cụ chuyển tiếp cho các chương trình được chuyển đổi từ Python 2, hỗ trợ việc sử dụng các hàm so sánh.




Hướng dẫn why was cmp removed from python? - tại sao cmp bị xóa khỏi python?

Trong quá trình xem lại mã video, Veky cho thấy đối số

>>> sorted(lists, key=lambda a:len(a))
1 đã bị xóa trong Python3, và tại sao và làm thế nào nó có thể được thay thế.

Chúng tôi đã đề cập đến việc sử dụng chức năng sắp xếp bên trong giải pháp cho nhiệm vụ "Lớn hơn cùng nhau" từ Kurosawa4434.

Giao diện của hàm

>>> sorted(lists, key=lambda a:len(a))
2 đã được đơn giản hóa trong python3 so với python2.

Trong Python2, bạn có thể sắp xếp không chỉ bằng cách chỉ định khóa mà còn bằng cách chỉ định hàm cho đối số CMP cho hàm được sắp xếp. Chức năng lấy hai mục từ Iterables làm đối số và sẽ trả về một số. Nếu số dương thì giá trị đã cho đầu tiên phải là trước số thứ hai, nếu âm - thì ngược lại.

>>> sorted(some_iterable, cmp=lambda first, second: -1 if first < second else 1)

Bạn cũng có thể sử dụng 0, nếu hai mục giống nhau và thứ tự không quan trọng.

Sau đó, Guido đã đề cập rằng mọi người thường sử dụng chức năng so sánh như thế này

>>> def compare(a, b):
        return (a>b) - (a>> compare(3, 6)
<<< -1

>>> compate(6, 2)
<<< 1

Và nếu bạn muốn sắp xếp danh sách theo độ dài của chúng, bạn có thể sử dụng

>> sorted(lists, cmp=lambda a,b: compare(len(a), len(b))

Điều gì sẽ xảy ra nếu chúng ta có thể thoát khỏi sự so sánh này và chỉ cần chỉ định

>>> sorted(lists, key=lambda a:len(a))

Nó dễ dàng hơn để viết và nó sẽ nhanh hơn vì bạn chỉ cần tính toán một phần tử một lần, khi trong trường hợp CMP, bạn cần tính toán giá trị với các phần tử khác.

Vì vậy, giải pháp của một trong các nhiệm vụ kiểm tra 'nơi bạn cần sắp xếp danh sách theo các giá trị tuyệt đối có thể trông như thế này

>>> sorted(values, key=abs)

Đơn giản, phải không?

Nhưng tại sao họ không để lại hai giao diện, vì vậy tôi có thể tự mình chọn cái nào tôi muốn sử dụng? Bởi vì họ muốn đơn giản hóa ngôn ngữ và cho bạn ít lý do hơn để tự bắn vào một chân.

Đó là lý do tại sao Python3 đơn giản hơn nhiều theo cách này, nhưng khó hơn một chút theo cách mà bạn nên thực sự hiểu những gì bạn đang làm.

Câu chuyện tương tự chúng ta có với chức năng giảm trong Python, bởi vì Python3 không giảm như một hàm tích hợp, mà là một phần của mô -đun cốt lõi

>>> from functools import reduce

Nhưng trong trường hợp bạn thực sự cần CMP cho chức năng được sắp xếp, Guido để lại một bộ chuyển đổi cho bạn.

>>> from functools import cmp_to_key

Vì vậy, bạn có thể sử dụng nó như Kurosawa4434 đã làm trong các giải pháp của anh ấy

>>> sorted(map(str, ints), key=cmp_to_key(lambda a, b: int(a+b)-int(b+a)))

Việc triển khai hàm CMP_TO_KEY chỉ cho thấy Python mạnh mẽ và linh hoạt như thế nào.

Tôi rời khỏi nguồn ở đây

 def cmp_to_key(mycmp):
    """Convert a cmp= function into a key= function"""
    class K(object):
        __slots__ = ['obj']
        def __init__(self, obj):
            self.obj = obj
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) < 0
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) > 0
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
        def __le__(self, other):
            return mycmp(self.obj, other.obj) <= 0
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) >= 0
        __hash__ = None
    return K

Như bạn có thể thấy, CMP_TO_KEY tạo ra lớp K bằng cách sử dụng Chức năng so sánh MYCMP. Kết quả của phiên bản chức năng chính của lớp K, sẽ sử dụng các phương thức của riêng mình __lt__, __gt__, __eq__, __le__ và __ge__ để so sánh các đối tượng K với nhau. Và hàm MYCMP sẽ được sử dụng để so sánh này.

Thời cơ đã tới. Trong bài viết tiếp theo, chúng tôi sẽ giải thích ý nghĩa của __Slots__ này trong lớp K.

Tại sao CMP không ở Python 3?

Trong Python 3, kiểu so sánh CMP đã bị loại bỏ.Tất cả các đối tượng đã triển khai __CMP__ phải được cập nhật để thực hiện tất cả các phương thức phong phú thay thế..All objects that implemented __cmp__ must be updated to implement all of the rich methods instead. (There is one exception: on Python 3, __ne__ will, by default, delegate to __eq__ and return the inverted result . However, this is not the case in Python 2.)

Python có phương pháp so sánh không?

Phương thức Python - CMP () CMP () là một phần của thư viện tiêu chuẩn Python so sánh hai số nguyên.Kết quả so sánh là -1 nếu số nguyên đầu tiên nhỏ hơn thứ hai và 1 nếu số nguyên thứ nhất lớn hơn so với thứ hai.Nếu cả hai đều bằng kết quả của CMP () bằng không.The cmp() is part of the python standard library which compares two integers. The result of comparison is -1 if the first integer is smaller than second and 1 if the first integer is greater than the second. If both are equal the result of cmp() is zero.

Chức năng của CMP là gì?

Một CMP được sử dụng để kiểm tra một số chức năng và quy trình cơ thể, bao gồm: Sức khỏe gan và thận.Lượng đường trong máu.Mức protein máu.to check several body functions and processes, including: Liver and kidney health. Blood sugar levels. Blood protein levels.