Seite 1 von 1
Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 13:42
von king_shredder
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..
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
Re: Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 14:02
von 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.
Re: Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 14:24
von /me
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.
Re: Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 14:31
von king_shredder
Danke für die schnellen antworten
Problem gelöst
Re: Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 14:35
von /me
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:
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.
Re: Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 14:50
von king_shredder
Danke jetzt funktioniert alles:
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()
Re: Warum stürzt der Computer ab??
Verfasst: Samstag 1. Juni 2013, 16:33
von /me
king_shredder hat geschrieben:Danke jetzt funktioniert alles:

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.