Warum is das eine Endlosschleife?

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.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Warum is das eine Endlosschleife?

Beitragvon CrackPod » Samstag 15. Juli 2006, 20:48

Code: Alles auswählen

        print 'Suche gestartet. Bitte geben Sie die Kriterien - mit Kommata gertennt - ein, nach denen Sie suchen wollen.'
        print 'Beispiel: Vorname,Nachname'
        print ''
        columns = raw_input('Suchkriterien: ')
        cols = columns.split(',')
        i = 0
        while i in range(len(cols)):
            cols[i].strip
            print cols[i]
Suche gestartet. Bitte geben Sie die Kriterien - mit Kommata gertennt - ein, nach denen Sie suchen wollen.
Beispiel: Vorname,Nachname

Suchkriterien: vorname, nachname
vorname
[...]
vorname
vme
Traceback (most recent call last):
File "Adressenverwaltung.py", line 401, in ?
main()
File "Adressenverwaltung.py", line 398, in main
menu.search()
File "Adressenverwaltung.py", line 356, in search
print cols[i]
KeyboardInterrupt

Irgendwie is das ne Endlosschleife geworden, aber die will ich gar nich haben :D
Was hab ich falsch gemacht? Das sollte doch so stimmen oder?!
Greetz
Zuletzt geändert von CrackPod am Montag 17. Juli 2006, 17:50, insgesamt 1-mal geändert.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Beitragvon DatenMetzgerX » Samstag 15. Juli 2006, 21:36

So geht es

Code: Alles auswählen

print 'Suche gestartet. Bitte geben Sie die Kriterien - mit Kommata gertennt - ein, nach denen Sie suchen wollen.'
print 'Beispiel: Vorname,Nachname'
print ''
columns = raw_input('Suchkriterien: ')
cols = columns.split(',')
#Zuweisung für i nicht nötig
for i in range(len(cols)):    #Forschleife keine Whileschleife
    cols[i].strip()     #KLAMMERN
    print cols[i]   
Zando
User
Beiträge: 37
Registriert: Sonntag 9. Juli 2006, 17:18

Re: Warum is das eine Endlosschleifen?

Beitragvon Zando » Samstag 15. Juli 2006, 21:39

Eine for-Schleife anstatt eine while-Schleife, weil er ja sonst i nicht hochzählt und somit i immer 0 bleibt und der Ausdruck immer wahr bleibt?

So long
Carsten

edit: war jemand schneller :P
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Beitragvon keppla » Samstag 15. Juli 2006, 21:47

um mal den subtilen Unterschied genauer zu beleuchten:

Code: Alles auswählen

while i in range(x):
   pass


bei der while-schleife gilt alles hinter dem while als Bedingung. Wir haben also hier den legalen code

Code: Alles auswählen

i in range(x)

und da du i = 0 zugewiesen hast, ergibt das

Code: Alles auswählen

0 in (0,1,2,3, ... , x)

was logischerweise immer True ist, da 0 ja im tupel (0,1,...x) ist.

bei der for-schleife wird das "in" nicht als Operator eines Ausdrucks (wie oben) interpretiert, sondern als teil des for-syntax (for namen in ausdruck:) interpretiert.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 15. Juli 2006, 22:32

Könnte einer mal den Pythonic-Mode einschalten? Die Schleife schreibt man in Python so:

Code: Alles auswählen

for column in cols:
    column.strip()
    # column ist ein String ist und daher zeigt strip() keine Wirkung
    print column

Vorteil: Nutzt keine sinnlosen, Java/C'esken Zähvariablen sondern iteriert schön über ein Objekt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Beitragvon Masaru » Sonntag 16. Juli 2006, 17:30

Hm ... irgendwas hatte mich auch an dem .strip() gestört, jetzt weiss ichs wieder. So sollte es eigentlich heissen (vorrausgesetzt - wie Leonidas schon angedeutet hat - es handelt sich bei "column" wirklich um String Objekte):

Code: Alles auswählen

for column in cols:
    column = column.strip()
    print column


Die Klassenmethode "strip" ändert nicht permant den eigenen Wert, sondern liefert lediglich den gestrippten Wert zurück.

Wird dieser natürlich nicht in in eine andere Variable (oder über das eigene Objekt) geschrieben, so strippt man lediglich in den freien Raum hinnein ;), jedoch bleiben die vor- und nachlaufenden Leerzeichen weiterhin im Wert des String-Objektes.
CrackPod
User
Beiträge: 205
Registriert: Freitag 30. Juni 2006, 12:56

Beitragvon CrackPod » Sonntag 16. Juli 2006, 19:35

Danke, es geht jetzt.
Ich dachte nur, dass man das bei Listen so ähnlich, wie bei Dictionaries machen muss. ( for value in dic.values(): ) :oops: Hab die Doku auch ewig lange nach einer ähnlichen Methode für Listen durchsucht...

Greetz
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 17. Juli 2006, 12:43

CrackPod hat geschrieben:Ich dachte nur, dass man das bei Listen so ähnlich, wie bei Dictionaries machen muss. ( for value in dic.values():

Wieso so umständlich?

Code: Alles auswählen

d = {'eins': 1, 'zwei': 2}
for key, value in d.items():
    print key, value
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]