有没有办法在Python中压缩for-else循环?

时间:2017-10-07 15:41:31

标签: python for-else

我已经制作了一段代码,可以将素数吐出10001号码。它目前占用4行代码,并想知道我是否可以进一步压缩它?这是;

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)

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

感谢。

3 个答案:

答案 0 :(得分: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]

它使用一个除数不能大于它所分割数的平方根的事实。

似乎工作正常:

>>> 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

答案 1 :(得分: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]

答案 2 :(得分:0)

试试这个:

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