Geschachtelte 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.
Antworten
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hi,

Code: Alles auswählen

print "\tWurst \tBrot \tKetchup\tSenf\tZwiebel"
zaehler = 1

for wurst in [0, 1]:
    for brot in [0, 1]:
        for ketchup in [0, 1]:
            for senf in [0, 1]:
                for zwiebel in [0, 1]:
                    print "#", zaehler, '\t',
                    print wurst, '\t', brot, '\t', ketchup, '\t',
                    print senf, '\t', zwiebel
                    zaehler = zaehler + 1

Könnt Ihr mir Tipps geben, wie ich mir das vorstellen könnte? Und auch wie ich das schriftlich darstellen könnte? Zerbreche mir bei diesem Beispiel den Kopf.

Ich denke man muss einfach jeden Codeblock einzeln ansehen, wie z:b. die ersten zwei: die Wurst Schleife läuft 2 mal, die brot schleife auch 2 mal => 2 * 2 = 4, d.h. der Code unter brot muss mind 4 mal laufen, ab er jetzt kommen ja immer noch for Schlefien. Die ketchup Schleife läuft 2 mal => 2*2*2 = 8 usw.

Was For genau macht, habe ich alles verstanden!
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Na passt doch... und was gibt 2*2*2*2*2 ? genau, das hat dein Zähler am Ende ...

Wieso lässt du den Code nicht einfach mal durch laufen? Oder geht es in der Aufgabe darum, selbst mal den interpreter zu spielen?

Du kannst ja mal auf einem Blatt Schritt für Schritt den Code durcharbeiten und den output immer "malen"

Das ist übrigens eine gute Technik, wenn ein (!) Übungs(trivial-)programm mal nicht macht was es soll.

Du musst halt immer schauen, ob wurst, etc. im Moment bei 0 oder 1 ist.

Er durchläuft einmal jede Schleife für 0. Dann wird die unterste einmal für 1 durchlaufen. Wenn das fertig ist, geht der ganze Spaß von vorne los, dann aber die vorletzte schleife für 1 + die Letzte wiederrum für 0 und 1 durchlaufen.
Also dein Ansatz hat schon gepasst... (soweit ich das sehen kann)

Falls was falsch ist, sofort sagen!

mfg
Zuletzt geändert von HarteWare am Freitag 5. April 2013, 14:13, insgesamt 1-mal geändert.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Mir kommt das alles sehr kompliziert vor. Ich habe es zwar verstanden, jedoch fällt es mir sehr schwer, mir das vorzustellen. Mal sehen, ob ich das praktisch auch kann :)
Oder geht es in der Aufgabe darum, selbst mal den interpreter zu spielen?
Nein, es war nur ein Beispielcode, den ich versuchte zu verstehen.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Wie wäre es denn erst einmal mit einem etwas einfacheren Beispiel:

Code: Alles auswählen

for w in [0, 1]:
    for b in ['a', 'b']:
        print(w, b)
Ausgabe:

Code: Alles auswählen

0 a
0 b
1 a
1 b
Hieran sieht man, die innere Schleife läuft häufiger als die äußere Schleife.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Gary123456 hat geschrieben: Nein, es war nur ein Beispielcode, den ich versuchte zu verstehen.
In dem Fall würde ich das ganze mal durchlaufen lassen und das als Hilfe nehmen... Also man sieht an den 0 und 1 sehr gut, nach welchem Prinzip er die Schleifen durchläuft.

Und weil das eben sich so scher vorzustellen ist, macht man auch in der Praxis keine (vorallem so oft) verzweigten Schleifen :wink: (soweit ich das weiß)

mfg

P.S.: Das Beispiel von xeike ist meiner Meinung nach definitiv besser um das Prinzip zu verstehen.
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

HarteWare hat geschrieben:...macht man auch in der Praxis keine (vorallem so oft) verzweigten Schleifen :wink: (soweit ich das weiß)
:D Man könnte das 8-Damen-Problem (https://de.wikipedia.org/wiki/Damenproblem) mit 8 ineinander verschachtelten Schleifen lösen. :D
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich bin ehrlich: Ich habe keine Ahnung , ob ich das jetzt verstanden habe. Ich hoffe, sowas kommt nicht oft dran, und wenn, mal sehen, ob ich's in der Praxis auch kann! Jetzt zum nächsten Thema 'Listen und Datenstrukturen'.

Danke xeike und HarteWare :)
BlackJack

@xeike: Das würde ich aber auch nicht unbedingt als Problem aus der Praxis sehen. :-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

BlackJack hat geschrieben:@xeike: Das würde ich aber auch nicht unbedingt als Problem aus der Praxis sehen. :-)
Kommt darauf an: wenn man einen Kollegen hat, der solchen Code produziert, dann ist das in der Praxis durchaus ein Problem :-)
Das Leben ist wie ein Tennisball.
BlackJack

@EyDu: :-D

@Gary123456: Für die Praxis hat HarteWare schon recht, dass man tief verschachtelte Strukturen vermeidet, eben weil die schwierig(er) zu verstehen sind. Das macht man oft durch auslagern der tieferen Ebenen in Funktionen, so dass man die Ebenen unabhängig voneinander betrachten und verstehen kann, ohne immer alles auf einmal im Blick haben zu müssen.

Im vorliegenden Fall macht das keinen Sinn weil die Ebenen alle den gleichen Zweck erfüllen. Hier würde man nicht untere Ebenen in Funktionen auslagern, sondern die Funktionalität der Schleifen selbst in eine Funktion stecken, so dass man nur noch eine Schleife benötigt. So eine Funktion gibt es schon in der Standardbibliothek: `itertools.product()`. Somit könnte man die Problemlösung weit weniger verschachtelt wie folgt ausdrücken:

Code: Alles auswählen

#!/usr/bin/env python
from itertools import imap, product


def main():
    ingredients = ['Wurst', 'Brot', 'Ketchup', 'Senf', 'Zwiebel']
    print '\t' + '\t'.join(ingredients)
    for i, values in enumerate(product([0, 1], repeat=len(ingredients)), 1):
        print '#{0}\t{1}'.format(i, '\t'.join(imap(str, values)))


if __name__ == '__main__':
    main()
Diese Lösung hat zusätzlich zu den eingesparten Schleifen auch noch den Vorteil, dass man den Quelltext nicht grundlegend verändern muss, wenn man mehr oder weniger Zutaten darstellen möchte. Es reicht völlig aus die Daten in der `ingredients`-Liste zu verändern.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hi,

Deine Lösung ist zwar viel kürzer, entspricht aber nicht mein derzeitigen Wissenstandes. Ich werde mir das aber zur gegeben Zeit sicher wieder anschauen!
Antworten