いいえ__min__
と__max__
特別な方法*です。 range
はいくつか見たことがあるのでこれは残念です。pretty nice optimizations in Python 3
>>> 1000000000000 in range(1000000000000)
False
しかし、あなたが長い時間を待つようにしたい場合を除き、これを試さないでください:提案されているようしかし、あなた自身のmin
/max
関数を作成
>>> max(range(1000000000000))
は、かなり良いアイデアであるあなたはこれを行うことができますLærne。
ここで私はそれをやります。 UPDATE:PEP 8によって推奨されているように、_min
の賛成でdunder名__min__
を削除:
は、このような名前を発明することはありません。
を文書としてのみそれらを使用するコード:
from functools import wraps
oldmin = min
@wraps(oldmin)
def min(*args, **kwargs)
try:
v = oldmin(*args, **kwargs)
except Exception as err:
err = err
try:
arg, = args
v = arg._min()
except (AttributeError, ValueError):
raise err
try:
return v
except NameError:
raise ValueError('Something weird happened.')
私はそれが他の答えが考えられていなかったいくつかのコーナーケースを処理するため、この方法は多分少し優れていると思います。
_min
メソッドを持つ反復可能オブジェクトは、通常はoldmin
で消費されますが、戻り値は特殊メソッドによってオーバーライドされることに注意してください。
ただし、_min
メソッドでは、イテレータがまだ使用可能である必要がある場合は、イテレータが最初にoldmin
で消費されているため、調整する必要があります。 __min
方法は、単にoldmin
を呼び出すことで実装されている場合、物事はまだ正常に動作することも
注意(イテレータが消費されたにもかかわらず、oldmin
は、このケースでValueError
を上げるためです)。
*このような方法はしばしば「魔法」と呼ばれますが、これは推奨される用語ではありません。
この他の投稿はあなたに役立つかもしれませんが、min/maxで動作するかどうかは完全にはわかりませんが、しかし、試してみる価値があります:https://stackoverflow.com/questions/7875911/how-to-implement-a-minimal-class-that-behaves-like-a-sequence-in-python –
@depperm inこの場合、私は 'a'が' self'として渡されると信じています。 'self'を使うのは単なる慣習です。 – cssko
'__iter__' /' __next__'を定義せずに動作させることを意味しますか?私はあなたの混乱を理解しているか分からない。 –