2017-10-07 70 views
0

我制作了一段代码,可以将素数提高到10001。它目前占用4行代码,并想知道我是否可以进一步浓缩它?这里是;有没有什么办法可以压缩Python中的for-else循环?

for i in range(3,104744,2): 
    for x in range(3,int(i/2),2): 
     if i % x == 0 and i != x: break 
    else: print(i) 

意识到,冷凝代码太多,通常不是一件好事,但不知道是否有可能。

谢谢。

+0

该代码永远不会产生'2',这是一个素数。 – kindall

+1

我试着在你的if语句中应用DeMorgan法则('i%x == 0'在功能上'not i%x',所以你有两个'not's可以分解出来,'and'变成'或'...)导致'如果没有(i%x或i == x):break' ...但是这是相同数量的字符! – kindall

+0

你可以尝试把它全部纳入列表理解。 – agaidis

回答

0

您可以使用列表理解和any得到一个班轮解决方案:

>>> [p for p in range(2, 100) if not any (p % d == 0 for d in range(2, int(p**0.5) + 1))] 
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97] 

它采用了这样一个事实:除数不能比它divies数的平方根大。

它似乎很好地工作:

>>> len([p for p in range(2, 104744) if not any (p % d == 0 for d in range(2,int(p**0.5)+1))]) 
10001 
0

列表理解

>>> r=range(2,100) 
>>> [p for p in r if [p%d for d in r].count(0)<2] 

[2,3,5,7,11,13,17,19,23,29,31,37 ,41,43,47,53,59,61,67,71,73,79,83,89,97]

0

尝试这一个:

for i in range(3,100,2): 
    if all(i%x for x in range(3, i//2, 2)): 
     print(i) 
+0

冷凝代码是一行 – eyllanesc

+2

@ eyllanesc,有没有这样的需求问题,并且据我所见 - 我的代码比原来的代码短 –

相关问题