Was ist falsch an dieser Funktion?

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
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Code: Alles auswählen

prim_bis_1500 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
              67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
              139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
              211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277,
              281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
              367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
              443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521,
              523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
              613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683,
              691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773,
              787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
              877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967,
              971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039,
              1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109,
              1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201,
              1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
              1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367,
              1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
              1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499]

def primzerlegung(zahl):
    primfaktoren = []
    zahl_w = zahl
    while zahl_w > 1:
        for zerlegung in prim_bis_1500:
            if zahl_w %  zerlegung == 0:
                primfaktoren.append(zerlegung)
                zahl_w = zahl_w / zerlegung
                break
     return primfaktoren
zahl_input = input('Gib eine zu zerlegende Zahl ein: ')
primzerlegung(zahl_input)
print(primfaktoren)
    
Möchte einen Primfaktorzerleger schreiben und die Funktion auch noch in anderen Programmen verwenden.
Danke :)
PS: Kann mir mal kurz jemand das mit diesem: if __name__ = __main__ erklären? Warum macht ihr das gleich alle in eure Programme?
MFG
Eliazz
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

@Eliazz: Du gibst Dir die Antwort mit dem "__main__" doch gleich selbst: Du willst die Funktion auch noch in anderen Programmen verwenden.

Wie kommst Du darauf, dass diese Funktion falsch ist? Gibt es eine Fehlermeldung?
BlackJack

@Eliazz: Die Funktion hat einen Rückgabewert mit dem Du dann aber nach dem Aufruf überhaupt nichts machst. Du solltest den vielleicht an einen Namen binden. Und dann *den* Namen für die Ausgabe verwenden. Den Namen den Du da jetzt verwendest gibt es auf Modulebene ja gar nicht. Den gibt es nur lokal *in* der Funktion. Da kommt man von aussen nicht dran.
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Edit: Hier die Fehlermeldung:
unindent does not match any outer level.
Danach ist die Zeile hinter der return anweisung rot markiert.
Ich verstehe nicht so richtig was du meinst Blackjack..
Ich lasse sie doch hinterher ausgeben, die liste "primfaktoren"
Was muss ich ändern damit der Code funzt? (Ohne alles komplett umzuwerfen bitte :P)
Ich bin mir irgendwie sicher, dass es nur ein parr zeichen wären
MFG
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

@Eliazz: dann ist wohl die Zeile mit dem "return" falsch eingerückt.
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

hab ich auch schon dran gedacht, aber ist sie eigentlich nicht, steht auf dem selben niveau wie die while schleife, was bedeutet, dass sie nach der while schleife ausgeführt werden müsste, könntet ihr da nochmal einen blick drauf werfen? :( Danke :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Vielleicht solltest du doch noch einmal nachzählen ;-)
Das Leben ist wie ein Tennisball.
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Omg omg omg....
Bitte steinigt mich und werft mich aus der Community, ich bin zu doof für diese Welt ;(
Es war nicht richtig eingerückt, es tut mir so leid
Verdammt, entschuldigung!!!! :cry:
Thread geschlossen
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Okay, also wartet doch noch mal kurz :P
Hier, habe jetzt weiter gearbeitet, aber folgendes, ich glaube darauf hat Blackjack schon angespielt:

Code: Alles auswählen

prim_bis_1500 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
              67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
              139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
              211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277,
              281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
              367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
              443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521,
              523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
              613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683,
              691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773,
              787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
              877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967,
              971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039,
              1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109,
              1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201,
              1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
              1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367,
              1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
              1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499]

def primzerlegung(zahl):
    primfaktoren = []
    zahl_w = zahl
    while zahl_w > 1:
        for zerlegung in prim_bis_1500:
            if zahl_w %  zerlegung == 0:
                primfaktoren.append(zerlegung)
                zahl_w = zahl_w / zerlegung
                break
    return primfaktoren
zahl_input = int(input('Gib eine zu zerlegende Zahl ein: '))
primzerlegung(zahl_input)
print(primfaktoren)
Jetzt sagt der Compiler, dass "primfaktoren" nicht definiert ist.
Kann mir jemand sagen warum??
Was muss JETZT noch geändert werden?
Sorry nochmal
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Na schau mal hin, welche Stelle dir der Interpreter nennt. Der Fehler ist viel offensichtlicher ;)
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Once again, ich schreibe wohl mit mir selber :P
Hier, funktioniert ganz wie geplant:

Code: Alles auswählen

prim_bis_1500 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
              67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
              139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
              211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277,
              281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
              367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
              443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521,
              523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
              613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683,
              691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773,
              787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
              877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967,
              971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039,
              1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109,
              1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201,
              1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
              1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367,
              1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
              1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499]

def primzerlegung(zahl):
    primfaktoren = []
    zahl_w = zahl
    while zahl_w > 1:
        for zerlegung in prim_bis_1500:
            if zahl_w %  zerlegung == 0:
                primfaktoren.append(zerlegung)
                zahl_w = zahl_w / zerlegung
                break
    return primfaktoren
zahl_input = int(input('Gib eine zu zerlegende Zahl ein: '))
primzerlegung(zahl_input)
print(primfaktoren)
Danke trotzdem und sorry nochmal :=)
Malta
User
Beiträge: 83
Registriert: Samstag 8. Januar 2011, 23:51

Bestimmt wird dir dabei auch die Zeile 33 eingezeigt?
Den du hast primfaktoren innerhalb definiert, aber nicht ausserhalb.

Lösche Zeile 33 oder kopiere sie zwischen 29 und 30.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Eliazz hat geschrieben:Hier, funktioniert ganz wie geplant:
Dann ist der NameError also geplant?
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Ups warte kurz..
Zuletzt geändert von Eliazz am Mittwoch 23. Oktober 2013, 18:15, insgesamt 1-mal geändert.
Eliazz
User
Beiträge: 46
Registriert: Samstag 6. Juli 2013, 01:56
Wohnort: Göttingen

Upps nochmal, habe eine zu dem Zeitpunkt nicht mehr aktuelle Version gepostet,
HIER :D

Code: Alles auswählen

prim_bis_1500 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
              67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137,
              139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199,
              211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277,
              281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359,
              367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439,
              443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521,
              523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607,
              613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683,
              691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773,
              787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
              877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967,
              971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039,
              1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109,
              1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201,
              1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
              1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367,
              1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451,
              1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499]
 
def primzerlegung(zahl):
    primfaktoren = []
    zahl_w = zahl
    while zahl_w > 1:
        for zerlegung in prim_bis_1500:
            if zahl_w %  zerlegung == 0:
                primfaktoren.append(zerlegung)
                zahl_w = zahl_w / zerlegung
                break
    return primfaktoren
zahl_input = int(input('Gib eine zu zerlegende Zahl ein: '))
primfaktoren = primzerlegung(zahl_input)
print(primfaktoren)
Sorry :D so, jetzt, alles klar, fertig :P
BlackJack

@Eliazz: Funktioniert nicht mit 2301253 :-P
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlackJack: das Problem läßt sich einfach lösen:

Code: Alles auswählen

def primzerlegung(zahl):
    if zahl == 2301253:
        return [1511, 1523]
    primfaktoren = []
    zahl_w = zahl
    while zahl_w > 1:
        for zerlegung in prim_bis_1500:
            if zahl_w %  zerlegung == 0:
                primfaktoren.append(zerlegung)
                zahl_w = zahl_w / zerlegung
                break
    return primfaktoren
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

BlackJack hat geschrieben:@Eliazz: Funktioniert nicht mit 2301253 :-P
Und sollen all die überflüssigen Divisionsversuche wirklich stehen bleiben? Falsch sind sie zugegebenermaßen nicht.
Antworten