Hallo,
ich wollte einmal fragen, ob mal so eine Konstruktion in Python machen kann:
def foo():
return 1
bar=foo() || bar=3
print(bar)
Wie wuerde man das schreiben? (weil so wie es da steht, funktioniert es nicht)
Danke und viele Gruesse,
Torres
blubb=function() || blubb = "foo"
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Was soll das Konstrukt denn tun? Ich lese es bisher so: Entweder soll bar an den Rückgabewert von foo gebunden werden oder an 3. Das würde man in Python so schreiben:torres hat geschrieben:Hallo,
ich wollte einmal fragen, ob mal so eine Konstruktion in Python machen kann:
def foo():
return 1
bar=foo() || bar=3
print(bar)
Wie wuerde man das schreiben? (weil so wie es da steht, funktioniert es nicht)
Code: Alles auswählen
In [26]: def foo():
....: return 1
....:
In [27]: bar = foo() or 3
In [28]: bar
Out[28]: 1
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Als Ergänzung: 3 wird genau dann zurueckgegeben, wenn `foo()` zu etwas falschem evaluiert.Hyperion hat geschrieben:Entweder soll bar an den Rückgabewert von foo gebunden werden oder an 3.
Also rueck raus, was du vorhast.
Daneben gibt es Code-Tags ohne die Python-Code zu posten sinnlos ist, da die Einrueckung verloren geht.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Vielen Dank!
Also ich hab damit eigentlich gar nichts vor, es war eine Frage von einem Kollegen,
der sonst nur perl schreibt und ich konnte es nicht beantworten. (ich aergere mich jetzt,
dass ich nicht selbst auf or gekommen bin)
Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin
Viele Gruesse,
Torres
Also ich hab damit eigentlich gar nichts vor, es war eine Frage von einem Kollegen,
der sonst nur perl schreibt und ich konnte es nicht beantworten. (ich aergere mich jetzt,
dass ich nicht selbst auf or gekommen bin)
Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin
Viele Gruesse,
Torres
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Kapiere ich jetzt nicht! Muss doch einen Anwendungsfall geben?!? So eine Frage fällt doch nicht vom Himmel. Nur mit Deinen "Erklärungen" kann ich da jetzt nichts anfangen...torres hat geschrieben: Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Also der Anwendungsfall ist der: es gilt eine Funktion abzufragen, die einen Wert oder nichts zurueckliefert und wie man das nichts in eine Variable schreibt und dabei moeglichst wenig tippt.Hyperion hat geschrieben:Kapiere ich jetzt nicht! Muss doch einen Anwendungsfall geben?!? So eine Frage fällt doch nicht vom Himmel. Nur mit Deinen "Erklärungen" kann ich da jetzt nichts anfangen...torres hat geschrieben: Ich persoenlich haette ein return false in die Funktion eingebaut oder
den Schotter mit einer try except abgefangen, umstaendlich wie ich eben bin
Viele Gruesse,
Torres
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Du meinst eher, wie man anstelle des "nichts" einen default-Wert an einen Namen bindet?torres hat geschrieben: Also der Anwendungsfall ist der: es gilt eine Funktion abzufragen, die einen Wert oder nichts zurueckliefert und wie man das nichts in eine Variable schreibt und dabei moeglichst wenig tippt.
Das was Du grad beschreibst geht nämlich einfach so
Code: Alles auswählen
In [33]: def foo():
....: pass
....:
In [34]: bar = foo()
In [35]: bar
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Sorry, bei dem Beispiel ist mir jetzt nicht klar welchen Wert bar bekommt, wenn foo() nichts liefert.Hyperion hat geschrieben:Du meinst eher, wie man anstelle des "nichts" einen default-Wert an einen Namen bindet?torres hat geschrieben: Also der Anwendungsfall ist der: es gilt eine Funktion abzufragen, die einen Wert oder nichts zurueckliefert und wie man das nichts in eine Variable schreibt und dabei moeglichst wenig tippt.
Das was Du grad beschreibst geht nämlich einfach soCode: Alles auswählen
In [33]: def foo(): ....: pass ....: In [34]: bar = foo() In [35]: bar
ansonsten eben noch so:
bar=3
bar=foo()
torres: Der Standardrückgabewert ist bei Pythons Funktionen immer None. Das heißt, wenn kein expliziter Wert zurückgegeben wurde, wird None zurückgegeben. Statt "pass" hätte da also auch "return None" stehen können. Es hätte keinen Unterschied gemacht.
Code: Alles auswählen
>>> f = None
>>> f or "hallo"
'hallo'
>>> def a():
... return None
...
>>> a()
>>> a() or "hallo"
'hallo'
>>>
@torres: Vergiss das mit dem ``or`` -- das ist ein hässlicher und fehleranfälliger Hack. Der Anwendungsfall ist nichts für Python, denn dort sollte das Ziel nicht sein möglichst wenig zu tippen, sondern lesbaren und verständlichen Quelltext zu schreiben. Das wäre in diesem Falle sowas hier:
Das *funktioniert* im Gegensatz zu diesen schrecklichen ``or``-Geschichten auch mit allen Rückgabewerten.
Code: Alles auswählen
bar = foo()
if bar is None:
bar = 3
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Der tatsächliche Anwendungsfall kam ja auch erst später zur Sprache.BlackJack hat geschrieben: Das *funktioniert* im Gegensatz zu diesen schrecklichen ``or``-Geschichten auch mit allen Rückgabewerten.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Servus,BlackJack hat geschrieben:@torres: Vergiss das mit dem ``or`` -- das ist ein hässlicher und fehleranfälliger Hack. Der Anwendungsfall ist nichts für Python, denn dort sollte das Ziel nicht sein möglichst wenig zu tippen, sondern lesbaren und verständlichen Quelltext zu schreiben. Das wäre in diesem Falle sowas hier:
Das *funktioniert* im Gegensatz zu diesen schrecklichen ``or``-Geschichten auch mit allen Rückgabewerten.Code: Alles auswählen
bar = foo() if bar is None: bar = 3
genauso hatte ich es meinem Kollegen vorgeschlagen, u.a. auch wegen der Lesbarkeit (und weil
ich da etwas paranoid bin); wobei ich allerdings in die Funktion ein return False eingebaut haette. (muss ich zugeben, dass ich von dem None nichts wusste)
Vielen Dank und viele Gruesse,
Torres
Was ist an 'or' hässlich und noch wichtiger: Was ist daran fehleranfällig?BlackJack hat geschrieben:Vergiss das mit dem ``or`` -- das ist ein hässlicher und fehleranfälliger Hack.
Folgende Konstruktionen sehe ich immer wieder, was ist das konkrete Problem dabei?
Code: Alles auswählen
class Upsala(object):
def __init__(self, hopsala=None):
self.hopsala = hopsala or []
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )
Deshalb:
Code: Alles auswählen
>>> cond = True
>>> a = 1
>>> b = 2
>>> cond and a or b
1
>>> cond = False
>>> cond and a or b
2
>>> a = 0
>>> cond = True
>>> cond and a or b
2
@mutetella: Bei dem gezeigten Quelltext mag es kein Problem geben. Man kann halt `hopsala` nichts "falsches" übergeben was nicht durch eine leere Liste ersetzt wird. Zum Beispiel auch keine eigene leere Liste. Dann unterscheidet sich die Semantik subtil:
Code: Alles auswählen
class A(object):
def __init__(self, a=None):
self.a = a or []
class B(object):
def __init__(self, a=None):
self.a = a if a is not None else []
def main():
for c in [A, B]:
xs = list()
obj = c(xs)
xs.append(42)
print xs == obj.a
if __name__ == '__main__':
main()
Ok, herzlichen Dank für Eure Erklärung!
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit )