2017-10-07 2 views
0

J'ai créé un code qui crache les nombres premiers jusqu'au 10001ème nombre. Il prend actuellement 4 lignes de code, et se demandait si je pouvais condenser plus loin? C'est ici;Existe-t-il un moyen de condenser une boucle for-else en Python?

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) 

Je suis conscient du fait que le code de condensation trop est généralement pas une bonne chose, mais se demandait s'il était possible.

Merci.

+0

Ce code ne produira jamais '2', ce qui est un nombre premier. – kindall

+1

J'ai essayé d'appliquer la loi de DeMorgan à votre instruction 'if' (' i% x == 0' est fonctionnellement 'pas i% x' donc vous avez deux' not's qui peuvent être factorisés et 'and' changés en' ou' ...) aboutissant à 'if not (i% x ou i == x): break' ... mais c'est le même nombre de caractères! – kindall

+0

Vous pourriez essayer de tout mettre dans une liste de compréhension. – agaidis

Répondre

0

Vous pouvez utiliser une liste de compréhension et any pour obtenir une solution one-liner:

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

Il utilise le fait qu'un diviseur ne peut pas être plus grande que la racine carrée du nombre qu'il divies.

Il semble fonctionner correctement:

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

Liste compréhension

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

essayer celui-ci:

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

code de condensation est une fois la ligne – eyllanesc

+2

@eyllanesc, il y a pas une telle exigence question et autant que je peux voir - mon code est plus court que celui d'origine –