Hilfe bei meiner FOR IF Schleife

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.
Peter_77
User
Beiträge: 8
Registriert: Montag 22. September 2014, 11:38

Hallo Forum!
Meine Hausaufgaben habe ich mit MAX und MIN gelöst und Punkte bekommen.

Der Sinn war aber, alle vorgegebenen Zahlen einzeln miteinander zu vergleichen.
Könnt Ihr mir bitte helfen. Ich erkenne meinen Fehler nicht.

Code: Alles auswählen

# sys.version_info(major=3, minor=4, micro=0, releaselevel='final', serial=0)
# Menge der Zahlen
Zahlen = [41, 25, 40, 97, 76, 40, 10, 43]

# Die kleinste gefundene Zahl  Soll 10
kzahl = Zahlen[0]

# Die größte gefundene Zahl Soll 97
gzahl = Zahlen[-1]

# Antworten mit Lücke
Satz1 = ("Die kleinste Zahl ist {} Soll 10 ")
Satz2 = ("und die größte Zahl ist {} Soll 97")

# Antwort mit Ergebnis
a = (Satz1.format(kzahl))
b = (Satz2.format(gzahl))

# Ergebnis als Satz
c = a + b

# Anzahl der Listeneinträge
Menge = len(Zahlen)

			   
# FOR Schleife für Variable kzahl (Kleinste Zahl)
for i in range(0, (len(Zahlen))-1:
    if Zahl <= kzahl:
      Zahl = kzahl
  
print(c)
print("AUS")

Peter
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter_77: Zuerst einmal gibt es einen SyntaxError und wenn Du den behoben hast, einen NameError. Aber wo der ist, sagt Dir schon Python freundlicherweise. Die Ausgabe erzeugt man passenderweise nachdem man das Ergebnis gefunden hat und nicht davor. Etliche Klammern sind überflüssig. Variablennamen sollten etwas aussagen und nicht aus einem Buchstaben oder kryptischen Abkürzungen bestehen.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Es gibt in deinem Programm mehrere Fehler/Probleme:

Du hast in Zeile 27 einen Syntax-Fehler

Code: Alles auswählen

for i in range(0, len(Zahlen)-1):
    ...
wäre richtig, wobei du da auch einfach deine Variable Menge verwenden könntest, die wird nämlich sonst gar nicht benutzt, könnte dann also auch weggelassen werden.

Der nächste Fehler wäre dann, dass er innerhalb der for-Schleife die Variable Zahl nicht kennt. Du willst da eher auf die Listenelemente zugreifen, also Zahlen aufrufen.

Ansonsten funktioniert dein Sortieralgorithmus so nicht. Habt ihr da schon Verfahren kennengelernt? Ansonsten einfach mal nach Bubblesort, Min- oder Maxsort bei Wikipedia suchen, nachvollziehen und in Python umsetzen.

Zeilen 6 und 9 machen nicht das, was du erwartest. in kzahl und gzahl wird die aktuelle Zahl der Liste gespeichert. Wenn sich diese ändert, bekommen kzahl und gzahl davon nichts mit.

Warum sind deine Strings in Tupeln organisiert? Du kannst die Klammern auch weglassen

Variablennamen sind in Python klein zu schreiben, das ist eine Konvention, die man sich angewöhnen sollte.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Code: Alles auswählen

range(0, len(Zahlen)-1)
- diese Konstruktion ist augenscheinlich wenig durchdacht. Zahlen ist eine Liste, warum benutzt dann nicht slices, Stand einen Zweifingerhandstand zu vollführen?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@darktrym: Er will aber eigentlich nicht dieses Konstruktion, denn dann ist der Algorithmus fehlerhaft. `- 1` ist falsch und darum waeren dann auch Slices falsch ;)
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

@cofi: Wieso? Peter_77 hat nicht wirklich spezifiziert, wie er sortieren will, er soll lediglich die Zahlen vergleichen. Bei Bubblesort würde ich so vorgehen (bis zum vorletzen Index). Du kannst ja schlecht über die Elemente der Liste iterieren, wenn sie verändert werden, oder?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@EmaNymton: Man findet trotzdem nicht die kleinste aller Zahlen (was der Kommentar sagt), indem man die letzte Zahl nicht betrachtet. Aus dem Quelltext Bubblesort herauszudeuten finde ich dann doch sehr gewagt.
BlackJack

@EmaNymton: Wo soll denn da sortiert werden? Ich habe die Aufgabe so verstanden das min und max gefunden werden sollen und zwar ohne die Funktionen zu benutzen. Und wahrscheinlich auch ohne `list.sort()` zu benutzen. Also ein (effizientes) `min_max()` selbst implementieren.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Der Sinn war aber, alle vorgegebenen Zahlen einzeln miteinander zu vergleichen.
Das hört sich für mich danach an, dass die Liste sortiert werden soll und dann mit erstem und letzten das kleinste und größte ausgegeben werden soll. Ich hab mir die Aufgabe ja nicht ausgedacht... ;)

Vielleicht warten wir einfach, bis der Threadersteller konkreter wird ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also für mich hört sich das schlicht danach an, dass das Minimum und das Maximum gefunden werden sollen. Dazu muss man ja nichts sortieren; das erhöht die Komplexität ja obendrein - sowohl der Aufgabe als auch des Algorithmus.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Peter_77
User
Beiträge: 8
Registriert: Montag 22. September 2014, 11:38

EmaNymton hat geschrieben:Es gibt in deinem Programm mehrere Fehler/Probleme:

Du hast in Zeile 27 einen Syntax-Fehler

Code: Alles auswählen

for i in range(0, len(Zahlen)-1):
    ...
wäre richtig, wobei du da auch einfach deine Variable Menge verwenden könntest, die wird nämlich sonst gar nicht benutzt, könnte dann also auch weggelassen werden.
Erst mal Danke, dass Du Dir Zeit für meine Probleme genommen hast.
Den Fehler werde ich morgen korrigieren.
Die Variable Menge soll in meiner Endfassung len(Zahlen)-1 ersetzen. Phyton überrascht mich aber immer wieder, dass bei Print(Liste) mal alle korrekten Werte aufgeführt werden, bei fortlaufenden Zahlenkolonnen aber mal der letzte Eintrag fehlt und mal nicht.
Das durchschaue ich noch nicht so ganz.
Der nächste Fehler wäre dann, dass er innerhalb der for-Schleife die Variable Zahl nicht kennt. Du willst da eher auf die Listenelemente zugreifen, also Zahlen aufrufen.

Wie ich die Zahl da reinbekommen sollte, war mir nicht klar.

Ansonsten funktioniert dein Sortieralgorithmus so nicht. Habt ihr da schon Verfahren kennengelernt? Ansonsten einfach mal nach Bubblesort, Min- oder Maxsort bei Wikipedia suchen, nachvollziehen und in Python umsetzen.

Mist. Nein, eigentlich sollen keine Python Verfahren benutzt werden. Es sollen alle Zahlen mit range, if und for miteinander verglichen werden, um die größte und die kleinste Zahl zu finden.

Zeilen 6 und 9 machen nicht das, was du erwartest. in kzahl und gzahl wird die aktuelle Zahl der Liste gespeichert. Wenn sich diese ändert, bekommen kzahl und gzahl davon nichts mit.

Richtig. Das habe ich gemacht, damit der Antwortsatz erst mal funktioniert, obwohl meine Zahlensuche noch nicht funktioniert.
Eigentlich sollen wir die erste Zahl der Liste als Startwert nehmen. Ich habe versucht, den letzten Wert auszuwählen. Meine Überlegung war, dass ich die Länge der Liste nicht brauche, wenn ich von hinten nach vorne arbeite, weil ja nach Zahl0 die Liste am Ende ist. So wollte ich das Programmende erzwingen und nicht in einer Endlosschleife (wegen meiner vielen Fehler) hängenbleiben.


Warum sind deine Strings in Tupeln organisiert? Du kannst die Klammern auch weglassen

Variablennamen sind in Python klein zu schreiben, das ist eine Konvention, die man sich angewöhnen sollte.

Tupeln sagt mir nicht. Werde ich googeln.
Die Variablen schreibt der Professor groß. Nach dem Kurs werde ich das dann abstellen.
Vielen Dank für die vielen Hinweise.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Peter_77 hat geschrieben: Die Variablen schreibt der Professor groß. Nach dem Kurs werde ich das dann abstellen.
OMG :shock: Wie heißt der denn? Dem würd ich gerne mal nen Link zu PEP8 schicken! :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter_77: Keine Sorge, Du verwendest keine Tuple, nur unnötigerweise Klammern. (@EmaNymton: Denn nicht alles was in Klammern geschrieben wird, ist automatisch ein Tuple und auch wenn die Klammern fehlen, so kann man doch ein Tuple erzeugen).
Wenn Du "range" für die Lösung Deines Problems brauchst, dann machst Du etwas falsch. Über Listen wird in Python direkt iteriert und nicht über den Umweg eines Indexes.
Bei Zahlenbereichen ist in Python der Endwert immer exklusiv. Da fehlt also nichts, das ist nur Konvention.
BlackJack

@Peter_77: Ich sehe immer noch nicht so ganz warum man `range()` braucht. Sich diese Indirektion einzuhandeln nur um einen Vergleich pro zu ermittelndem Wert zu sparen lohnt sich einfach nicht.

Und das mit der Grossschreibung kannst Du auch jetzt schon sein lassen. Du ziehst das doch sowieso nicht durch und hast auch klein geschriebene Namen. Da kannst Du Dich auch gleich an den Style Guide for Python Code halten und das gegebenfalls dem Professor sagen, oder es in einem Kommentar als Hinweis schreiben inklusive URL zum Style Guide.
Peter_77
User
Beiträge: 8
Registriert: Montag 22. September 2014, 11:38

EmaNymton hat geschrieben:Es gibt in deinem Programm mehrere Fehler/Probleme:

Der nächste Fehler wäre dann, dass er innerhalb der for-Schleife die Variable Zahl nicht kennt. Du willst da eher auf die Listenelemente zugreifen, also Zahlen aufrufen.

Ansonsten funktioniert dein Sortieralgorithmus so nicht. Habt ihr da schon Verfahren kennengelernt? Ansonsten einfach mal nach Bubblesort, Min- oder Maxsort bei Wikipedia suchen, nachvollziehen und in Python umsetzen.

Zeilen 6 und 9 machen nicht das, was du erwartest. in kzahl und gzahl wird die aktuelle Zahl der Liste gespeichert. Wenn sich diese ändert, bekommen kzahl und gzahl davon nichts mit.



So, nun habe ich Zeit.
Den Syntaxfehler habe ich behoben und in der FOR Schleife Zahl durch i ersetzt. Das läuft nun ohne Fehlermeldung durch.
Zeile 6 ist eine statische Angabe, die die Variable als Zahl definieren soll und verhindert, dass da irgendwas anderes drin steht.

Code: Alles auswählen

# FOR Schleife für Variable kzahl (Kleinste Zahl)
for i in range(0, Menge):
    if i <= kzahl:
      i = kzahl
Eigentlich hätte ich erwartet, dass kzahl überschrieben wird von der FOR Schleife. Also habe ich i = kzahl geändert in kzahl = i.
Das hat aber nichts bewirkt.
Warum kann ich den Wert der Variablen nicht überschreiben?

Sortierverfahren sollen nicht benurzt werden.
Also: Du brauchst zwei Variablen, die einen Anfangswert haben, der "alles" abfängt,
sowohl positive als auch negative Zahlen!
Einfachhalber nimmst du dazu die erste Zahl aus der Liste.
Dann beginnst du mit der Schleife, die natürlich für die Anzalh der Durchläufe
angepasst sein muss, je nachdem wie viel Werte in der Liste stehen,
das variiert nämlich! (range wäre hier das Stichwort!
Dann vergleichst du die erste Zahl mit einer der ersten vorher definierten
Variablen, so lang, bis du das erste Ergebnis (gross oder klein hast).
Dann im nächsten Schritt die umgekehrte Richtung!
Peter
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter_77: das sieht mir ziemlich viel nach Raten und ziemlich wenig nach Nachdenken aus. Du hast in den Zeilen davor schon öfter die =-Operation benutzt, also solltest Du auch wissen was "i = kzahl" und was "kzahl = i" macht.
Wenn Du nicht weißt, was in einer Schleife passiert, dann hilft es oft, sich bei jedem Schleifendurchgang die relevanten Größen ausgeben zu lassen:

Code: Alles auswählen

for i in range(0, Menge):
    print(i, kzahl, i <= kzahl)
    if i <= kzahl:
        kzahl = i
Damit sollte klar werden, wann und wie kzahl überschrieben wird.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

@Peter_77: Ist das die wörtliche Aufgabenstellung? Wenn ja, finde ich sie sehr bedenklich, da wie bereits geschrieben dafür in Python keine Zählschleife (also das iterieren über eine Zahlenliste, die du mit range erzeugst) notwendig ist und man direkt über die Elemente der Liste iterieren kann.

Code: Alles auswählen

for zahl in zahlen:
    print(zahl)
Ich würde die Aufgabe vielleicht mit beiden Varianten lösen (keine Ahnung wie stur dein Prof ist ;)) und darauf hinweisen, dass die Variante mit der Zählschleife in Python nicht sinnvoll/notwendig ist.

@Sirius3: Danke für den Hinweis mit den Tupeln, ich habe bisher fälschlicherweise angenommen, dass ("String") ein Tupel erzeugt, was für mich im Vergleich zu Listen, Dicts und Sets irgendwie intuitiv richtig war. Selbst wieder was gelernt... ;)
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Peter_77 hat geschrieben:

Code: Alles auswählen

# FOR Schleife für Variable kzahl (Kleinste Zahl)
for i in range(0, Menge):
    if i <= kzahl:
      i = kzahl
Eigentlich hätte ich erwartet, dass kzahl überschrieben wird von der FOR Schleife. Also habe ich i = kzahl geändert in kzahl = i.
Das hat aber nichts bewirkt.
Warum kann ich den Wert der Variablen nicht überschreiben?
Du solltest mal in Textform beschreiben was du hier eigentlich tun willst. Es passiert nämlich definitiv nicht das, was du erwartest. Wenn du schon anfängst mit "i = kzahl hat nicht funktioniert, da habe ich dann kzahl = i genommen", dann machst du etwas Grundsätzliches falsch. Programmieren funktioniert nicht indem man Algorithmen oder Befehle rät.

Lass dir doch in der Schleife einfach mal mit print die Werte ausgeben die du da hast.
Peter_77
User
Beiträge: 8
Registriert: Montag 22. September 2014, 11:38

Du solltest mal in Textform beschreiben was du hier eigentlich tun willst. Es passiert nämlich definitiv nicht das, was du erwartest.
Na, versuch ich mal:
Zahlen = [41, 25, 40, 97, 76, 40, 10, 43]
Ist 25 kleiner kzahl, wenn ja, definiere 25 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
Ist 40 kleiner kzahl, wenn ja, definiere 40 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
Ist 97 kleiner kzahl, wenn ja, definiere 97 als kzahl, sonst nehme den nächsten Wert aus der Liste.
Beende den Vorgang, wenn der letzte Wert der Liste ZAHLEN erreicht ist.
usw.

Erklärt das, was ich erreichen will?

Peter
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Peter_77: so kann man die kleinste Zahl finden. Und jetzt vergleich das mit dem, was Du programmiert hast.
Antworten