Python:多个条件 - 在if / while的模式中

时间:2013-12-20 22:07:03

标签: python design-patterns while-loop conditional-statements

下面是一个循环,用于查找数字1-20的最小公倍数:

count=0

while not all(count % 1 == 0,  count % 2 == 0,
              count % 3 == 0,  count % 4 == 0,
                ...            count % 20 ==0):
     count+=1

print count

输入这么多条件是相当繁琐的。这需要改进,特别是如果数字大于20.但是,对于python的新手,我的下意识反应是:

while not all(count % range(1,21)==0):

...这是行不通的,因为python无法读懂思想。我已经考虑过将一个列表放在all()中,但是我不知道如何生成一个包含变量的列表。

是否有输入像这样的条件模式的简写,还是有一种更聪明的方法可以做到这一点,我错过了?

3 个答案:

答案 0 :(得分:3)

生成器表达式:

while not all(count % i == 0 for i in range(1,21)):

顺便提一下,如果将数字1..20分解为素数因子,这很容易手工解决。它大约有2亿,所以循环可能需要一段时间。

答案 1 :(得分:2)

使用generator expression

while not all(count % x == 0 for x in range(1,21)):

你也可以在这里使用any

while any(count % x for x in range(1,21)):

因为0在Python中评估为False

答案 2 :(得分:1)

your current problem的更好解决方案是使用最不常见的多重函数的有用属性(假设您正确实现了它):

lcm(a, b, c) == lcm(lcm(a, b), c)

它运行得非常快,即使对于相当大的输入(前20,000个数字的最小公倍数有8,676位):

>>> %timeit reduce(lcm, range(1, 20001))
1 loops, best of 3: 240 ms per loop