在Python 3中,我爲可用作迭代器的特定數據結構定製了一個類C.Python分覆蓋
但該類確保對於任何數據結構c
的C
,c[0]
將是c
中所有值的最小值。
有沒有一種方式,min(c)
簡單地返回c[0]
沒有無用地探索所有的結構? (或照常一個ValueError
如果c
爲空)
在Python 3中,我爲可用作迭代器的特定數據結構定製了一個類C.Python分覆蓋
但該類確保對於任何數據結構c
的C
,c[0]
將是c
中所有值的最小值。
有沒有一種方式,min(c)
簡單地返回c[0]
沒有無用地探索所有的結構? (或照常一個ValueError
如果c
爲空)
有一種方法,一個呼叫爲min(C)簡單地返回C [0]?
是的,有2方式:
第一種是改性蟒的源代碼,並改變它的內置函數的結構,這並不明智,合理的。
第二種方法是在相對名稱空間中創建您自己的min函數。
實際上,基於python名稱解析方案調用LEGB manner,當您在作用域內使用非限定名稱時,Python會搜索最多四個作用域,本地(L)作用域,然後是任何封閉(E)的本地作用域)範圍(如果存在的話),然後是全局(G)範圍,然後是內置(B)範圍。因此,由於此規則,內置範圍將在最後進行搜索,您可以簡單地創建一個新範圍這個範圍的頂層。
但是請注意,在這種情況下,您不能使用前面的min
函數,如果碰巧使用它,您可以使用del
語句刪除服裝函數。
不過要完成這個任務另一個Python的方式是創建類中的min
功能,並使用它作爲一個屬性:
>>> class C(object):
... def __init__(self):
... self.index = 0
... self.iterable = range(10)
... def __iter__(self):
... return self
... def min(self):
... try:
... return self.iterable[self.index]
... except IndxError:
... raise Exception('The index is out of range')
>>> c=C()
>>>
>>> c.min()
0
>>> c.iterable=[5,1,4,8]
>>> c.min()
5
注意,在這種情況下,你可以爲min
功能指定一個默認指數返回相關項目。
我不這麼認爲。如果Python真的是面向對象的,那不是很好嗎? :P – Amadan
'min()'基本上用於多個對象(或列表/可迭代的)。簡單地定義一個實例方法'min()'並返回'c [0]'不是更好嗎?並且調用'c.min()'而不是'min(c)'。 –
@AnandSKumar可能但少得多pythonic! – Xoff