del == del()?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gregorrr
User
Beiträge: 22
Registriert: Montag 25. Juli 2011, 21:55

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Lass () bei Statements einfach weg, dass gilt für del übrigens genauso wie für print.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)`
Gregorrr
User
Beiträge: 22
Registriert: Montag 25. Juli 2011, 21:55

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!!!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Leere Tupel sind aber prinzipiell ein Sonderfall und machen semantisch nur ganz selten Sinn.
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 :)
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 "(,)").
Zuletzt geändert von lunar am Dienstag 6. September 2011, 10:21, insgesamt 1-mal geändert.
Gregorrr
User
Beiträge: 22
Registriert: Montag 25. Juli 2011, 21:55

Danke für die ausführlichen Antworten!
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

@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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Antworten