Python では、s のsort
メソッドは関数であるパラメーターをlist
受け入れます。key
私の質問は、の戻り値にどのような制約がありkey
ますか? 数値でいいですか?それはどういうわけか比較する必要がありますか?それとも、すべてのタイプの値が機能しますか?
Python では、s のsort
メソッドは関数であるパラメーターをlist
受け入れます。key
私の質問は、の戻り値にどのような制約がありkey
ますか? 数値でいいですか?それはどういうわけか比較する必要がありますか?それとも、すべてのタイプの値が機能しますか?
py2.x では何でも返すことができますが、py3.x では 2 つの異なるタイプのオブジェクトを比較できないため、異なるタイプの値 (オブジェクト) を返すとエラーが発生します。
ドキュメント: (py2.x):
演算子
<
、>
、==
、>=
、<=
および!=
は、2 つのオブジェクトの値を比較します。オブジェクトは同じタイプである必要はありません。両方とも数値の場合は、共通の型に変換されます。それ以外の場合、異なるタイプのオブジェクトは常に等しくなく、一貫して任意に順序付けられます。将来、異なるタイプのオブジェクトの比較規則が変更される可能性があります。
Py2.x:
>>> x = [1, '2', [3]]
>>> x.sort()
>>> x
[1, [3], '2']
Py3.x:
>>> x = [1, '2', [3]]
>>> x.sort()
Traceback (most recent call last):
x.sort()
TypeError: unorderable types: str() < int()
順序比較演算子 (
<
、<=
、>=
、>
)TypeError
は、オペランドに意味のある自然な順序がない場合に例外を発生させます。したがって、 or のような式1 < ''
は0 > None
もはやlen <= len
有効ではなく、たとえば、を返す代わりに 発生さNone < None
せます。当然のことながら、異種のリストをソートすることはもはや意味がありません。すべての要素が互いに比較可能でなければなりません。これはand演算子には適用されないことに注意してください。異なる比較不可能な型のオブジェクトは、常に互いに比較すると等しくありません。TypeError
False
==
!=
唯一の制約は、戻り値が比較可能であることです。<
、、、、およびテスト>
をサポートする必要が<=
あります。>=
==
Python 2 では、すべてが他のすべてのものと比較可能であり、この制限はかなり意味がありません。
Python 3 では、値を比較可能にするものについてより多くの制限があります。たとえば、異なるタイプのオブジェクト間の比較はサポートされていないため、混合タイプを返したくありません。
これは関数にとって特別なことではないことに注意してくださいkey
。並べ替えられる値にも同じ制限が適用されます。比較のドキュメントを参照してください。関数が行うことkey
は、指定された位置の実際の値の代わりに、ソートする「代用」値を提供できるようにすることだけです。