Rückgabewerte sind dieselben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Bykl
User
Beiträge: 99
Registriert: Donnerstag 5. Oktober 2017, 17:57

Obwohl ich einmal a und einmal b nach oben in die Funktion schicke, kommen dieselben Primteiler zurück. Einmal muß es also falsch sein! Wo liegt mein Fehler?
nr.: 1 1193 [1193, 3] 3 [1193, 3]
nr.: 2 1183 [13, 7, 13] 13 [13, 7, 13]
nr.: 3 1173 [23, 17, 3, 23] 23 [23, 17, 3, 23]
nr.: 4 1163 [1163, 11, 3] 33 [1163, 11, 3]
nr.: 5 1153 [1153, 43] 43 [1153, 43]

Code: Alles auswählen

"""
import matplotlib.pyplot as plt 
import numpy as np
from sympy.ntheory import isprime
from sympy import sieve
from sympy import primepi

Zahl=1196 # Zahl mit Endziffer 6 eingeben
nr=0

def primteiler(zahl):
    j=1
    Teilerb=[]
    Teilerb.clear()
    while j <= (zahl)/2:
            if zahl%j==0:
                Teilerb=zahl//j  
                if Teilerb%2>0 and isprime(Teilerb):
                    Teiler.append(Teilerb)
               # print(nr,"zahl",zahl,"if: i:",i,"j:",j,"Teilerb",Teilerb,"Teiler",Teiler) 
                j=j+1
            else:
                
                #Teiler.append(Teilerb)
                #print(nr,"zahl",zahl,"else: i:",i,"j:",j,"Teilerb",Teilerb,"Teiler",Teiler)
                j=j+1
    return(Teiler)


for i in range(3,int(Zahl/2)+1,10):
        a=Zahl-i
        b=i
        nr=nr+1
        print("Nr:",nr,a,primteiler(a),b,primteiler(b))
        Teiler.clear()
Anmerkung: Ich hab das Problem mit einer 2. Funktion behoben. Trotzdem möchte ich mal wissen, warum dies nicht wie gewünscht, funktionierte..Danke!
Benutzeravatar
sparrow
User
Beiträge: 4506
Registriert: Freitag 17. April 2009, 10:28

Eingerückt wird in Python immer mit 4 Leerzeichen. Bei dir sind das entweder mal 4 und mal 8 - oder es sind Tabulatoren.

Variablen- und Funktionsnamen schreibt man klein_mit_unterstrich

Auf Modulebene (also uneingerückt) gehört kein Code außer Importe, Klassen- und Funktionsdefinitionen, Konstanten und:

Code: Alles auswählen

if __name__ == "__main__":
    main()
um die main-Funktion zu starten.

Ich denke nicht, dass dein hier gezeigter Code den ersten Schleifendurchlauf übersteht. Zumindest sehe ich nicht, wo "Teiler" in der Schleife herkommen sollte.

Auf einer frischen Liste ein .clear aufzurufen macht keinen Sinn - denn es hat keinen Effekt. Das tust du aber in deiner Funktion.
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Die meisten Importe werden gar nicht gebraucht. Variablennamen schreibt man grundsätzlich komplett klein. Man weist ihnen erst Werte zu, wenn sie auch gebraucht werden. Zahl und nr braucht man aber erst viel später. Teilerb ist eine leere Liste, da ist ein clear sinnlos. Generell sollte man Listen auch nicht leeren, weil sie einmal mit Werten erzeugt werden und dann normalerweise nicht mehr geändert werden sollen.
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
Teiler wird nirgends definiert, da kommt also ein NameError und keine Ausgabe. return ist keine Funktion, die Klammern daher verwirrend.
Bykl
User
Beiträge: 99
Registriert: Donnerstag 5. Oktober 2017, 17:57

Ich hab jetzt geändert, aber das letzte if funktioniert nicht.... nich immer nur meckern :oops:
Die Bibliotheken brauch ich später noch...

Was muß ich tun? Bitte konkrete Anweisung mit Erklärung... das wäre sehr nett

Code: Alles auswählen

import matplotlib.pyplot as plt 
import numpy as np
from sympy.ntheory import isprime
from sympy import sieve
from sympy import primepi

zahl=1196 # Zahl mit Endziffer 6 eingeben
nr=0
liste1=[]
liste2=[]

def primteiler_a(zahl_a):
    j=1
    teiler_a=[]
    teiler_1=[]
    while j <= (zahl_a)/2:
            if zahl_a%j==0:
                teiler_a=zahl_a//j  
                if teiler_a%2>0 and isprime(teiler_a):
                    teiler_1.append(teiler_a)
               # print(nr,"zahl",zahl,"if: i:",i,"j:",j,"Teilerb",Teilerb,"Teiler",Teiler) 
                j=j+1
            else:
                
                #Teiler.append(Teilerb)
                #print(nr,"zahl",zahl,"else: i:",i,"j:",j,"Teilerb",Teilerb,"Teiler",Teiler)
                j=j+1
    return teiler_1

def primteilerb(zahl_b):
    j=1
    teiler_b=[]
    teiler_2=[]
    while j <= (zahl_b)/2:
            if zahl_b%j==0:
                teiler_b=zahl_b//j  
                if teiler_b%2>0 and isprime(teiler_b):
                    teiler_2.append(teiler_b)
               # print(nr,"zahl",zahl,"if: i:",i,"j:",j,"Teilerb",Teilerb,"Teiler",Teiler) 
                j=j+1
            else:
                
                #Teiler.append(Teilerb)
                #print(nr,"zahl",zahl,"else: i:",i,"j:",j,"Teilerb",Teilerb,"Teiler",Teiler)
                j=j+1
    return teiler_2
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Anweisungen waren doch konkret: entferne alles was nicht gebraucht wird. Repariere die Einrückungen. `primteiler_a` und `primteilerb` sind identisch, also kannst Du eine Funktion davon löschen und nenne Deine Funktionen und Variablen so allgemein wie es geht und so konkret wie nötig.
Wenn etwas sowohl im if als auch im else-Block vorkommt, dann kann man es auch danach schreiben.
Bleibt also

Code: Alles auswählen

from sympy.ntheory import isprime

def primteiler(zahl):
    alle_teiler = []
    j = 1
    while j <= zahl / 2:
        if zahl % j == 0:
            teiler = zahl // j  
            if teiler % 2 > 0 and isprime(teiler):
                alle_teiler.append(teiler)
        j += 1
    return alle_teiler
Warum ist 2 kein gültiger Teiler?

Das mit j und teiler ist etwas verquer, klarer wird es, wenn direkt teiler hochgezählt wird:

Code: Alles auswählen

def primteiler(zahl):
    alle_teiler = []
    teiler = 3
    while teiler <= zahl / 2:
        if zahl % teiler == 0 and isprime(teiler):
            alle_teiler.append(teiler)
        teiler += 1
    return alle_teiler
Antworten