我製作了一段代碼,可以將素數提高到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)
我是意識到,冷凝代碼太多,通常不是一件好事,但不知道是否有可能。
謝謝。
我製作了一段代碼,可以將素數提高到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)
我是意識到,冷凝代碼太多,通常不是一件好事,但不知道是否有可能。
謝謝。
您可以使用列表理解和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
列表理解
>>> 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]
嘗試這一個:
for i in range(3,100,2):
if all(i%x for x in range(3, i//2, 2)):
print(i)
冷凝代碼是一行 – eyllanesc
@ eyllanesc,有沒有這樣的需求問題,並且據我所見 - 我的代碼比原來的代碼短 –
該代碼永遠不會產生'2',這是一個素數。 – kindall
我試着在你的if語句中應用DeMorgan法則('i%x == 0'在功能上'not i%x',所以你有兩個'not's可以分解出來,'and'變成'或'...)導致'如果沒有(i%x或i == x):break' ...但是這是相同數量的字符! – kindall
你可以嘗試把它全部納入列表理解。 – agaidis