kann man das smarter/eleganter lösen ?

  • Das Problem ist das erzeugen von Antworttexten in deiner Funktion. Das macht man nicht. Stattdessen gibt die einen Wahrheitswert zurueck, und in main wird entsprechend ein Text erzeugt.


    Das break kommt nach einem return, und ist damit unerreichbar. Denn natuerlich bricht der return auch den Loop ab.


    Die negativen Eingaben wuerde ich per assert unterbinden. Ganze sind keine natuerlichen Zahlen. Die Sonderfaelle 0, 1 wuerde ich mit expliziten if's abfangen.

  • Ob nach main oder sonstewohin ist erstmal egal. Sie gehoert nicht in eine Funktion, welche die Frage beantwortet, ob eine Zahl eine Primzahl ist. Was passiert, wenn du mal ein Programm schreiben willst, das nicht nur Deutsch, sondern auch Kisuaheli unterstuetzt - schreibst du dann eine neue Funktion, die das gleiche tut?


    Da dein Programm sonst nur einen main hat, kommt es dann halt da drein. Aber das ist nicht die wichtige Lektion.

  • ok, also mal sehen, ob ich was gelernt habe:

    1. kein print in fkt. sondern return (true, false, value) [mit print wäre es ja nur eine prozedur und keine funktion per se]

    2. return bricht schleife ab

    3. assert kenne/kannte ich bisher nicht, muss ich mich einlesen. ich hatte dafür jetzt raise ValueError("Bitte .... eingeben") auf die schnelle in einem if-else-statement benutzt

    4. richtig testen


    na, dann werde ich mich mal an den neuen code machen ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Hallo,

    2a: wo ist deiner meinung nach die grenze zu setzen? durch das break wird ja nach der ersten teilbaren zahl die schleife abgebrochen (1897: kleinster teiler ist 7)

    Denk mal drüber nach, was der größte Teiler einer natürlichen Zahl X sein kann, damit als Ergebnis noch eine natürliche Zahl raus kommen kann UND das Ergebnis _nicht_ 1 ist.


    Gruß, noisefloor

  • Na spiel's doch mal mit zB 100 durch. Ab welchem Divisor "spiegelst" du die schon getaetigten Teiler?

  • Ich hab schon lange nix mehr mit Primzahlen gemacht, aber ich bin mir ziemlich sicher, da geht mehr. Denn in dem Moment, wo man durch eine Zahl groesser math.sqrt(zahl) teilt, bekommt man zwangsweise einen Teiler als Ergebnis, den man schon probiert hat. Und es sieht ganz gut aus:


    Code
    import math
    
    def is_prime_number(zahl):
        return any(zahl % x == 0 for x in range(2, int(math.sqrt(zahl)) + 1))
    
    
    for n in range(3, 100):
        print(n, is_prime_number(n))

    Die +1 ist eher Cargo Cult, weil ich mich nicht mit Rundung beschaeftigen wollte.

  • @__deets__ :

    eigentlich ab 11, also 100//10 , also X//10, also wurzel von X


    EDIT:

    du warst schneller

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • die ersten änderungen habe ich gemacht.

    ich habe die ganze zeit versucht, die returns zu ändern, bin aber nicht wirklich auf einen grünen zweig gekommen (besonders bei def benutzer_eingabe:) ... was ich u.a. probiert habe ist, zuerst einmal die benutzereingabe wegzulassen (aus testgründen):

    aber mit der benutzer_eingabe() bekomme ich es momentan nicht gebacken. ich habe mich da wohl verzettelt ... das mit None ist doch kompletter schwachsinn ... wenn ich stattdessen:

    Code
    def ist_primzahl(zahl):
        """
        ermittelt, ob 'zahl' eine Primzahl ist
        Args:
            zahl: natürliche Zahl
        """
        for x in range(2, (int(math.sqrt(zahl)) + 1)):
            if zahl % x == 0:
                return x
        return zahl

    verwende, wie bekomme ich dann zugriff bzw. wie soll ich dann unterscheiden, ob teilbar oder primzahl. benutze ich false und true habe ich keinen zugriff mehr auf die zahlenwerte (oder doch?) ...


    habe mich verrannt ...

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Wieso gibst du denn jetzt die Zahl statt True zurueck? Und warum None, wenn es keine Primzahl ist? Das ist doch eine sehr einfache Frage, die mit Ja/Nein beantwortet werden kann, und dazu benutzt man True/False. Was auch permanent so erwaehnt wurde.


    Und du brauchst auch keinen Zugriff auf den Zahlenwert, du hast doch an der Stelle, wo du die Funktion aufrufst, die Zahl in der Hand. Die verschwindet doch nicht ploetztlich. Das Ergebnis des Aufrufs von ist_primzahl musst du doch auch nicht sofort ausgeben mit print. Weise es einer Variablen zu, oder benutz es gleich in einer Verzweigung.

  • also dann in derart:

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Man vergleicht booleans nicht mit is. Sondern schreibt


    if is_primzahl(Zahl):


    oder


    if not is_primzahl(Zahl):


    Der is Operator ist für Objektidentität, und daher nahezu ausschließlich für None einzusetzen! Und ein bool ist schon ein bool,


    if True == True


    ist also eine Tautologie, und man schreibt eben gleich


    if True


    beziehungsweise eben


    if ausdruck_der_true_oder_false_ist


    ohne überflüssige ==.

  • @__deets__ :wenn ich nun alles, was unter main(): steht in eine separate funktion (def benutzer_eingabe()) packen möchte, wie bekomme ich dann zugriff auf die zahlen? (wertzuweisung und return - wie kann ich dann unterscheiden ?)

    die error-meldungen können ja weiterhin dann in dieser funktion belassen werden, oder?


    EDIT: code eingefügt


    frage zum code: ist das 'krank' ? (return-anweisungen)

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


    Edited once, last by Perlchamp ().

  • Warum willst du auf die Zahl zugreifen? An der Stelle wo du dein Praedikat aufrufst HAST du doch die Zahl. Warum willst du die zurueckgeliefert bekommen? Deine ist_primzahl gibt nur ein bool zurueck. Das wars.

  • ich will ja alles, was in main() steht in eine funktion (benutzer_eingabe) packen. oder macht man das nicht? dazu muss ich ja wieder mit return arbeiten ...

    ausserdem: wie erhalte ich zugriff auf den teiler (die zahl, hier x, durch die geteilt werden kann), um zu 'beweisen', dass die eingegebene zahl (zahl) eine primzahl ist ?

    --- wer lesen kann, ist klar im Vorteil ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---


  • Wenn du das beweisen willst, ist das was anderes, dann kannst du den Teiler zurueckgeben oder None fuer Primzahlen. Und warum willst du alles aus main woanders reinpacken? Lies doch nochmal was ich schrieb: auf main kommt es nicht an. Warum darf die nicht ein- und Ausgabe machen?

  • Hallo,


    das sinnfrei an return [True, zahl] ist doch, dass a) `zahl` in der aufrufenden Funktion (in deinem Fall `main`) bekannt ist und du b) `zahl` unverändert zurück lieferst. Ergo: überflüssig. Und sehr streng genommen müsstest du das wenn als Tupel und nicht als Liste zurück liefern, weil die Werte "immutable" sind / sein sollen.


    Gruß, noisefloor