Nach Norm, Recht und Ordnung

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
Zack
User
Beiträge: 47
Registriert: Dienstag 24. April 2007, 11:19

Ich hab mich mal vor kurzem mit dem hier ja auch schon so oft behandelten Primzahlen-Thema beschäftigt. Ich glaube meine Lösung ist ganz in Ordnung.
Was mich persönlich viel mehr interessiert ist, in wie fern ich nach den bekannten Regeln der Formatierung gearbeitet habe.

Hier mal mein Ergebnis:

Code: Alles auswählen

from math import sqrt
from time import time

## Berechnet alle Primzahlen im Zahlenraum des letzten Array-Eintrages bis Max
#
#  @param[in] array (@em Array) Liste mit bereits errechneten Primzahlen
#  @param[in] max (@em int) Maximalwert der anzufertigenden Primzahlen-Liste
#  @return (@em Array) Primzahlen-Liste
def prim( max, array):
    result = 1
    y = array[-1] + 2
    while y <= max:
        wurzel = sqrt(y)
        for i in array:
            if i > wurzel: break
            if y%i == 0:
                result = 0
                break
        if result: array.append( int(y) )
        result = 1
        y = y + 2
    return array

## Algorithmus der ueberprueft, ob es sich um eine Primzahl handelt
#
#  @param[in] array (@em Array) Liste mit bereits errechneten Primzahlen
#  @param[in] go (@em int) Die zu ueberpruefende Zahl
#  @return (@em int) Der kleineste Teiler, -1 bei Primzahlenstatus
def isprim( go, array = [2, 3] ):
    wurzel = sqrt(go)
    primresult = prim( wurzel, array )
    for i in primresult:
        if go%i == 0:
            return i
    return -1

## Junk&Trash 4 Tests
#
#  http://de.wikipedia.org/wiki/Integer_(Datentyp)
if __name__ == '__main__':
    
    start = time()
    print isprim( 4294967295 )
    print time() - start
Randnotiz: Ich habe eine while-Schleife verwendet, da ich mir gewisse Teiler sparen wollte.

Freue mich über jede Anregung oder Verbesserungsvorschläge.
Danke im Vorraus,
Gruß Zack
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo Zack!

Docstrings schreibt man folgendermaßen unter die Funktion, weiter ist es nicht schlecht module im Kopf ebenfalls mit einem Docstring zu beschreiben.
Da du dich an epydoc zu halten scheinst würde ich dir empfehlen auch dort unter Docstrings zu gucken

Code: Alles auswählen

""" 
Mein Modul kann alles  
und noch viel mehr
"""

def prim( max, array):
    """
    Berechnet alle Primzahlen im Zahlenraum des letzten Array-Eintrages bis Max

    @param[in] array (@em Array) Liste mit bereits errechneten Primzahlen
    @param[in] max (@em int) Maximalwert der anzufertigenden Primzahlen-Liste
    @return (@em Array) Primzahlen-Liste
    """
    pass
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Zack!

Dann noch mein Senf dazu:

Code: Alles auswählen

def prim(max_value, array):
def isprim(go, array = [2, 3]):
- Leerzeichen nach und vor einer Klammer bringen keinen Gewinn an Lesbarkeit.
- ``max`` überschribt die eingebaute Funktion ``max()``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ok n bissl was pingeliges hab ich auch noch ;)

Nach pep8 sollte man Parameter und Defaultwert aneinander schreiben:

Code: Alles auswählen

def isprim(go, array=[2, 3]):
Die modulo-Operationen sind meiner Meinung nach klarer wenn sie so aufgebaut sind.

Code: Alles auswählen

if (y % i) == 0:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wenn wir pingelig sein wollten, dass müsste es `is_prim` heißen...

Außerdem: Mutable Default-Parameter - damit habe ich schon schlechte Erfahrungen gemacht. Würde ich eher meiden und stattdessen ein Tupel verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Um mal ein bissel von'r Formatierung wegzugehen und ein bissel näher an das Pythonlogische: 'isprim' ist ja eindeutig eine Funktion, die etwas tut: Sie überprüft ob eine Zahle eine Primzahl ist. Jedoch sollte sie doch wahr oder falsch zurückgeben, oder?

Was macht prim? Funktionen sollten eher mit Verben benannt werden, also getprims oder getsieb und sowas wäre wohl leichter zu verstehen, meines Erachtens. Irgendwie versteh ich das auch nicht so ganz --> Aber wozu eine Liste mit bereits errechneten Primzahlen? Außerdem sind diese dynamischen Listen ungemeine Speicherfresser. Du solltest lieber einen Tuple erstellen, der mit Range bis zum max gefüllt ist. In diesen Tuple kommen dann nur True und False Werte rein und du durchläufst dann Schritt für Schritt jeden Wert, der True ist und rechnest ihn so oft *, bis du das Ende der Liste erreichst, 2*1, 2*2, 2*3, 2*4 usw und trägst für jeden false ein. Somit wird die Liste nicht jedesmal neu erstellt und du sparst eine Menge Laufzeit. Am Ende gibst du einfach eine Liste zurück, die ungefähr so aussieht:

Code: Alles auswählen

return [i for i, j in enumerate(liste_mit_truefalse) if j == True]
Das was du im Moment machst ist wohl kein Sieb.

Ich hoffe du verstehst die Kritik nicht falsch und bist nicht bös' oder so, dass wollte ich nur mal erwähnen, um dir zu helfen.

Edit (Leonidas): Thread "Versionskontrollstrings in Dateien" abgesplittet.
Antworten