如何减少语句中的条件数量?

Mil*_*lky 5 python loops while-loop

在本练习中,我需要想出一种方法来找到前 20 个自然数 (1-20) 的最小公倍数 (LCM)。到目前为止,这是我得到的:

if exercise == 34:
    lcm = 20
    while lcm % 2 != 0 or \
            lcm % 3 != 0 or \
            lcm % 4 != 0 or \
            lcm % 5 != 0 or \
            lcm % 6 != 0 or \
            lcm % 7 != 0 or \
            lcm % 8 != 0 or \
            lcm % 9 != 0 or \
            lcm % 10 != 0 or \
            lcm % 11 != 0 or \
            lcm % 12 != 0 or \
            lcm % 13 != 0 or \
            lcm % 14 != 0 or \
            lcm % 15 != 0 or \
            lcm % 16 != 0 or \
            lcm % 17 != 0 or \
            lcm % 18 != 0 or \
            lcm % 19 != 0 or \
            lcm % 20 != 0:
        lcm += 1
    print(lcm)
Run Code Online (Sandbox Code Playgroud)

是否有更有效的编码方法,而无需为循环中要考虑的每个潜在数字编写条件?

sus*_*nth 9

下面是一个较短的版本,取代长orany

if excercise == 34:
    lcm = 20
    while any(lcm % i != 0 for i in range(2, 21)):
        lcm += 1
    print(lcm)
Run Code Online (Sandbox Code Playgroud)

  • 好处是这保留了原始表达式的短路。 (3认同)

sup*_*ain 6

我想说最好的方法这样的:

>>> math.lcm(*range(1, 21))
232792560
Run Code Online (Sandbox Code Playgroud)

由于结果相当大,+= 1无论其他人做得多么好,您的循环都会花费很长时间。

Python 3.9 之前的最佳方式可能是这样的:

>>> def lcm(a, b):
        return a * b // math.gcd(a, b)

>>> functools.reduce(lcm, range(1, 21))
232792560
Run Code Online (Sandbox Code Playgroud)

两种方式都只需要几微秒。

或者...稍加努力,您可以将该范围内所有素数的最大幂相乘:

>>> 16*9*5*7*11*13*17*19
232792560
Run Code Online (Sandbox Code Playgroud)