我正在尝试将以下代码编写为单行代码。
for x in range(a, b+1):
prime = True
for y in range(2, int(x**0.5)):
if x%y == 0:
prime = False
break
if prime:
return x
这是在a和b之间搜索素数。我将每个素数保存到一个列表中。上面的代码是检查素数范围内的每个数字。问题是我必须将这个嵌套循环编写为单行列表解析。我遇到的问题是列表理解不会经历第二个循环。它会用2来检查,然后弹出循环。
我尝试了这种方法,它失败了:
([x for x in range(10, 21) for y in range(2, int(x**0.5)) if x%y != 0])
答案 0 :(得分:2)
我会构建一个模块化结果的内部列表,并检查是否有任何零:
[x for x in range(10, 21) if 0 not in (x%y for y in range(2, int(x**0.5)))]
答案 1 :(得分:1)
如果我理解你的意图正确,你试图在一行中找到a
和b
之间的最小素数。你有一些当前的代码,但你所展示的内容没有任何意义。我认为你试图展示的逻辑可以像这样工作:
def find_prime_between(a, b):
for x in range(a, b+1):
for y in range(2, int(x**0.5)):
if x%y == 0:
break
else:
return x
将此转换为单行的一种方法是使用all
内置函数。它可以替换内循环,包括来自break
和else
块的短循环行为。对于外循环,我建议在生成器上使用next
,它获取生成器产生的第一个值:
result = next(x for x in range(a, b+1) if all(x % y != 0 for y in range(2, int(x**0.5))))
默认next
如果生成器没有产生任何内容,则会引发StopIteration
(因为a
和b
之间没有素数)。如果您希望在该情况下返回其他值(例如None
),则可以将其作为第二个参数传递给next
。这将要求生成器表达式包含在括号中,因为它不是唯一的参数:
result = next((x for x in range(a, b+1) if all(x%y!=0 for y in range(2, int(x**0.5)))), None)
在没有滚动条的情况下,在这个答案中需要一点点压缩才能适应单行。
答案 2 :(得分:0)
Prime_numbers_list = [x for x in range(a, b+1)
if all(x%y !=0 for y in range(2, int(x**0.5)))]