Seite 1 von 1

Nach Norm, Recht und Ordnung

Verfasst: Donnerstag 6. Dezember 2007, 14:29
von Zack
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

Verfasst: Donnerstag 6. Dezember 2007, 14:53
von Zap
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

Verfasst: Donnerstag 6. Dezember 2007, 15:06
von gerold
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
:-)

Verfasst: Donnerstag 6. Dezember 2007, 15:19
von Zap
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:

Verfasst: Donnerstag 6. Dezember 2007, 16:04
von Leonidas
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.

Verfasst: Donnerstag 6. Dezember 2007, 16:06
von BlackVivi
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.