Seite 1 von 1

del == del()?

Verfasst: Montag 5. September 2011, 11:31
von Gregorrr
Hallo, ich habe eventuell eine komische Frage, aber ich konnte dazu irgendwie rein gar nichts finden:

Code: Alles auswählen

l = [0.5, 0.7]
del l[0] und del(l[0])
machen das Gleiche. Was ist zu bevorzugen. Bei print ist ja print() wegen der Umstellung zu Python 3 zu bevorzugen. ("Guter Stil?").

Ich konnte del() auch nicht bei den built-ins finden: http://docs.python.org/py3k/library/functions.html

Re: del == del()?

Verfasst: Montag 5. September 2011, 11:43
von DasIch
Lass () bei Statements einfach weg, dass gilt für del übrigens genauso wie für print.

Re: del == del()?

Verfasst: Montag 5. September 2011, 11:57
von cofi
Gregorrr hat geschrieben:Ich konnte del() auch nicht bei den built-ins finden: http://docs.python.org/py3k/library/functions.html
Weil es eben keine Funktion ist, Statements sind in der Sprachreferenz dokumentiert: http://docs.python.org/reference/simple ... n-del_stmt

Bei `print` sollte man wie DasIch schon sagte Klammern auch weglassen. Teste zum Beispiel mal `print 1,2` und `print(1,2)`

Re: del == del()?

Verfasst: Montag 5. September 2011, 12:28
von Gregorrr
cofi hat geschrieben:
Gregorrr hat geschrieben:Ich konnte del() auch nicht bei den built-ins finden: http://docs.python.org/py3k/library/functions.html
Weil es eben keine Funktion ist, Statements sind in der Sprachreferenz dokumentiert: http://docs.python.org/reference/simple ... n-del_stmt

Bei `print` sollte man wie DasIch schon sagte Klammern auch weglassen. Teste zum Beispiel mal `print 1,2` und `print(1,2)`
Ahso. print ist bei dem Wechsel von 2 => 3 von einem Statement zu einer Funktion geworden, deswegen braucht man die runden Klammern in Python 3. del ist aber ein Statement geblieben.

Nun kann man auch z.B. bei return() klammern setzen. Es ist aber keine Funktion, sondern auch ein Statement, d.h. bei Statements am besten die Klammern weglassen.

OK. Vielen Dank für die Antworten!!!

Re: del == del()?

Verfasst: Montag 5. September 2011, 13:12
von pillmuncher
Gregorrr hat geschrieben:Ahso. print ist bei dem Wechsel von 2 => 3 von einem Statement zu einer Funktion geworden, deswegen braucht man die runden Klammern in Python 3. del ist aber ein Statement geblieben.

Nun kann man auch z.B. bei return() klammern setzen. Es ist aber keine Funktion, sondern auch ein Statement, d.h. bei Statements am besten die Klammern weglassen.
Es geht sogar bei if- und while-Statements:

Code: Alles auswählen

if (expr):
    ...

while (expr):
    ...
Der Grund, warum man bei Statements Klammern setzen kann ist, dass runde Klammern um Ausdrücke lediglich der Gruppierung dienen. Wie hier:

Code: Alles auswählen

x = (a + b) * c
Generell hat ein Ausdruck expr denselben Wert wie derselbe Ausdruck in Klammern:

Code: Alles auswählen

assert 1 + 2 == (1 + 2)
Rund Klammern haben aber noch weitere Funktionen: zB. zur Erzeugung von Tupeln:

Code: Alles auswählen

y = (1, 2, 3)
und auch bei der Definition und beim Aufruf von Funktionen:

Code: Alles auswählen

def foo(u, v, w):
    ...

y = foo(7, 8, 9)
Parameter- bzw. Argument-Listen mit weniger oder mehr als einem Argument kann man nicht zusätzlich nochmal einklammern, weil zB.

Code: Alles auswählen

foo(7, 8, 9)
etwas anderes ist, als

Code: Alles auswählen

foo((7, 8, 9))
Im ersten Fall wird eine Funktion mit drei Argumenten aufgerufen, im zweiten Fall wird sie mit nur einem Argument aufgerufen, welches jedoch ein Tuple mit drei Elementen ist.

Re: del == del()?

Verfasst: Montag 5. September 2011, 13:16
von deets
pillmuncher hat geschrieben: Rund Klammern haben aber noch weitere Funktionen: zB. zur Erzeugung von Tupeln:
Nein, haben sie nicht, wie dieses simple Beispiel zeigt:

Code: Alles auswählen

>>> t = 1,
>>> type(t)
<type 'tuple'>
Tupel werden durch Kommata erzeugt. Die Klammern sind nur - wie von dir ja schon richtig bemerkt - disambiguierung notwendig.

Re: del == del()?

Verfasst: Montag 5. September 2011, 14:04
von pillmuncher
deets hat geschrieben:
pillmuncher hat geschrieben: Rund Klammern haben aber noch weitere Funktionen: zB. zur Erzeugung von Tupeln:
Nein, haben sie nicht, [...]
Du hast recht. Allerdings kann man ein leeres Tupel nicht ohne Klammen erzeugen:

Code: Alles auswählen

>>> x = ,
  File "<stdin>", line 1
    x = ,
        ^
SyntaxError: invalid syntax
Gruß,
Mick.

Re: del == del()?

Verfasst: Montag 5. September 2011, 14:24
von DasIch
Leere Tupel sind aber prinzipiell ein Sonderfall und machen semantisch nur ganz selten Sinn.

Re: del == del()?

Verfasst: Montag 5. September 2011, 14:26
von deets
[quote="pillmuncher"][quote="deets"][quote="pillmuncher"]
Du hast recht. Allerdings kann man ein leeres Tupel nicht ohne Klammen erzeugen:

Code: Alles auswählen

>>> x = ,
[/quote][/quote][/quote]

Hach, immer diese Sonderfaelle. Ja, hatte ich vergessen :)

Re: del == del()?

Verfasst: Montag 5. September 2011, 14:42
von lunar
@pillmuncher: Formal ist ein leeres Tupel ein Sonderfall einer parenthesized form, gilt als Literal und kann daher nicht mit einem Komma erzeugt werden (auch nicht mit "(,)").

Re: del == del()?

Verfasst: Dienstag 6. September 2011, 10:13
von Gregorrr
Danke für die ausführlichen Antworten!

Re: del == del()?

Verfasst: Dienstag 6. September 2011, 20:37
von bords0
@pillmuncher: hinter del steht keine expression, sondern eine target_list. Die erlaubt zwar "zufällig" auch Klammern (runde und eckige), das hat aber nichts mit Ausdrücken zu tun.

Re: del == del()?

Verfasst: Dienstag 6. September 2011, 21:39
von pillmuncher
bords0 hat geschrieben:@pillmuncher: hinter del steht keine expression, sondern eine target_list. Die erlaubt zwar "zufällig" auch Klammern (runde und eckige), das hat aber nichts mit Ausdrücken zu tun.
Du hast recht. Hier der Link der alles erklärt. Es wäre auch nicht gar sinnvoll, den Wert von Ausdrücken zu löschen:

Code: Alles auswählen

>>> del 1 + 2
  File "<stdin>", line 1
SyntaxError: can't delete operator
>>> def foo():
...     return 7
...
>>> del foo()
  File "<stdin>", line 1
SyntaxError: can't delete function call
Gruß,
Mick.