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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Anstelle von ``kzahl`` (evtl. eine Abkürzung für "kleinste Zahl"?) würde ich das ja ``minimum`` nennen ;-)

Ich kapiere in Deiner Erklärung nicht, wieso Du mehrfach die Liste durchlaufen willst! Wenn man stets den *bisherigen* kleinsten Wert (aka ``kzahl``) mit dem aktuellen Element der Liste vergleicht und je nach Ergebnis des Vergleichs den Wert beibehält oder den des Listenelements als neues Minimum nimmt, reicht es doch, die Liste *einmal* zu durchlaufen:

Code: Alles auswählen

# Voraussetzung: Mindestens *ein* Element muss in der Liste enthalten sein.
minimum = values[0]
for value in values:
    # hier Vergleich durchführen und ggf. minimum *neu* zuweisen
# nach der Schleife hat man definitiv das Minimum!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Ich denke da steht nicht das die Liste mehrfach durchlaufen werden soll. Es wird nur bei jedem Schritt wieder das Abbruchkriterium für die Schleife genannt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ah... so meinte der OP das :D
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

Hyperion hat geschrieben:Anstelle von ``kzahl`` (evtl. eine Abkürzung für "kleinste Zahl"?) würde ich das ja ``minimum`` nennen ;-)

Ich kapiere in Deiner Erklärung nicht, wieso Du mehrfach die Liste durchlaufen willst! Wenn man stets den *bisherigen* kleinsten Wert (aka ``kzahl``) mit dem aktuellen Element der Liste vergleicht und je nach Ergebnis des Vergleichs den Wert beibehält oder den des Listenelements als neues Minimum nimmt, reicht es doch, die Liste *einmal* zu durchlaufen:

Code: Alles auswählen

# Voraussetzung: Mindestens *ein* Element muss in der Liste enthalten sein.
minimum = values[0]
for value in values:
    # hier Vergleich durchführen und ggf. minimum *neu* zuweisen
# nach der Schleife hat man definitiv das Minimum!
Vielen Dank!
Nun habe ich es hinbekommen.
Mit Print Befehlen für die einzelnen Schritte habe ich dann auch erkannt, dass mein Lösungssatz nach den Schleifen erstellt werden muß.

Nochmals Danke an Alle, die mir geholfen haben.

Gute Nacht
Peter
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Hallo Peter,

Programmieren ist die Kunst, ein großes Problem in mehrere Teilprobleme zu zerlegen, welche ihrerseits möglichst einfach und generell sind. Diese Teilprobleme sollen isoliert überprüfbar sein.

Unittests seien hier wohl der Königsweg, die interaktive Shell ist meiner Meinung nach (gerade zu Beginn) immer noch am zugänglichsten. Mit letzterer kann man Befehle aber auch Bibliotheken einfach ausprobieren.

Im Folgenden, schildere ich Dir nun meine Herangehensweise an Deine Problemstellung. Die Quelltexte sind für Python3.x, welche sich jedoch relativ einfach für Python2.7+ umschreiben lassen. Auf Klassen und die Standardbibliothek habe ich gemäß der Aufgabenstellung verzichtet, auch Funktionen jedoch nicht, da diese meiner Meinung nach die Verständlichkeit verbessern und man um diese auch kurzfristig nicht herum kommt.

Das Grundgerüst

minmax.py

Code: Alles auswählen

#!/usr/bin/env python3

def main():
    print("Hello, World!")

if __name__ == '__main__':
    main()

Quelltext auf Modulebene (sprich: Alles, was nicht in einer Funktion steckt) sollte man nach Möglichkeit verzichten. Ausnahmen sind hier zum Beispiel Konstanten. Hintergrund: Beim Importieren wird dieser ausgeführt. Beim Testen möchte ich jedoch nicht, dass irgendwas ausgeführt wird, auf was ich im Zweifel keine Kontrolle habe.

bad.py

Code: Alles auswählen

#!/usr/bin/env python3

print("A kitten was killed ...")

Code: Alles auswählen

Python 3.2.5 (default, May 15 2013, 23:06:03) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import minmax
>>> minmax.main()
Hello, World!
>>> import bad
A kitten was killed ...
>>>
Devide et impera
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.
Hier erkenne ich zwei Teilprobleme:

1. Den kleinsten von zwei Werten ermitteln
2. Eine Liste von Werten durchlaufen (und erstes Teilproblem anwenden)

Das erste Teilproblem lässt sich kompakt in einer Funktion darstellen:

Code: Alles auswählen

def max_(x, y):
    if x > y: return x
    return y
Diese füge ich meine minmax.py ein, welche nun wie folgt aussieht:

minmax.py

Code: Alles auswählen

#!/usr/bin/env python3

def max_(x, y):
    if x > y: return x
    return y

def main():
    print("Hello, World!")

if __name__ == '__main__':
    main()
Der abschließende Unterstich der Funktion max_ ist dem Umstand geschuldet, dass es bereits eine max-Funktion gibt.

Nun kann die Funktion in der interaktiven Shell getestet werden:

Code: Alles auswählen

>>> import minmax
>>> minmax.max_(3, 4)
4
>>> minmax.max_(-2, 0)
0
Das zweite Teilproblem wurde oben schon angerissen (for-Schleife). Darum möchte ich das hier nur der Vollständigkeit halber aufführen und testen:

Code: Alles auswählen

def maximum(xs):
    if not xs: return None # Eine leere Liste hat kein Maximum.
    accu = xs[0] # Das erste Element der Liste als Zwischenergebnis oder
                 # Endergebnis
    for x in xs:
        accu = max_(accu, x)
        # Es hilft, den Schleifendurchlauf zum Verständnis auf Papier
        # nachzuvollziehen.
    return accu

Code: Alles auswählen

>>> from minmax import maximum
>>> maximum([1, 2, 3, 4])
4
>>> maximum([8, 9, 2, 0, -1])
9
Alles zusammen

Zu guter Letzt müssen noch die Werte aus der Aufgabenstellung, der Funktionsaufruf und die Ausgabe in die main-Funktion eingefügt werden. Die minmax.py sähe nun wie folgt aus:

Code: Alles auswählen

#!/usr/bin/env python3

def max_(x, y):
    if x > y: return x
    return y

def maximum(xs):
    if not xs: return None
    accu = xs[0]
    for x in xs:
        accu = max_(accu, x)
    return accu

def main():
    values = [41, 25, 40, 97, 76, 40, 10, 43]
    msg_max = 'Die größte Zahl ist {} (Soll 97).'
    
    greatest = maximum(values)
    
    print(msg_max.format(greatest))

if __name__ == '__main__':
    main()

Folgede Punkte sind für die Vollständigkeit und für ein besseres Verständnis noch abzuarbeiten:

1. Implementiere eine Funktion min_, welche den kleineren zweier Werte zurück gibt!
2. Implementiere eine Funktion minimum, welche den kleinsten Wert aus einer Liste zurück gibt!
3. Worin unterscheiden sich die Funktionen minimum und maximum? Was folgerst Du daraus?
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten