23

ドキュメントとこのチュートリアルによると、

cmp() returns -1 if x < y

cmp() returns 0 if x == y

cmp() returns 1 if x > y

チュートリアルはまた言った

cmp()は、2つの数値の差の符号を返します

2つの数字の違いの兆候が何を意味するのか、私にはよくわかりません 。数字の符号が等しくないときに値を返すという意味ではありませんか?以来...

cmp(80, 100) :  -1      # both have positive sign.
cmp(180, 100) :  1      # both also have positive sign.
cmp(-80, 100) :  -1
cmp(80, -100) :  1

**注:チュートリアルのコード。*

符号の違いで混乱しているにもかかわらず、x<yのときに-1の値を返す組み込み関数が必要な理由を本当に考えることはできません。

機能はcmp( )簡単に実装できませんか?Pythonの作成者が関数を保持する理由はありますかcmp( )、それともこのPythonのcmp( )関数の隠された使用法はありますか?

4

5 に答える 5

29

cmp()が役立つのはなぜですか?

これはあまり有用ではないため、非推奨になりました(cmp組み込みのソートはなくなり、組み込みのソートはPython 3では受け入れられなくなりました)。豊富な比較方法がそれに取って代わりました:

object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)

これにより、<シンボル(および他のシンボル)をオーバーロードされた比較演算子にすることができ、たとえば、セットオブジェクトのサブセットおよびスーパーセットの比較が可能になります。

>>> set('abc') < set('cba')
False
>>> set('abc') <= set('cba')
True
>>> set('abc') == set('cba')
True
>>> set('abc') >= set('cba')
True
>>> set('abc') > set('cba')
False

上記を有効にすることはできcmpますが、次のことはできません。

>>> set('abc') == set('bcd')
False
>>> set('abc') >= set('bcd')
False
>>> set('abc') <= set('bcd')
False

おもちゃの使い方cmp

結果をインデックスとして使用する興味深い使用法を次に示します(最初の値が2番目の値よりも小さい場合は-1、等しい場合は0、より大きい場合は1を返します)。

def cmp_to_symbol(val, other_val):
    '''returns the symbol representing the relationship between two values'''
    return '=><'[cmp(val, other_val)]

>>> cmp_to_symbol(0, 1)
'<'
>>> cmp_to_symbol(1, 1)
'='
>>> cmp_to_symbol(1, 0)
'>'

ドキュメントによると、cmpは存在しないかのように扱う必要があります。

https://docs.python.org/3/whatsnew/3.0.html#ordering-comparisons

cmp削除された同等の操作

ただし、これを同等のものとして使用できます。

(a > b) - (a < b)

私たちの小さなおもちゃの機能では、それはこれです:

def cmp_to_symbol(val, other_val):
    '''returns the symbol representing the relationship between two values'''
    return '=><'[(val > other_val) - (val < other_val)]
于 2014-10-22T19:09:43.840 に答える
11

2つの数字の違いの兆候が何を意味するのか、私にはよくわかりません。

つまり、違いを取り、次にその違いの兆候を取ります。たとえば、xyが2つの数値の場合:

  • x < y=>x - y < 0そして関数は-1を返します。
  • x == y=>x - y == 0そして関数は0を返します。
  • x > y=>x - y > 0そして関数は1を返します。

宇宙船比較の詳細については、ウィキペディアを参照してください。

于 2013-03-21T19:56:15.763 に答える
3

三値コンパレータは、ソート時に非常に役立ちます。2つの要素が等しいかどうかを知りたいだけではありません。また、それらの相対的な順序を知りたいので、並べ替えられたリストに近づくようにそれらを再配置する方法を知ることができます。これが、C(strcmp)とPerl(cmp)の両方が同様の操作を行う理由です(これらの場合、文字列の場合ですが、同じ考え方です)。

于 2013-03-21T19:57:16.337 に答える
2

アイテムのシーケンスを並べ替えます。アイテムのリストを並べ替えるときは、あるアイテムが別のアイテムよりも大きいか小さいかを知る必要があるだけです。

詳細はこちら:http ://wiki.python.org/moin/HowTo/Sorting/#The_Old_Way_Using_the_cmp_Parameter

于 2013-03-21T19:55:55.590 に答える
1

別の使用例:数値の符号(-/ +)を見つける

数値の符号(+/-)を知りたい場合は、関数0の2番目の引数として簡単に使用できます。cmp

cmp(-123, 0) #returns -1
cmp( 123, 0) #returns  1
于 2017-11-16T18:52:00.107 に答える