有沒有__min__
和__max__
特殊方法*。這是一種遺憾,因爲range
已經看到一些pretty nice optimizations in Python 3。你可以這樣做:
>>> 1000000000000 in range(1000000000000)
False
但除非你要等待很長一段時間不試試這個:
>>> max(range(1000000000000))
但是創建自己的min
/max
功能是一個不錯的主意,因爲建議通過Lærne。
這是我該怎麼做的。 UPDATE:贊成_min
刪除dunder名__min__
的建議,PEP 8:
決不創造這樣的名字;只有把它們作爲記錄
代碼:
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__'的情況下工作嗎?我不確定我瞭解你的困惑。 –