我想创建一个函数,通过使用列表压缩生成一个从1到300的所有数字的列表,这些数字可以被6和10整除。预期输出如下:
ist_result = special_nums()
list_result
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
我想我可能不得不在某种程度上使用范围函数,但我不确定。有什么想法吗?
从这里定义一个函数来计算2个或多个数字的素数:
def gcd(a, b):
"""Return greatest common divisor using Euclid's Algorithm."""
while b:
a, b = b, a % b
return a
def lcm(a, b):
"""Return lowest common multiple."""
return a * b // gcd(a, b)
def lcmm(*args):
"""Return lcm of args."""
return reduce(lcm, args)
接下来,计算数字的lcm,然后迭代地发射数字。好的是,如果你知道lcm,你就不必复习这个范围内的每一个数字。
from math import ceil
def get_multiples(start, end, *args):
lcm = lcmm(*args)
start = max(lcm, lcm * ceil(start / lcm)) # max(..., ...) in case start < lcm
for i in range(start, end + 1, lcm):
yield i
>>> list(get_multiples(1, 300, 6, 10))
[30, 60, 90, 120, 150, 180, 210, 240, 270, 300]
如上所述,这是有效的,因为它不会迭代所提供范围内的每个值,并且可以有效地扩展到>2个值:
>>> list(get_multiples(79, 400, 6, 10, 20))
[120, 180, 240, 300, 360]
以下表达式将起作用(因为30是6和10的最低公分母(:
[n for n in range(1, 301) if n % 30 == 0]