Python中的min重写

4
在Python 3中,我创建了一个自定义类C,用于特定的数据结构,并且可以用作可迭代对象。但是该类确保对于任何数据结构c of C,c[0]将是c中所有值的最小值。是否有一种方法可以调用min(c),仅返回c[0],而不会无用地探索整个结构?(如果c为空,则像通常一样引发ValueError)

1
我不这么认为。如果Python真的是面向对象的话岂不美哉? :P - Amadan
1
min() 基本上用于多个对象(或列表/可迭代对象)。是否更好地定义一个实例方法 min() 并从中返回 c[0]。然后调用 c.min() 而不是 min(c) - Anand S Kumar
@AnandSKumar 可能可以实现,但不够 Pythonic! - Xoff
1
你为什么认为这不够符合 Python 的风格? - Anand S Kumar
使用 next 替代 min - Peter Wood
显示剩余3条评论
1个回答

2
有没有办法让min(c)调用仅返回c[0]?
是的,有两种方法:
第一种方法是修改Python源代码并改变内建函数结构,这完全不明智和合理。
第二种方法是在相关命名空间中创建自己的min函数。
实际上,基于Python命名解析方案(称为LEGB方式),当您在作用域内使用未限定名称时,Python会搜索最多四个作用域,即本地(L)作用域,然后是任何封闭(E)作用域的本地作用域(如果存在),接下来是全局(G)作用域,最后是内置(B)作用域。因此根据这个规则,内置作用域将在最后被搜索,并且您可以简单地在该范围的顶层创建一个新作用域。
但请注意,在这种情况下,您不能使用之前的min函数。如果确实使用了它,则可以使用del语句删除自定义函数。
但另一种Pythonic的方法是在您的类中创建一个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函数指定一个默认索引来返回相对项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接