2015-10-16 159 views
2

在Python 3中,我爲可用作迭代器的特定數據結構定製了一個類C.Python分覆蓋

但該類確保對於任何數據結構cC,c[0]將是c中所有值的最小值。

有沒有一種方式,min(c)簡單地返回c[0]沒有無用地探索所有的結構? (或照常一個ValueError如果c爲空)

+1

我不這麼認爲。如果Python真的是面向對象的,那不是很好嗎? :P – Amadan

+1

'min()'基本上用於多個對象(或列表/可迭代的)。簡單地定義一個實例方法'min()'並返回'c [0]'不是更好嗎?並且調用'c.min()'而不是'min(c)'。 –

+0

@AnandSKumar可能但少得多pythonic! – Xoff

回答

1

有一種方法,一個呼叫爲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功能指定一個默認指數返回相關項目。