Seite 1 von 1

Warum is das eine Endlosschleife?

Verfasst: Samstag 15. Juli 2006, 20:48
von CrackPod

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
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

Verfasst: Samstag 15. Juli 2006, 21:36
von DatenMetzgerX
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]   

Re: Warum is das eine Endlosschleifen?

Verfasst: Samstag 15. Juli 2006, 21:39
von Zando
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

Verfasst: Samstag 15. Juli 2006, 21:47
von keppla
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.

Verfasst: Samstag 15. Juli 2006, 22:32
von Leonidas
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.

Verfasst: Sonntag 16. Juli 2006, 17:30
von Masaru
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.

Verfasst: Sonntag 16. Juli 2006, 19:35
von CrackPod
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

Verfasst: Montag 17. Juli 2006, 12:43
von Leonidas
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