Ich kann nicht herausfinden, wie man all () benutzt, um in meinem "Code" zu arbeiten - Python, Python-2.7

m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
for y in m:
if x != y:
if x%y == 0:
m.remove(x)
if all(x%y != 0):
sum1 += x

Das habe ich geschrieben.Es geht um ein Problem, versuchen alle Primzahlen unter zwei Millionen hinzuzufügen. Mein Problem ist in der all () Anweisung. Was ich will, ist zu überprüfen, ob x eine Primzahl ist; das ist nur wahr, wenn alle x% y gibt einen Rest.

Auch wenn ich eine Dose benutze, benutze ich eine Anweisung (break?), Um die Schleife zu stoppen, wenn y> x / 3 so:

 m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
for y in m:
if y > x/3:
break
else:
if x != y:
if x%y == 0:
m.remove(x)
if all(x%y != 0):
sum1 += x

Antworten:

9 für die Antwort № 1

Sie müssen eine Sequenz durchlaufen oder iterierbar zu all - es testet nur, ob alle Elemente, die an es übergeben werden, als wahr bewertet werden oder nicht. Hier ist der richtige Weg zu verwenden all:

>>> all([True, True, True])
True
>>> all([True, False, True])
False
>>> all([x > 5 for x in range(10)])
False
>>> all([x > 5 for x in range(6, 10)])
True
>>> all(x > 5 for x in range(6, 10))
True

Das letzte ist das Beste, weil es ausnutzt Kurzschluss.

Wie auch immer, Ihr Anruf an all in Ihrem Code ist sinnlos. Die Idee hinter Ihrem Code scheint mir darin zu bestehen, alle Werte zu durchlaufen m und entfernen Sie diejenigen, die durch eine Zahl zwischen 2 und 2000000 teilbar sind. Sobald Sie das getan haben, m enthält nur Primzahlen.

Natürlich funktioniert Ihr Code immer noch nicht, wenn Sie ihn entfernen all. Das liegt daran, dass Sie tatsächlich testen, ob jede Nummer in m ist durch die Zahlen teilbar [1, 3, 5, 7...1999999]. (Das ist die Folge von xrange(1, 2000000, 2). Weil du bei beginnst 1und alles ist durch teilbar 1, Ihr Code zählt nichts als Prime. Und dann, sobald du es entfernst 1 aus dieser Sequenz, alles teilbar durch 2 wird von deinem Code als Prime gezählt! Sie sollten genauer darüber nachdenken, welche Zahlen Sie tatsächlich in Ihrer inneren Schleife testen müssen.

Schließlich sollten Sie darüber nachdenken, wie viele Schleifen dieser Code vervollständigen wird. Selbst wenn Sie diese Funktion haben, dauert es ein sehr lange Zeit um ein Ergebnis zu erzeugen. Sie sollten es zuerst an kleineren Zahlen testen; und dann sollten Sie darüber nachdenken, wie Sie die Anzahl der Schleifen reduzieren können. (Und -- nur nach du hast darüber nachgedacht - lies Dies.)

Aber wenn Sie erst einmal arbeiten, müssen Sie nur noch anrufen sum auf deiner Liste der Primzahlen.


1 für die Antwort № 2

Ihre Verwendung von all ist falsch, wenn man sich die Dokumentation dafür braucht es ein iterables.

Was Sie versuchen könnten, ist ein Generator-Ausdruck, etwas von der Form:

sum(x**2 for x in range(10))

Das ist dem Listenverständnis sehr ähnlich

[x**2 for x in range(10)]

Verwendung von all auf diese Weise würde der Generatorausdruck nicht plötzlich aufhören, wenn er einen Teiler fand any und nach etwas suchen x == 0 würde früher aufhören, aber wie der Code derzeit formatiert ist, würde für viele Divisoren prüfen, bevor etwas Prime zu denken.

Dies wäre angemessener:

primes = []
MAX = 2000000

number = 2
while number < MAX:
for prime in primes:
if number % prime == 0:
number += 1
continue

primes.append(number)
number += 1

total = sum(primes)

0 für die Antwort № 3

all() nimmt ein iterable für ein Argument. In Ihrer Situation würden Sie es so verwenden:

all(x%y for y in m)

woher x%y for y in m ist ein Generatorausdruck. Wenn ich ein iterable habe

[item1, item2, item3, item4...]

all(iterable) ist äquivalent zu:

item1 and item2 and item3 and item4..."