0

我正在尝试在 python 中编写一个素数模块。我希望能够写的一件事是

>>> primes.primesLessThan(12)
[2, 3, 5, 7, 11]

但是,我也希望能够写

>>> primes.primesLessThan.Sundaram(12)
[2, 3, 5, 7, 11]

迫使它使用 Sundaram 的筛子。我最初的想法是让 primesLessThan 成为一个具有几个静态方法的类,但是由于 __init__ 不能返回任何内容,这并没有让我实现第一个示例。作为一个单独的模块,它会更好地完成导入,还是我错过了其他东西?

4

2 回答 2

1

根据经验,如果你有一个没有任何实例变量的类、一个空的 init 方法和一堆静态方法,那么将它组织为一个模块可能会更简单。

#sieves module
def Sundaram(n):
  return [2,3,5,7]

def Eratosthenes(n):
  return [2,3,5,7]

然后您可以使用模块中的功能

import primes.sieves
primes.sieves.Sundaram(12)

最后,python 函数是第一类,可以在函数参数中传递或存储在数据结构中。这意味着如果您需要编写一些取决于算法选择的代码,您可以将其作为参数传递。

def test_first_primes(algorithm):
   return algorithm(10) == [2,3,5,7]

print (test_first_primes(Sundaram))
print (test_first_primes(Eratosthenes))
于 2014-01-14T21:12:52.083 回答
0

我能想到两种方法来获得这些语义。

  • 将 primes 设为一个类,然后将 primesLessThan 设为一个属性。它也将是一个类,它实现__iter__等以模拟列表,同时还具有一些子功能。primesLessThan 将是该类的构造函数,参数具有允许通过的默认值。

  • 使素数本身支持__getitem__/ __iter__/etc。你仍然可以使用属性(默认),但是让 primesLessThan 只是在类中设置一些内部变量,然后返回 self. 这使您可以按任何顺序执行它们,即 primes.Sundaram.primesLessThan(12) 的工作方式与 primes.primesLessThan.Sundaram(12) 相同,但这对我来说看起来很奇怪。

这些中的任何一个在返回值上都会有点奇怪......你可以创建一些像列表一样的东西,但它显然不会。您可以让 repr 像列表一样显示它,并且您可以像列表一样迭代(即for prime in primes.Sundaram(12)),但由于明显的原因它不能返回实际列表......

于 2014-01-15T01:42:43.420 回答