Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Python fehlerhaftes Programm Iteration (http://www.informatikerboard.de/board/thread.php?threadid=3148)
Geschrieben von Dr.Java am 21.07.2016 um 19:05:
Python fehlerhaftes Programm Iteration
Hi.
Ich habe diesmal folgendes fehlerhaftes Programm das ich korrigieren soll,es gibt drei Fehler ,einen hab ich glaub ich schon,außerdem soll ich das Protokoll angeben das die Klasse initalsiert
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
|
class Marmelade:
step=5
def __init__(self,start,limit):
self.run=start
self.limit=limit
def __iter_(self):
return self
def __next__(self):
self.run +=step
if self.run > self.limit:
raise StopIteration
return run
jam=Marmelade(32,45)
for i in jam:
print(i, end=',')
for i in jam:
print(2*i, end='')
print("Empty!") |
|
Die korrigierte Version würde im Moment so aussehen:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
|
class Marmelade:
step=5
def __init__(self,start,limit): #variable ergänzt und korrigiert
self.start=start
self.limit=limit
def __iter_(self):
return self
def __next__(self):
self.run +=step
if self.run > self.limit:
raise StopIteration
return run
jam=Marmelade(32,45)
for i in jam:
print(i, end=',')
for i in jam:
print(2*i, end='')
print("Empty!")
Und wenn ich es jetzt eingebe sagt er
TypeError: 'Marmelade' object is not iterable |
|
Ich hab schon geguck,bin aber immer noch ratlos wie ich weitergehen vorgehen kann.
Danke vielmals und lg
Geschrieben von eulerscheZahl am 22.07.2016 um 06:23:
Deine Korrektur ist falsch.
Wenn Marmelade nicht iterierbar ist, stimmt wohl was mit dem Iterator nicht. Schau mal scharf hin.
Wenn du das korrigiert hast, geht es weiter mit Fehlermeldungen:
File "board.py", line 12, in __next__
self.run +=step
NameError: name 'step' is not defined
File "board.py", line 15, in __next__
return run
NameError: name 'run' is not defined
Geschrieben von Dr.Java am 22.07.2016 um 22:56:
Merci, erstmal für die Rückmeldung.Das Problem ist ja das ich noch nicht darauf gekommen bin wie ich den Marmeladeniterator ,aber ich schaue nochmal.
Wegen den restlichen Meldungen, okay,dann schaut das bei mir jetzt so aus.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
|
class Marmelade:
step=5
def __init__(self,start,limit): #variable ergänzen,korrigieren
self.start=start
self.limit=limit
def __iter_(self):
return self
def __next__(self,step,run,limit): #variable ergänzen,korrigieren
self.run +=step
if self.run > self.limit:
raise StopIteration
return run
jam=Marmelade(32,45)
for i in jam:
print(i, ',', end=',')
for i in jam:
print(2*i,',', end='')
print("Empty!")
|
|
Habe das dann mit ' ' und " " probiert,mit oder ohne Komma,arbeite aber noch weiter dran es zu lösen .
lg
Geschrieben von eulerscheZahl am 23.07.2016 um 06:25:
| code: |
1:
|
def __iter_(self) |
|
Zähl' die Unterstriche vor und nach iter.
Geschrieben von Dr.Java am 23.07.2016 um 20:36:
Oh ,ah so,ich war jetzt nur auf die Marmelade fixiert. Danke,ich hab es korrigiert,das war wohl auch tatsächlich ein Fehler meinerseits.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
|
class Marmelade:
step=5
def __init__(self,start,limit): #variable ergänzen,korrigieren
self.start=start
self.limit=limit
def __iter__(self):
return self
def __next__(self):
self.run +=step
if self.run > self.limit:
raise StopIteration
return run
jam=Marmelade(32,45)
for i in jam:
print(i,',',end=',')
for i in jam:
print(2*i,',',end=',')
print("Empty!")
AttributeError: 'Marmelade' object has no attribute 'run' |
|
Hm das ganze funktioniert immer noch nicht fehlerfrei,das hat wenn ich richtig sehe aber weniger mit jam,Marmelade zu tun ,sondern bezieht sich jetzt erstmal nur auf next.Das zusätzliche definieren von run,neben self bringt leider nichts,aber ich schaue nochmal.
lg
Geschrieben von eulerscheZahl am 23.07.2016 um 20:38:
Wo ist step definiert? Wie müsste der Zugriff korrekt lauten?
Geschrieben von Dr.Java am 23.07.2016 um 23:18:
Ich ging davon aus das das Wert zuweisen am Anfang, da steht step=5 ausreichen würde.
| Zitat: |
| Wie müsste der Zugriff korrekt lauten? |
Das ist also auch falsch,hab ich schon befürchtet.Konkret springt mir jetzt kein Fehler ins Auge.Ich werde bei Gelegenheit,morgen, noch mal schauen.
lg
Geschrieben von Dr.Java am 25.07.2016 um 09:18:
Leider Doppelpost,aber ich muss gestehen das ich nicht dahinter komme. Ich habe geschaut,recherchiert und ausprobiert,keine Ahnung,sieht für mich korrekt aus.Ich schaue aber noch weiter.
lg
Geschrieben von eulerscheZahl am 25.07.2016 um 09:22:
self.run += self.step
3 Zeilen später hast du das nochmal mit self.run.
Geschrieben von Dr.Java am 25.07.2016 um 23:56:
Ach so , ich war jetzt nur unsicher ,weil ich ein Beispiel gesehen habe in der das mit += problemlos geklappt hat,war natürlich ein anderer Zusammenhang,hat mich aber trotzdem stutzig gemacht, dennoch danke,dann sieht das jetzt so aus.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
|
class Marmelade:
step=5
def __init__(self,start,limit): #variable ergänzen,korrigieren
self.start=start
self.limit=limit
def __iter__(self):
return self
def __next__(self,step):
self.run +=self.step #self. ergänzen
if self.run > self.limit:
raise StopIteration
return self.run
jam=Marmelade(32,45)
for i in jam:
print(i,',',end=',')
for i in jam:
print(2*i,',',end=',')
print("Empty!")
|
|
lg
Geschrieben von eulerscheZahl am 26.07.2016 um 06:30:
Das __init__ hättest du aber einfach lassen sollen. Du hast self.run zu self.start gemacht, obwohl später im Code self.run verwendet wird.
Und bei next hast du die Methodensignatur geändert. Wenn sich ein anderer Programmierer darauf verlässt, funktioniert sein Code dann nicht mehr.
Geschrieben von Dr.Java am 27.07.2016 um 22:57:
Ohh, ach so ,jetzt gibt das Programm auch was aus.
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
class Marmelade:
step=5
def __init__(self,run,limit):
self.run=run
self.limit=limit
def __iter__(self):
return self
def __next__(self):
self.run +=self.step
if self.run > self.limit:
raise StopIteration
return self.run
jam=Marmelade(32,45)
for i in jam:
print(i,',',end=',')
for i in jam:
print(2*i,',',end=',')
print("Empty!")
>>>import marmelade
37 ,,84 ,,Empty! |
|
Das wär dann die richtige Ausgabe oder? So oder so, vielen lieben Dank.
lg
Geschrieben von eulerscheZahl am 28.07.2016 um 07:22:
| code: |
1:
|
print(i,',',end=',') |
|
Du hast ein Komma ergänzt, das da nicht stand. Ansonsten hatte ich die selbe Ausgabe.
Geschrieben von Dr.Java am 28.07.2016 um 23:35:
Oh,das muss mir runtergefallen sein,danke dir ,ich habe es entfernt. Nur noch eine letzte Frage. Als Fragestellung wird noch angegeben das die Klasse ein bestimmtes Protokoll implementiert,und wie das dann heißt ,ich werde da aber nicht schlau drauß und kann mir auch nichts darunter vorstellen. Vielen lieben Dank nochmal.
lg
Forensoftware: Burning Board, entwickelt von WoltLab GmbH