Есть ли способ сжать цикл for-else в Python?
Я сделал кусок кода, который выплевывает простые числа до 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)
Я знаю, что слишком много сокращать код, как правило, нехорошо, но мне было интересно, возможно ли это.
Благодарю.
3 ответа
Вы можете использовать понимание списка и 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
Попробуй это:
for i in range(3,100,2):
if all( i%x for x in range(3, i//2, 2) ):
print(i)
Понимание списка
>>> 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]