![]() |
|
#1
|
|||
|
|||
|
hallo zusammen,
Ich stehe mal wieder auf dem schlauch. Mein lehrbuch bietet mir diese methode an: ----zitat---- def intersect(self, *others): res = [] for x in self: for other in others: if x not in other: break # den folgenden indent von else verstehe ich nicht: else: res.append(x) return Set(res) ----ende zitat---- Müsste sich das else nicht auf das vorhergehende if beziehen? Meine version (die auch zu funktionieren scheint) ist so: ----zitat--- def intersect(self, *others): res = [] for x in self: for other in others: if x not in other: break else: res.append(x) return Set(res) ----ende zitat---- Nach meinen tests kann das else ungestraft sogar noch einen indent weiter links stehen. Wie kann das sein? Anmerkung: Ich habe dazu http://www.secnetix.de/olli/Python/b...dentation.hawk gelesen und dort ist es auch merkwürdig: ----zitat---- /* Warning: bogus C code! */ if (some condition) if (another condition) do_something(fancy); else this_sucks(badluck); -----ende zitat---- An diesem negativbeispiel wird erklärt, daß das else irreführend steht, weil es sich auf das nächstgelegene if beziehen muss. Und am ende steht dieses positiv beispiel für python: ---zitat--- >>> if foo: .... if bar: .... x = 42 .... else: .... print foo .... -----ende zitat--- das hat mich endgültig verwirrt. freundliche grüße jan |
|
|
||||
|
||||
|
|
|
#2
|
|||
|
|||
|
Jan-Herbert Damm schrieb:
> hallo zusammen, > > Ich stehe mal wieder auf dem schlauch. > > Mein lehrbuch bietet mir diese methode an: > > ----zitat---- > > def intersect(self, *others): > res = [] > for x in self: > for other in others: > if x not in other: break > # den folgenden indent von else verstehe ich nicht: > else: > res.append(x) > return Set(res) > > ----ende zitat---- > > Müsste sich das else nicht auf das vorhergehende if beziehen? Meine version > (die auch zu funktionieren scheint) ist so: > > ----zitat--- > > def intersect(self, *others): > res = [] > for x in self: > for other in others: > if x not in other: > break > else: > res.append(x) > return Set(res) > > ----ende zitat---- > > Nach meinen tests kann das else ungestraft sogar noch einen indent weiter > links stehen. Wie kann das sein? > > Anmerkung: Ich habe dazu > http://www.secnetix.de/olli/Python/b...dentation.hawk > gelesen und dort ist es auch merkwürdig: > > ----zitat---- > > /* Warning: bogus C code! */ > > if (some condition) > if (another condition) > do_something(fancy); > else > this_sucks(badluck); > > -----ende zitat---- > > An diesem negativbeispiel wird erklärt, daß das else irreführend steht, weil > es sich auf das nächstgelegene if beziehen muss. Und am ende steht dieses > positiv beispiel für python: > > ---zitat--- > >>>> if foo: > ... if bar: > ... x = 42 > ... else: > ... print foo > ... > > -----ende zitat--- > > das hat mich endgültig verwirrt. Tatsaechlich gibt es in Python eine etwas unintuitive, aber durchaus gelegentlich praktische else-Klausel sowohl nach Schleifen, als auch nach try/except-Bloecken. Dabei wird das else dann ausgefuehrt, wenn der Block davor ohne "Probleme" beendet wurde. Im fall einer Schleife, wenn sie "leergelaufen" ist und *nicht* mit einem "break" beendet wurde, und bei try/except wenn keine Exception auftrat. Probier einfach mal folgendes im Interpreter aus: def test(n): for i in xrange(10): if i > n: break else: print "durchgelaufen" test(5) test(100) MfG Diez |
|
#3
|
|||
|
|||
|
Jan-Herbert Damm, 29.10.2009 23:32:
> Und am ende steht dieses positiv beispiel für python: > > >>> if foo: > ... if bar: > ... x = 42 > ... else: > ... print foo Wenn die Einrückung da genauso steht, dann ist das sicherlich kein Positivbeispiel. Aber am Prompt passiert sowas eben schonmal. Stefan |
|
#4
|
|||
|
|||
|
Hallo,
zunächst danke! Diez B. Roggisch <deets*nospam.web.de> schrieb: > Tatsaechlich gibt es in Python eine etwas unintuitive, aber durchaus > gelegentlich praktische else-Klausel sowohl nach Schleifen, als auch > nach try/except-Bloecken. > > Dabei wird das else dann ausgefuehrt, wenn der Block davor ohne > "Probleme" beendet wurde. Im fall einer Schleife, wenn sie > "leergelaufen" ist und *nicht* mit einem "break" beendet wurde, und bei > try/except wenn keine Exception auftrat. > > Probier einfach mal folgendes im Interpreter aus: > > def test(n): > for i in xrange(10): > if i > n: > break > else: > print "durchgelaufen" > > > test(5) > test(100) Ok, bei test(5) zeigt python nichts an, weil "break" gleich beim ersten i in der range feuert. Definitionsgemäß springt er hinter die innerste umgebende schleife, also hinter das else und ist damit schon am ende. Nun meine gegenprobe mit der mir logischer erscheinenden indentierung: In [19]: def test(n): ....: for i in xrange(10): ....: if i > n: ....: break ....: else: ....: print("durchgelaufen") ....: ....: In [20]: test(5) durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen In [21]: test(100) durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen durchgelaufen Ich ahne, daß dieser code etwas ganz anderes aussagt, kann es aber immer noch nicht ganz begreifen. Offenbar ignoriert python hier das "else", denn er erreicht die print-funktion solange das break feuert. gruß jan > > MfG Diez -- I have not failed. I have just found 10,000 ways that won't work. -- Thomas Edison |
|
#5
|
|||
|
|||
|
Jan-Herbert Damm schrieb:
>> def test(n): >> for i in xrange(10): >> if i > n: >> break >> else: >> print "durchgelaufen" >> >> >> test(5) >> test(100) > > Ok, bei test(5) zeigt python nichts an, weil "break" gleich beim ersten i in > der range feuert. Definitionsgemäß springt er hinter die innerste umgebende > schleife, also hinter das else und ist damit schon am ende. Genau. > Nun meine gegenprobe mit der mir logischer erscheinenden indentierung: > > In [19]: def test(n): > ....: for i in xrange(10): > ....: if i > n: > ....: break > ....: else: > ....: print("durchgelaufen") > ....: > ....: Mit der Indentierung hast Du aber auch die Semantik des Programms geändert. Diez' else: gehört zum for, Deins zum if. Das else beim for wird einmal ausgeführt, wenn die for-Schleife durchgelaufen ist (also wenn i immer nur <= n, niemals > n war); das else beim if jedesmal, wenn i <= n ist. Es kommt eben ganz drauf an, was man erreichen will. > Ich ahne, daß dieser code etwas ganz anderes aussagt, kann es aber immer noch > nicht ganz begreifen. Offenbar ignoriert python hier das "else", denn er > erreicht die print-funktion solange das break feuert. Nein, jedesmal, wenn es nicht feuert. Thomas |
|
#6
|
|||
|
|||
|
Danke Thomas,
Thomas Rachel <nutznetz-drei-zweitausendneun*spamschutz.glglgl.net> schrieb: jan: >> Nun meine gegenprobe mit der mir logischer erscheinenden indentierung: > > >> In [19]: def test(n): >> ....: for i in xrange(10): >> ....: if i > n: >> ....: break >> ....: else: >> ....: print("durchgelaufen") >> ....: >> ....: > > Mit der Indentierung hast Du aber auch die Semantik des Programms > geändert. Diez' else: gehört zum for, Deins zum if. Ah, hier lag vermutlich der knoten in meinen gehirnwindungen: ich hatte irgendwie vorausgesetzt, dass else immer nur zu if passt. Dass ein for auch ein else nach sich ziehen kann kam mit nicht in den sinn. > Das else beim for wird einmal ausgeführt, wenn die for-Schleife > durchgelaufen ist (also wenn i immer nur <= n, niemals > n war); das > else beim if jedesmal, wenn i <= n ist. > > Es kommt eben ganz drauf an, was man erreichen will. > >> Ich ahne, daß dieser code etwas ganz anderes aussagt, kann es aber immer noch >> nicht ganz begreifen. Offenbar ignoriert python hier das "else", denn er >> erreicht die print-funktion solange das break feuert. > > Nein, jedesmal, wenn es nicht feuert. ach ja, natürlich. jan |
|
#7
|
|||
|
|||
|
Jan-Herbert Damm schrieb:
>> Mit der Indentierung hast Du aber auch die Semantik des Programms >> geändert. Diez' else: gehört zum for, Deins zum if. > > Ah, hier lag vermutlich der knoten in meinen gehirnwindungen: ich hatte > irgendwie vorausgesetzt, dass else immer nur zu if passt. Dass ein for auch > ein else nach sich ziehen kann kam mit nicht in den sinn. Obwohl Diez es Dir vorher schon verraten hat? ;-) Thomas |
|
|
|
|
![]() |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Erstellt von | Forum | Antworten | Letzter Beitrag |
| Unklarheit innerer/äußerer Rand | Jens | Newsgroup de.comp.text.tex | 2 | 03-17-2009 09:33 AM |
| Unklarheit über SPD-Rauswurf Clements | Willi Lustig | Newsgroup de.soc.politik.misc | 10 | 07-31-2008 06:59 PM |
| Unklarheit bei Veräußerungsverlusten | Horst Stolz | Newsgroup de.soc.recht.steuern+buchfuehrung | 1 | 06-09-2008 03:43 PM |
| Unklarheit bei Kündigungsfrist. Gewerbe. | Andreas Meissner | Newsgroup de.soc.recht.wohnen | 0 | 11-24-2007 12:08 AM |
| Elektronenablenkröhre -- kleine Unklarheit... | Michael Hagedorn | Newsgroup de.sci.physik | 13 | 11-20-2007 08:36 AM |