内置模块计算最小公倍数

Mav*_*ckD 6 python

我目前使用的函数接受两个数字,并使用循环查找这些数字的最小公倍数,

def lcm(x, y):
   """This function takes two
   integers and returns the L.C.M."""

   # choose the greater number
   if x > y:
       greater = x
   else:
       greater = y

   while(True):
       if((greater % x == 0) and (greater % y == 0)):
           lcm = greater
           break
       greater += 1

   return lcm
Run Code Online (Sandbox Code Playgroud)

python是否有内置模块可以代替编写自定义函数呢?

Ora*_*tan 40

在 Python 3.9+ 中

这可作为math.lcm() 使用。它还接受任意长度的参数,允许您找到 2 个以上整数的最小公倍数。


aba*_*ert 13

stdlib中没有内置这样的东西。

但是,库中有一个Greatest Common Divisor函数math。(对于Python 3.4或2.7,则将其埋藏fractions。)在GCD之上编写LCM非常简单:

def lcm(a, b):
    return abs(a*b) // math.gcd(a, b)
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是NumPy,它lcm现在已经有一段时间了。

  • 从 Py3.9 开始,现在有了 [math.lcm()](https://docs.python.org/3.9/library/math.html#math.lcm) (27认同)
  • [此元问题](https://meta.stackoverflow.com/questions/402931/whats-the-ettiquette-on-updating-an-accepted-answer?cb=1)的主题。 (3认同)

Tim*_*ers 6

尝试以下方法:

def lcm(x, y):
    from fractions import gcd # or can import gcd from `math` in Python 3
    return x * y // gcd(x, y)
Run Code Online (Sandbox Code Playgroud)

  • 在函数内部导入有一个缺点:任何丢失的模块只有在执行此类函数时才会被发现。将所有导入无条件地放在模块顶部可确保加载模块时所有依赖项均可用。(当然,这对于标准库模块来说不是问题。) (8认同)
  • 为什么要把导入放在函数中? (3认同)
  • ^^ 此外,导入时间可能会很昂贵。通常建议在模块导入时而不是函数调用时支付成本。 (3认同)
  • @TimPeters 我知道模块级别 `__all__` 旨在宣传公共名称,并且包含范围中的一些额外名称实际上不会造成任何损害。至于“为什么不”,风格指南确实说*导入总是放在文件的顶部*,但我认为更重要的原因是代码要预先了解它们的依赖关系。这使得浏览大型代码库变得更容易,并且在测试过程中,这意味着从模块名称空间模拟/修补依赖项更简单。 (2认同)