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/block_indentation.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
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
Wenn die Einrᅵckung da genauso steht, dann ist das sicherlich kein
Positivbeispiel. Aber am Prompt passiert sowas eben schonmal.
Stefan
zunächst danke!
Diez B. Roggisch <de...@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
>> 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
Thomas Rachel <nutznetz-drei-...@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
>> 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