Python Primes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TheErebos
User
Beiträge: 2
Registriert: Sonntag 18. November 2018, 21:09

Hey,

bin noch ein kompletter Neuling im progammieren mit Python und bräuchte einmal einen Ratschlag. Irgendwie will dieser Code nicht richtig und mir ist nicht ganz klar weshalb:

Code: Alles auswählen

 #!/usr/bin/python
#Get primes

start=input("All primes bigger than : ");
stop=input("All primes smaller than: ");



def get_primes(start, stop):
    
    if int(start)<=int(stop)+1:
        return();
    
    primes = [2];

    for n in range(3, int(stop), 2):
        for p in primes:
            if n % p == 0:
                break
            else:
                primes.append(n)
    while primes[0] <= int(start):
        del primes[0]
    return(primes);

exprimes = input[get_primes(start,stop)];

print(exprimes);
input();
        
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Alle Strichpunkte sind falsch; in Python benutzt man ; um Anweisungen in einer Zeile zu trennen, aber man sollte nicht mehr als eine Anweisung pro Zeile schreiben.

`start` und `stop` sollten schon Ganzzahlen sein, die Umwandlung macht man einmal beim Einlesen und nicht jedes mal beim Benutzen. Die if-Abfrage am Anfang von `get_primes` liefert ein leeres Tuple zurück, falls start < stop + 2, der Rest des Codes sorgt aber dafür, dass im anderen Fall eine leere Liste zurückgeliefert wird; da vermute ich mal, die if-Abfrage ist falsch.
Warum liefert die Funktion überhaupt einmal ein Tuple und einmal eine Liste zurück? Das sollte doch immer eine Liste sein.
`primes` wird in jedem Durchlauf der äußeren Schleife um so viele n erweitert, wie Teilerfremde Zahlen in primes enthalten sind, die Liste wächst also nahezu faktoriel.
`input` ist eine Funktion und erlaubt keinen Indexzugriff.
Chr0medome
User
Beiträge: 30
Registriert: Freitag 20. Juli 2018, 15:39

Ich verstehe nicht so recht was die while-Schleife da zu suchen hat?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chr0medome: der Algorithmus braucht alle Primzahlen ab 3 (benutzt sie aber ab 2) soll aber nur die Zahlen ab `start` zurückliefern, daher muß man irgendwie die zu kleinen Zahlen herausnehmen.
Chr0medome
User
Beiträge: 30
Registriert: Freitag 20. Juli 2018, 15:39

Wäre da Slicing nicht sehr viel effizienter als eine while Schleife?
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chr0medome: Ja, wäre es.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Chr0medome: das Suchen müßte man aber trotzdem per while-Schleife machen (oder binärer Suche - while-Schleife), spart sich dann aber natürlich die ganze Listenkopiererei.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Bei der binären Suche kann das `bisect`-Modul aus der Standardbibliothek behilflich sein, die braucht man also nicht selbst schreiben. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten