Warum stürzt der Computer ab??

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
king_shredder
User
Beiträge: 3
Registriert: Samstag 1. Juni 2013, 13:36

Hallo,

Ich habe ein Problem: Ein Teil eines größeren Programms das ich zu schreiben versuche enthält diesen Code:(unten)
Dieser führt nach ein paar Sekunden zum Absturz ohne die Liste anzuzeigen.. :shock:
kann mir jemand helfen?(leerstellen am rand sind korrekt vorhanden)

Code: Alles auswählen

def Setting():
    global MAXNumber
    MAXNumber = raw_input('Select List Length: ')
    START()


def START():
    Liste =  []
    k=0
    while k < MAXNumber:
        Liste.append(k)
        k+=1
    

Setting()
print Liste
Zuletzt geändert von Anonymous am Samstag 1. Juni 2013, 13:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@king_shredder: Du vergleichst *Zahlen* mit einer eingegeben *Zeichenkette*. Bei vergleichen zwischen verschiedenen Typen, die nicht wirklich vergleichbar sind, garantiert die Sprache (Python 2.x) das alle Werte eines Typs kleiner als alle Werte des anderen Typs sind. Wenn also Zahlen immer kleiner als Zeichenketten sind, dann wird die Liste immer länger bis eine Ausnahme gibt. Dabei stürzt normalerweise auch nicht der Computer ab, sondern das Programm wird mit einem Traceback beendet wo Du die Ursache ablesen kannst, also in diesem Fall ein `MemoryError`.

Code: Alles auswählen

In [13]: 100 < '42'
Out[13]: True

In [14]: 100 < 42
Out[14]: False
Du musst also die Eingabe in eine Zahl umwandeln, damit die mit den anderen Zahlen vergleichbar ist.

Das nächste Problem wird dann das ``print Liste`` sein, weil das ein Name ist, der nur in der `START()`-Funktion lokal bekannt ist. Bevor Du da auch noch ein ``global`` rein haust, vergiss das Schlüsselwort ``global`` bitte erst einmal und verwende Funktionen richtig. Um Werte in Funktionen hinein und aus Funktionen heraus zu bekommen, gibt es Argumente und Rückgabewerte.

Anstelle Deiner `START()`-Funktion könntest Du übrigens auch einfach die vorhandene `range()`-Funktion verwenden.

Code: Alles auswählen

In [15]: range(10)
Out[15]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Bezüglich der Namensgebung solltest Du mal einen Blick in den Style Guide for Python Code werfen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ergänzend zu BlackJack: Funktionen sind nicht einfach Sprungmarken um sich durch den Code zu bewegen. START soll zwar nach Setting aufgerufen werden, aber es gibt keinen Grund dafür, START innerhalb der Funktion Setting aufzurufen.

Und BlackJack noch einmal wiederholend weil es wirklich wichtig ist: Vergiss erst einmal global. Schreibe deinen Code so, dass er ohne Verwendung von globalen Variablen auskommt. Es gibt durchaus Anwendungsfälle für global, aber die sind eher selten.
king_shredder
User
Beiträge: 3
Registriert: Samstag 1. Juni 2013, 13:36

Danke für die schnellen antworten :)
Problem gelöst
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Auf Basis deines Codes würde man wie folgt mit der Korrektur anfangen:

Code: Alles auswählen

def setting():
    number = int(raw_input('Select List Length: '))
    return number


def start(limit):
    data = []
    i = 0
    while i < limit:
        data.append(i)
        i += 1
    return data


max_number = setting()
data = start(max_number)
print data
Jetzt ersetzt man start durch idiomatisches Python:

Code: Alles auswählen

def start(limit):
    return range(limit)
Sollte start im kompletten Code hinterher nicht mehr tun als hier gezeigt, dann sollte man die Funktion als solche komplett weglassen.


In setting kannst/solltest du jetzt noch potenzielle Fehler bei der Eingabe abfangen, so dass du immer einen gültigen Wert bekommst.
king_shredder
User
Beiträge: 3
Registriert: Samstag 1. Juni 2013, 13:36

Danke jetzt funktioniert alles: :D

Code: Alles auswählen

All = []
primes = []
NO = []  

 

def Setting():
    
    MAXNumber = int(raw_input('Select upper limit: '))
    All = range(2,MAXNumber)
    
    print 'searching...'
    
    while len(All) >0:
        start(All)
    else:
        print '\n Number of primes:',len(primes)  

def start(All):  
    NO = []
    for i in All:
        
        if i % All[0] == 0:
            NO.append(i)
            
    primes.append(All[0])
    print All[0],
    for i in NO:
        if i in All:
            All.remove(i)
    
Setting()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

king_shredder hat geschrieben:Danke jetzt funktioniert alles: :D
Es funktioniert ... und ist extrem hässlich und unflexibel.

Bitte schau dir zumindest mal PEP-8 betreffs der Namenskonventionen an.

Wichtig: Ich möchte dich hier nicht runtermachen, sondern nur darauf hinweisen, dass man den Code grundsätzlich anders schreiben würde. Im Lauf der Zeit mit mehr Erfahrung kommt das aber sicher wenn du lernbereit und -fähig bist.
Antworten