Forums Neueste Beiträge
 

indent - unklarheit

29/10/2009 - 23:32 von Jan-Herbert Damm | Report spam
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/...ation.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);


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


das hat mich endgültig verwirrt.

freundliche grüße

jan
 

Lesen sie die antworten

#1 Diez B. Roggisch
29/10/2009 - 23:39 | Warnen spam
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/...ation.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);


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


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

Ähnliche fragen